diff --git a/Cargo.toml b/Cargo.toml index 27fcb1b59..6e4967028 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,7 +64,7 @@ query-grammar = { version = "0.25.0", path = "./query-grammar", package = "tanti tantivy-bitpacker = { version = "0.9", path = "./bitpacker" } common = { version = "0.10", path = "./common/", package = "tantivy-common" } tokenizer-api = { version = "0.6", path = "./tokenizer-api", package = "tantivy-tokenizer-api" } -sketches-ddsketch = { version = "0.3.0", features = ["use_serde"] } +sketches-ddsketch = { git = "https://github.com/quickwit-oss/rust-sketches-ddsketch.git", rev = "555caf1", features = ["use_serde"] } datasketches = "0.2.0" futures-util = { version = "0.3.28", optional = true } futures-channel = { version = "0.3.28", optional = true } diff --git a/src/aggregation/metric/percentiles.rs b/src/aggregation/metric/percentiles.rs index ff9de45f1..3cca86996 100644 --- a/src/aggregation/metric/percentiles.rs +++ b/src/aggregation/metric/percentiles.rs @@ -222,6 +222,12 @@ impl PercentilesCollector { self.sketch.add(val); } + /// Encode the underlying DDSketch to Java-compatible binary format + /// for cross-language serialization with Java consumers. + pub fn to_sketch_bytes(&self) -> Vec { + self.sketch.to_java_bytes() + } + pub(crate) fn merge_fruits(&mut self, right: PercentilesCollector) -> crate::Result<()> { self.sketch.merge(&right.sketch).map_err(|err| { TantivyError::AggregationError(AggregationError::InternalError(format!( @@ -325,7 +331,7 @@ mod tests { use crate::aggregation::AggregationCollector; use crate::query::AllQuery; use crate::schema::{Schema, FAST}; - use crate::Index; + use crate::{assert_nearly_equals, Index}; #[test] fn test_aggregation_percentiles_empty_index() -> crate::Result<()> { @@ -608,12 +614,16 @@ mod tests { let res = exec_request_with_query(agg_req, &index, None)?; assert_eq!(res["range_with_stats"]["buckets"][0]["doc_count"], 3); - assert_eq!( - res["range_with_stats"]["buckets"][0]["percentiles"]["values"]["1.0"], + assert_nearly_equals!( + res["range_with_stats"]["buckets"][0]["percentiles"]["values"]["1.0"] + .as_f64() + .unwrap(), 5.0028295751107414 ); - assert_eq!( - res["range_with_stats"]["buckets"][0]["percentiles"]["values"]["99.0"], + assert_nearly_equals!( + res["range_with_stats"]["buckets"][0]["percentiles"]["values"]["99.0"] + .as_f64() + .unwrap(), 10.07469668951144 ); @@ -659,8 +669,14 @@ mod tests { let res = exec_request_with_query(agg_req, &index, None)?; - assert_eq!(res["percentiles"]["values"]["1.0"], 5.0028295751107414); - assert_eq!(res["percentiles"]["values"]["99.0"], 10.07469668951144); + assert_nearly_equals!( + res["percentiles"]["values"]["1.0"].as_f64().unwrap(), + 5.0028295751107414 + ); + assert_nearly_equals!( + res["percentiles"]["values"]["99.0"].as_f64().unwrap(), + 10.07469668951144 + ); Ok(()) }