@@ -552,95 +552,87 @@ impl GroveDbOp {
552
552
}
553
553
554
554
/// Verify consistency of operations
555
- pub fn verify_consistency_of_operations ( ops : & Vec < GroveDbOp > ) -> GroveDbOpConsistencyResults {
556
- let ops_len = ops. len ( ) ;
555
+ pub fn verify_consistency_of_operations ( ops : & [ GroveDbOp ] ) -> GroveDbOpConsistencyResults {
557
556
// operations should not have any duplicates
558
557
let mut repeated_ops = vec ! [ ] ;
559
- for ( i, op) in ops. iter ( ) . enumerate ( ) {
560
- if i == ops_len {
561
- continue ;
562
- } // Don't do last one
558
+ let mut same_path_key_ops = vec ! [ ] ;
559
+ // Exclude the last item
560
+ for ( i, op) in ops. iter ( ) . take ( ops. len ( ) - 1 ) . enumerate ( ) {
563
561
let count = ops
564
562
. split_at ( i + 1 )
565
563
. 1
566
564
. iter ( )
567
565
. filter ( |& current_op| current_op == op)
568
566
. count ( ) as u16 ;
569
567
if count > 1 {
570
- repeated_ops. push ( ( op. clone ( ) , count) ) ;
568
+ repeated_ops. push ( ( op, count) ) ;
571
569
}
572
- }
573
570
574
- let mut same_path_key_ops = vec ! [ ] ;
575
-
576
- // No double insert or delete of same key in same path
577
- for ( i, op) in ops. iter ( ) . enumerate ( ) {
578
- if i == ops_len {
579
- continue ;
580
- } // Don't do last one
571
+ // No double insert or delete of same key in same path
581
572
let mut doubled_ops = ops
582
573
. split_at ( i + 1 )
583
574
. 1
584
575
. iter ( )
585
576
. filter_map ( |current_op| {
586
577
if current_op. path == op. path && current_op. key == op. key {
587
- Some ( current_op. op . clone ( ) )
578
+ Some ( & current_op. op )
588
579
} else {
589
580
None
590
581
}
591
582
} )
592
- . collect :: < Vec < Op > > ( ) ;
583
+ . collect :: < Vec < & Op > > ( ) ;
593
584
if !doubled_ops. is_empty ( ) {
594
- doubled_ops. push ( op. op . clone ( ) ) ;
595
- same_path_key_ops. push ( ( op. path . clone ( ) , op. key . clone ( ) , doubled_ops) ) ;
585
+ doubled_ops. push ( & op. op ) ;
586
+ same_path_key_ops. push ( ( & op. path , & op. key , doubled_ops) ) ;
596
587
}
597
588
}
598
589
599
590
let inserts = ops
600
591
. iter ( )
601
592
. filter_map ( |current_op| match current_op. op {
602
- Op :: Insert { .. } | Op :: Replace { .. } => Some ( current_op. clone ( ) ) ,
593
+ Op :: Insert { .. } | Op :: Replace { .. } => Some ( current_op) ,
603
594
_ => None ,
604
595
} )
605
- . collect :: < Vec < GroveDbOp > > ( ) ;
596
+ . collect :: < Vec < & GroveDbOp > > ( ) ;
606
597
607
598
let deletes = ops
608
599
. iter ( )
609
600
. filter_map ( |current_op| {
610
601
if let Op :: Delete = current_op. op {
611
- Some ( current_op. clone ( ) )
602
+ Some ( current_op)
612
603
} else {
613
604
None
614
605
}
615
606
} )
616
- . collect :: < Vec < GroveDbOp > > ( ) ;
617
-
618
- let mut insert_ops_below_deleted_ops = vec ! [ ] ;
607
+ . collect :: < Vec < & GroveDbOp > > ( ) ;
619
608
620
- // No inserts under a deleted path
621
- for deleted_op in deletes. iter ( ) {
622
- let mut deleted_qualified_path = deleted_op. path . clone ( ) ;
623
- deleted_qualified_path. push ( deleted_op. key . clone ( ) ) ;
624
- let inserts_with_deleted_ops_above = inserts
625
- . iter ( )
626
- . filter_map ( |inserted_op| {
627
- if deleted_op. path . len ( ) < inserted_op. path . len ( )
628
- && deleted_qualified_path
629
- . iterator ( )
630
- . zip ( inserted_op. path . iterator ( ) )
631
- . all ( |( a, b) | a == b)
632
- {
633
- Some ( inserted_op. clone ( ) )
634
- } else {
635
- None
636
- }
637
- } )
638
- . collect :: < Vec < GroveDbOp > > ( ) ;
639
- if !inserts_with_deleted_ops_above. is_empty ( ) {
640
- insert_ops_below_deleted_ops
641
- . push ( ( deleted_op. clone ( ) , inserts_with_deleted_ops_above) ) ;
642
- }
643
- }
609
+ let insert_ops_below_deleted_ops = deletes
610
+ . iter ( )
611
+ . filter_map ( |& deleted_op| {
612
+ let mut deleted_qualified_path = deleted_op. path . clone ( ) ;
613
+ deleted_qualified_path. push ( deleted_op. key . clone ( ) ) ;
614
+ let inserts_with_deleted_ops_above = inserts
615
+ . iter ( )
616
+ . filter_map ( |& inserted_op| {
617
+ if deleted_op. path . len ( ) < inserted_op. path . len ( )
618
+ && deleted_qualified_path
619
+ . iterator ( )
620
+ . zip ( inserted_op. path . iterator ( ) )
621
+ . all ( |( a, b) | a == b)
622
+ {
623
+ Some ( inserted_op)
624
+ } else {
625
+ None
626
+ }
627
+ } )
628
+ . collect :: < Vec < & GroveDbOp > > ( ) ;
629
+ if !inserts_with_deleted_ops_above. is_empty ( ) {
630
+ Some ( ( deleted_op, inserts_with_deleted_ops_above) )
631
+ } else {
632
+ None
633
+ }
634
+ } )
635
+ . collect :: < Vec < ( & GroveDbOp , Vec < & GroveDbOp > ) > > ( ) ;
644
636
645
637
GroveDbOpConsistencyResults {
646
638
repeated_ops,
@@ -652,14 +644,16 @@ impl GroveDbOp {
652
644
653
645
/// Results of a consistency check on an operation batch
654
646
#[ derive( Debug ) ]
655
- pub struct GroveDbOpConsistencyResults {
656
- repeated_ops : Vec < ( GroveDbOp , u16 ) > , // the u16 is count
657
- same_path_key_ops : Vec < ( KeyInfoPath , KeyInfo , Vec < Op > ) > ,
658
- insert_ops_below_deleted_ops : Vec < ( GroveDbOp , Vec < GroveDbOp > ) > , /* the deleted op first,
659
- * then inserts under */
647
+ pub struct GroveDbOpConsistencyResults < ' a > {
648
+ repeated_ops : Vec < ( & ' a GroveDbOp , u16 ) > , // the u16 is count
649
+ same_path_key_ops : Vec < ( & ' a KeyInfoPath , & ' a KeyInfo , Vec < & ' a Op > ) > ,
650
+ insert_ops_below_deleted_ops : Vec < ( & ' a GroveDbOp , Vec < & ' a GroveDbOp > ) > , /* the deleted op
651
+ * first,
652
+ * then inserts
653
+ * under */
660
654
}
661
655
662
- impl GroveDbOpConsistencyResults {
656
+ impl GroveDbOpConsistencyResults < ' _ > {
663
657
/// Check if results are empty
664
658
pub fn is_empty ( & self ) -> bool {
665
659
self . repeated_ops . is_empty ( )
0 commit comments