Skip to content

Commit 6ebe7bb

Browse files
Ensure we test multiple merge_sketch implementations
1 parent 4da5d2c commit 6ebe7bb

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

crates/udd-sketch/src/lib.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)