diff --git a/datasketches/src/theta/sketch.rs b/datasketches/src/theta/sketch.rs index c304784..fdba5fe 100644 --- a/datasketches/src/theta/sketch.rs +++ b/datasketches/src/theta/sketch.rs @@ -246,7 +246,7 @@ impl ThetaSketch { pub fn compact(&self, ordered: bool) -> CompactThetaSketch { let mut entries: Vec = self.iter().collect(); - let empty = entries.is_empty(); + let empty = self.is_empty(); let theta = if empty { // Match Java's correctThetaOnCompact() behavior for never-updated sketches // initialized with p < 1.0. diff --git a/datasketches/tests/theta_sketch_test.rs b/datasketches/tests/theta_sketch_test.rs index f245d5f..73045cd 100644 --- a/datasketches/tests/theta_sketch_test.rs +++ b/datasketches/tests/theta_sketch_test.rs @@ -260,3 +260,31 @@ fn test_bounds_empty_estimation_mode() { assert_eq!(sketch.lower_bound(NumStdDev::One), 0.0); assert_eq!(sketch.upper_bound(NumStdDev::One), 0.0); } + +#[test] +fn test_compact_preserves_logical_non_empty_after_screened_update() { + let screened_value = (0u64..) + .find(|candidate| { + let mut sketch = ThetaSketch::builder() + .lg_k(12) + .sampling_probability(0.5) + .build(); + sketch.update(*candidate); + !sketch.is_empty() && sketch.num_retained() == 0 + }) + .expect("failed to find a value screened out by the sampling theta"); + + let mut sketch = ThetaSketch::builder() + .lg_k(12) + .sampling_probability(0.5) + .build(); + sketch.update(screened_value); + + assert!(!sketch.is_empty()); + assert_eq!(sketch.num_retained(), 0); + + let compact = sketch.compact(false); + assert!(!compact.is_empty()); + assert_eq!(compact.num_retained(), 0); + assert_eq!(compact.theta64(), sketch.theta64()); +}