@@ -563,6 +563,35 @@ mod tests {
563563 assert_eq ! ( sketch. max_error( ) , a2) ;
564564 }
565565
566+ /// We create this `merge_verifier` so that every test we run also tests
567+ /// the multiple implementations we have for merging sketches.
568+ /// It is a drop-in replacement for `merge_sketches`, with additional asserts.
569+ fn merge_verifier ( sketch : & mut UDDSketch , other : & UDDSketch ) {
570+ let mut second = sketch. clone ( ) ;
571+
572+ sketch. merge_sketch ( other) ;
573+
574+ let mut keys = Vec :: with_capacity ( other. num_values as usize ) ;
575+ let mut counts = Vec :: with_capacity ( other. num_values as usize ) ;
576+ for ( key, count) in other. buckets . iter ( ) {
577+ keys. push ( key) ;
578+ counts. push ( count) ;
579+ }
580+
581+ let metadata = UDDSketchMetadata {
582+ max_buckets : other. max_buckets as u32 ,
583+ current_error : other. alpha ,
584+ compactions : other. compactions ,
585+ values : other. num_values ,
586+ sum : other. values_sum ,
587+ } ;
588+
589+ second. merge_items ( & metadata, keys. into_iter ( ) , counts. into_iter ( ) ) ;
590+
591+ // Both methods should result in the same end result.
592+ assert_eq ! ( * sketch, second) ;
593+ }
594+
566595 #[ test]
567596 fn merge_sketches ( ) {
568597 let a1 = 0.1 ; // alpha for up to 20 buckets
@@ -590,7 +619,7 @@ mod tests {
590619
591620 assert_eq ! ( sketch2. max_error( ) , a1) ;
592621
593- sketch1 . merge_sketch ( & sketch2) ;
622+ merge_verifier ( & mut sketch1 , & sketch2) ;
594623 assert_eq ! ( sketch1. count( ) , 10 ) ;
595624 assert_eq ! ( sketch1. max_error( ) , a1) ;
596625
@@ -603,7 +632,7 @@ mod tests {
603632
604633 assert_eq ! ( sketch3. max_error( ) , a1) ;
605634
606- sketch1 . merge_sketch ( & sketch3) ;
635+ merge_verifier ( & mut sketch1 , & sketch3) ;
607636 assert_eq ! ( sketch1. count( ) , 15 ) ;
608637 assert_eq ! ( sketch1. max_error( ) , a1) ;
609638
@@ -620,7 +649,8 @@ mod tests {
620649
621650 assert_eq ! ( sketch4. max_error( ) , a1) ;
622651
623- sketch1. merge_sketch ( & sketch4) ;
652+ merge_verifier ( & mut sketch1, & sketch4) ;
653+
624654 assert_eq ! ( sketch1. count( ) , 24 ) ;
625655 assert_eq ! ( sketch1. max_error( ) , a2) ;
626656
@@ -631,7 +661,8 @@ mod tests {
631661
632662 assert_eq ! ( sketch5. max_error( ) , a4) ;
633663
634- sketch1. merge_sketch ( & sketch5) ;
664+ merge_verifier ( & mut sketch1, & sketch5) ;
665+
635666 assert_eq ! ( sketch1. count( ) , 144 ) ;
636667 assert_eq ! ( sketch1. max_error( ) , a5) ; // Note that each compaction doesn't always result in half the numbers of buckets, hence a5 here instead of a4
637668 }
0 commit comments