@@ -53,8 +53,8 @@ use std::sync::{Arc, Mutex};
5353use std:: time:: { Duration , Instant } ;
5454
5555use crate :: relational_queries:: {
56- ConflictingEntitiesData , ConflictingEntitiesQuery , FindChangesQuery , FindDerivedQuery ,
57- FindPossibleDeletionsQuery , ReturnedEntityData ,
56+ ConflictingEntitiesData , ConflictingEntitiesQuery , EntityDataExt , FindChangesQuery ,
57+ FindDerivedQuery , FindPossibleDeletionsQuery , ReturnedEntityData ,
5858} ;
5959use crate :: {
6060 primary:: { Namespace , Site } ,
@@ -529,28 +529,85 @@ impl Layout {
529529 et_map. insert ( et. to_string ( ) , Arc :: new ( et) ) ;
530530 }
531531 let mut entities: BTreeMap < BlockNumber , Vec < EntityWithType > > = BTreeMap :: new ( ) ;
532- if let Some ( vec ) = FindRangeQuery :: new ( & tables, false , block_range)
533- . get_results :: < EntityData > ( conn)
532+ let lower_vec = FindRangeQuery :: new ( & tables, false , block_range. clone ( ) )
533+ . get_results :: < EntityDataExt > ( conn)
534534 . optional ( ) ?
535- {
536- // TODO: issue query with upper range and find modifictions and deletions
537- for e in vec {
538- let block = e. clone ( ) . deserialize_block_number :: < Entity > ( ) ?;
539- let entity_type = e. entity_type ( & self . input_schema ) ;
540- let entity = e. deserialize_with_layout :: < Entity > ( self , None ) ?;
541- let entity_op = EntitySubgraphOperation :: Create ;
542- let ewt = EntityWithType {
543- entity_op,
544- entity_type,
545- entity,
546- } ;
547- match entities. get_mut ( & block) {
548- Some ( vec) => vec. push ( ewt) ,
549- None => {
550- let _ = entities. insert ( block, vec ! [ ewt] ) ;
535+ . unwrap_or_default ( ) ;
536+ let upper_vec = FindRangeQuery :: new ( & tables, true , block_range)
537+ . get_results :: < EntityDataExt > ( conn)
538+ . optional ( ) ?
539+ . unwrap_or_default ( ) ;
540+ let mut lower_iter = lower_vec. iter ( ) . fuse ( ) . peekable ( ) ;
541+ let mut upper_iter = upper_vec. iter ( ) . fuse ( ) . peekable ( ) ;
542+ let mut lower_now = lower_iter. next ( ) ;
543+ let mut upper_now = upper_iter. next ( ) ;
544+ let mut lower = lower_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
545+ let mut upper = upper_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
546+ let transform = |ede : EntityDataExt ,
547+ entity_op : EntitySubgraphOperation |
548+ -> Result < ( EntityWithType , BlockNumber ) , StoreError > {
549+ let e = EntityData :: new ( ede. entity , ede. data ) ;
550+ let block = ede. block_number ;
551+ let entity_type = e. entity_type ( & self . input_schema ) ;
552+ let entity = e. deserialize_with_layout :: < Entity > ( self , None ) ?;
553+ let ewt = EntityWithType {
554+ entity_op,
555+ entity_type,
556+ entity,
557+ } ;
558+ Ok ( ( ewt, block) )
559+ } ;
560+ while lower_now. is_some ( ) || upper_now. is_some ( ) {
561+ let ( ewt, block) = if lower_now. is_some ( ) {
562+ if upper_now. is_some ( ) {
563+ if lower > upper {
564+ // we have upper bound at this block, but no lower bounds at the same block so it's deletion
565+ let ( ewt, block) = transform ( upper, EntitySubgraphOperation :: Delete ) ?;
566+ // advance upper
567+ upper_now = upper_iter. next ( ) ;
568+ upper = upper_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
569+ ( ewt, block)
570+ } else if lower < upper {
571+ // we have lower bound at this block but no upper bound at the same block so its creation
572+ let ( ewt, block) = transform ( lower, EntitySubgraphOperation :: Create ) ?;
573+ // advance lower
574+ lower_now = lower_iter. next ( ) ;
575+ lower = lower_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
576+ ( ewt, block)
577+ } else {
578+ assert ! ( upper == lower) ;
579+ let ( ewt, block) = transform ( lower, EntitySubgraphOperation :: Modify ) ?;
580+ // advance both
581+ lower_now = lower_iter. next ( ) ;
582+ lower = lower_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
583+ upper_now = upper_iter. next ( ) ;
584+ upper = upper_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
585+ ( ewt, block)
551586 }
552- } ;
553- }
587+ } else {
588+ // we have lower bound at this block but no upper bound at the same block so its creation
589+ let ( ewt, block) = transform ( lower, EntitySubgraphOperation :: Create ) ?;
590+ // advance lower
591+ lower_now = lower_iter. next ( ) ;
592+ lower = lower_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
593+ ( ewt, block)
594+ }
595+ } else {
596+ // we have upper bound at this block, but no lower bounds at all so it's deletion
597+ assert ! ( upper_now. is_some( ) ) ;
598+ let ( ewt, block) = transform ( upper, EntitySubgraphOperation :: Delete ) ?;
599+ // advance upper
600+ upper_now = upper_iter. next ( ) ;
601+ upper = upper_now. unwrap_or ( & EntityDataExt :: default ( ) ) . clone ( ) ;
602+ ( ewt, block)
603+ } ;
604+
605+ match entities. get_mut ( & block) {
606+ Some ( vec) => vec. push ( ewt) ,
607+ None => {
608+ let _ = entities. insert ( block, vec ! [ ewt] ) ;
609+ }
610+ } ;
554611 }
555612 Ok ( entities)
556613 }
0 commit comments