@@ -29,7 +29,6 @@ pub use hypersync_net_types as net_types;
2929pub use hypersync_schema as schema;
3030
3131use parse_response:: parse_query_response;
32- use simple_types:: Event ;
3332use tokio:: sync:: mpsc;
3433use types:: { EventResponse , ResponseData } ;
3534use url:: Url ;
@@ -41,6 +40,8 @@ pub use decode::Decoder;
4140pub use decode_call:: CallDecoder ;
4241pub use types:: { ArrowBatch , ArrowResponse , ArrowResponseData , QueryResponse } ;
4342
43+ use crate :: simple_types:: InternalEventJoinStrategy ;
44+
4445type ArrowChunk = Chunk < Box < dyn Array > > ;
4546
4647/// Internal client to handle http requests and retries.
@@ -151,7 +152,8 @@ impl Client {
151152 ) -> Result < EventResponse > {
152153 check_simple_stream_params ( & config) ?;
153154
154- add_event_join_fields_to_selection ( & mut query) ;
155+ let event_join_strategy = InternalEventJoinStrategy :: from ( & query. field_selection ) ;
156+ event_join_strategy. add_join_fields_to_selection ( & mut query. field_selection ) ;
155157
156158 let mut recv = stream:: stream_arrow ( self , query, config)
157159 . await
@@ -165,9 +167,9 @@ impl Client {
165167 while let Some ( res) = recv. recv ( ) . await {
166168 let res = res. context ( "get response" ) ?;
167169 let res: QueryResponse = QueryResponse :: from ( & res) ;
168- let events: Vec < Event > = res. data . into ( ) ;
170+ let events = event_join_strategy . join_from_response_data ( res. data ) ;
169171
170- data. push ( events) ;
172+ data. extend ( events) ;
171173
172174 archive_height = res. archive_height ;
173175 next_block = res. next_block ;
@@ -306,10 +308,9 @@ impl Client {
306308 Ok ( res) => return Ok ( res) ,
307309 Err ( e) => {
308310 log:: error!(
309- "failed to get chain_id from server, retrying... The error was: {:?}" ,
310- e
311+ "failed to get chain_id from server, retrying... The error was: {e:?}"
311312 ) ;
312- err = err. context ( format ! ( "{:?}" , e ) ) ;
313+ err = err. context ( format ! ( "{e :?}" ) ) ;
313314 }
314315 }
315316
@@ -338,10 +339,9 @@ impl Client {
338339 Ok ( res) => return Ok ( res) ,
339340 Err ( e) => {
340341 log:: error!(
341- "failed to get height from server, retrying... The error was: {:?}" ,
342- e
342+ "failed to get height from server, retrying... The error was: {e:?}"
343343 ) ;
344- err = err. context ( format ! ( "{:?}" , e ) ) ;
344+ err = err. context ( format ! ( "{e :?}" ) ) ;
345345 }
346346 }
347347
@@ -374,9 +374,13 @@ impl Client {
374374 /// Add block, transaction and log fields selection to the query, executes it with retries
375375 /// and returns the response.
376376 pub async fn get_events ( & self , mut query : Query ) -> Result < EventResponse > {
377- add_event_join_fields_to_selection ( & mut query) ;
377+ let event_join_strategy = InternalEventJoinStrategy :: from ( & query. field_selection ) ;
378+ event_join_strategy. add_join_fields_to_selection ( & mut query. field_selection ) ;
378379 let arrow_response = self . get_arrow ( & query) . await . context ( "get data" ) ?;
379- Ok ( EventResponse :: from ( & arrow_response) )
380+ Ok ( EventResponse :: from_arrow_response (
381+ & arrow_response,
382+ & event_join_strategy,
383+ ) )
380384 }
381385
382386 /// Executes query once and returns the result in (Arrow, size) format.
@@ -430,10 +434,9 @@ impl Client {
430434 Ok ( res) => return Ok ( res) ,
431435 Err ( e) => {
432436 log:: error!(
433- "failed to get arrow data from server, retrying... The error was: {:?}" ,
434- e
437+ "failed to get arrow data from server, retrying... The error was: {e:?}"
435438 ) ;
436- err = err. context ( format ! ( "{:?}" , e ) ) ;
439+ err = err. context ( format ! ( "{e :?}" ) ) ;
437440 }
438441 }
439442
@@ -493,7 +496,9 @@ impl Client {
493496 ) -> Result < mpsc:: Receiver < Result < EventResponse > > > {
494497 check_simple_stream_params ( & config) ?;
495498
496- add_event_join_fields_to_selection ( & mut query) ;
499+ let event_join_strategy = InternalEventJoinStrategy :: from ( & query. field_selection ) ;
500+
501+ event_join_strategy. add_join_fields_to_selection ( & mut query. field_selection ) ;
497502
498503 let ( tx, rx) : ( _ , mpsc:: Receiver < Result < EventResponse > > ) =
499504 mpsc:: channel ( config. concurrency . unwrap_or ( 10 ) ) ;
@@ -507,7 +512,9 @@ impl Client {
507512 while let Some ( resp) = inner_rx. recv ( ) . await {
508513 let is_err = resp. is_err ( ) ;
509514 if tx
510- . send ( resp. map ( |r| EventResponse :: from ( & r) ) )
515+ . send (
516+ resp. map ( |r| EventResponse :: from_arrow_response ( & r, & event_join_strategy) ) ,
517+ )
511518 . await
512519 . is_err ( )
513520 || is_err
@@ -551,29 +558,3 @@ fn check_simple_stream_params(config: &StreamConfig) -> Result<()> {
551558
552559 Ok ( ( ) )
553560}
554-
555- fn add_event_join_fields_to_selection ( query : & mut Query ) {
556- // Field lists for implementing event based API, these fields are used for joining
557- // so they should always be added to the field selection.
558- const BLOCK_JOIN_FIELDS : & [ & str ] = & [ "number" ] ;
559- const TX_JOIN_FIELDS : & [ & str ] = & [ "hash" ] ;
560- const LOG_JOIN_FIELDS : & [ & str ] = & [ "transaction_hash" , "block_number" ] ;
561-
562- if !query. field_selection . block . is_empty ( ) {
563- for field in BLOCK_JOIN_FIELDS . iter ( ) {
564- query. field_selection . block . insert ( field. to_string ( ) ) ;
565- }
566- }
567-
568- if !query. field_selection . transaction . is_empty ( ) {
569- for field in TX_JOIN_FIELDS . iter ( ) {
570- query. field_selection . transaction . insert ( field. to_string ( ) ) ;
571- }
572- }
573-
574- if !query. field_selection . log . is_empty ( ) {
575- for field in LOG_JOIN_FIELDS . iter ( ) {
576- query. field_selection . log . insert ( field. to_string ( ) ) ;
577- }
578- }
579- }
0 commit comments