diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/cardinality.rs b/crates/asap-aware-mapping/src/accuracy/estimators/cardinality.rs index 8830be744..c53a3b5a1 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/cardinality.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/cardinality.rs @@ -4,7 +4,7 @@ use super::*; pub(super) fn guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { let (SketchParams::Kmv { k } | SketchParams::Theta { k }) = params else { return None; diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/cms.rs b/crates/asap-aware-mapping/src/accuracy/estimators/cms.rs index 692e418ad..46559358d 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/cms.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/cms.rs @@ -4,7 +4,7 @@ use super::*; pub(super) fn guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { let (SketchParams::Cms { width, depth } | SketchParams::CmsWithHeap { width, depth, .. }) = params @@ -51,7 +51,7 @@ mod tests { SketchKind::new(SketchAlgorithm::Cms, params), GroupingStrategy::default(), ), - &SketchQuery::Cardinality, + &SketchStatistic::Cardinality, ) .unwrap(); assert_eq!(g.metric, ErrorMetric::Frequency); @@ -78,7 +78,7 @@ mod tests { SketchKind::new(SketchAlgorithm::CmsWithHeap, cms_heap), GroupingStrategy::default(), ), - &SketchQuery::TopK { k: 10 }, + &SketchStatistic::TopK { k: 10 }, ) .expect("heap sketch still provides per-key frequency intervals"); assert_eq!(topk_frequency.metric, ErrorMetric::Frequency); diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/count_sketch.rs b/crates/asap-aware-mapping/src/accuracy/estimators/count_sketch.rs index bba46f5d7..c95059637 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/count_sketch.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/count_sketch.rs @@ -4,7 +4,7 @@ use super::*; pub(super) fn guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { let (SketchParams::CountSketch { width, depth } | SketchParams::CountSketchWithHeap { width, depth, .. }) = params @@ -66,7 +66,7 @@ mod tests { SketchKind::new(SketchAlgorithm::CountSketch, count_sketch), GroupingStrategy::default(), ), - &SketchQuery::PointCount { + &SketchStatistic::PointCount { key: asap_types::pre_asap::expr_ir::ColumnRef::SampleValue, value: None, }, diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/ddsketch.rs b/crates/asap-aware-mapping/src/accuracy/estimators/ddsketch.rs index 233ec255e..c7be9ed3e 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/ddsketch.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/ddsketch.rs @@ -4,7 +4,7 @@ use super::*; pub(super) fn guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { let SketchParams::DDSketch { alpha } = params else { return None; diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/hll.rs b/crates/asap-aware-mapping/src/accuracy/estimators/hll.rs index ec5913a32..4431a4118 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/hll.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/hll.rs @@ -9,7 +9,7 @@ use super::*; pub(super) fn generic_guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { let SketchParams::Hll { precision } = params else { return None; @@ -241,7 +241,7 @@ mod tests { SketchKind::new(SketchAlgorithm::Hll, params), GroupingStrategy::default(), ), - &SketchQuery::Cardinality, + &SketchStatistic::Cardinality, ) .unwrap(); assert_eq!(g.metric, ErrorMetric::Cardinality); diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/kll.rs b/crates/asap-aware-mapping/src/accuracy/estimators/kll.rs index f9932526a..4cfe6f073 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/kll.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/kll.rs @@ -4,7 +4,7 @@ use super::*; pub(super) fn guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { let SketchParams::Kll { k } = params else { return None; @@ -53,7 +53,7 @@ mod tests { SketchKind::new(SketchAlgorithm::Kll, params), GroupingStrategy::default(), ), - &SketchQuery::Quantile { q: 0.99 }, + &SketchStatistic::Quantile { q: 0.99 }, ) .unwrap(); assert_eq!(g.metric, ErrorMetric::Rank); diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/mod.rs b/crates/asap-aware-mapping/src/accuracy/estimators/mod.rs index 2731e0097..4eabf40be 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/mod.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/mod.rs @@ -14,7 +14,7 @@ pub mod univmon; pub(super) fn sketch_guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { match params { SketchParams::Kll { .. } => kll::guarantee(algorithm, params, query), @@ -36,7 +36,7 @@ pub(super) fn sketch_guarantee( fn bounded_guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, metric: ErrorMetric, bound: f64, delta: ProbabilityExpr, @@ -57,7 +57,7 @@ fn bounded_guarantee( pub(super) fn local_guarantee( family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { match family { FieldDataType::Plain(_) => Some(ResultGuarantee::exact("Plain value")), @@ -196,9 +196,9 @@ impl AccuracyModel for EstimatorAccuracy<'_> { fn local_guarantee( &self, family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { - if let (Some(_), FieldDataType::Sketch(kind, grouping), SketchQuery::Cardinality) = + if let (Some(_), FieldDataType::Sketch(kind, grouping), SketchStatistic::Cardinality) = (self.contract, family, query) { if let (SketchAlgorithm::Hll, SketchParams::Hll { precision }) = diff --git a/crates/asap-aware-mapping/src/accuracy/estimators/univmon.rs b/crates/asap-aware-mapping/src/accuracy/estimators/univmon.rs index e832fd1a1..297cf53d3 100644 --- a/crates/asap-aware-mapping/src/accuracy/estimators/univmon.rs +++ b/crates/asap-aware-mapping/src/accuracy/estimators/univmon.rs @@ -1,8 +1,8 @@ //! UnivMon currently certifies only its exact unit-update total readout. use super::*; -pub(super) fn guarantee(query: &SketchQuery) -> Option { - matches!(query, SketchQuery::PointCount { value: None, .. }) +pub(super) fn guarantee(query: &SketchStatistic) -> Option { + matches!(query, SketchStatistic::PointCount { value: None, .. }) .then(|| ResultGuarantee::exact("univmon_unit_update_total")) } diff --git a/crates/asap-aware-mapping/src/accuracy/evidence.rs b/crates/asap-aware-mapping/src/accuracy/evidence.rs index 6ca296cfd..6391c746e 100644 --- a/crates/asap-aware-mapping/src/accuracy/evidence.rs +++ b/crates/asap-aware-mapping/src/accuracy/evidence.rs @@ -119,7 +119,7 @@ pub trait AccuracyEvidenceProvider { &self, _op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&SketchQuery>, + _query: Option<&SketchStatistic>, ) -> PropagationStats { PropagationStats::default() } @@ -143,7 +143,7 @@ impl AccuracyEvidenceProvider for WorkloadAccuracyEvidence<'_> { &self, _op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&SketchQuery>, + _query: Option<&SketchStatistic>, ) -> PropagationStats { PropagationStats { input_row_count: self.data.input_cardinality.value_at(self.now_ms).copied(), diff --git a/crates/asap-aware-mapping/src/accuracy/mod.rs b/crates/asap-aware-mapping/src/accuracy/mod.rs index 1451dd382..9026de468 100644 --- a/crates/asap-aware-mapping/src/accuracy/mod.rs +++ b/crates/asap-aware-mapping/src/accuracy/mod.rs @@ -22,7 +22,8 @@ pub use evidence::{ use asap_types::post_asap::{ AccuracyError, BoundExpr, CompositionOperator, ErrorMetric, ExactOperation, FieldDataType, - GuaranteeSource, ProbabilityExpr, ResultGuarantee, SketchAlgorithm, SketchParams, SketchQuery, + GuaranteeSource, ProbabilityExpr, ResultGuarantee, SketchAlgorithm, SketchParams, + SketchStatistic, }; use asap_types::types::AccuracyTarget; @@ -48,7 +49,7 @@ pub trait AccuracyModel { fn local_guarantee( &self, family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option; /// Compose `inputs`' guarantees (in the parent's child order) with the @@ -81,7 +82,7 @@ impl DefaultAccuracyModel { pub fn sketch_guarantee( algorithm: &SketchAlgorithm, params: &SketchParams, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { estimators::sketch_guarantee(algorithm, params, query) } @@ -94,7 +95,7 @@ impl AccuracyModel for DefaultAccuracyModel { fn local_guarantee( &self, family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { estimators::local_guarantee(family, query) } diff --git a/crates/asap-aware-mapping/src/cost_model.rs b/crates/asap-aware-mapping/src/cost_model.rs index d434efbe9..0315e88f1 100644 --- a/crates/asap-aware-mapping/src/cost_model.rs +++ b/crates/asap-aware-mapping/src/cost_model.rs @@ -50,7 +50,7 @@ use std::rc::Rc; use asap_types::post_asap::{ ExactOperation, FieldDataType, GroupingStrategy, HydraParams, ResultGuarantee, SketchAlgorithm, - SketchParams, SketchQuery, SummaryExpr, SummaryMaintenanceLifecycleGuarantee, SummaryNode, + SketchParams, SketchStatistic, SummaryExpr, SummaryMaintenanceLifecycleGuarantee, SummaryNode, SummaryWindowFramework, }; use asap_types::pre_asap::agg_intent::AggIntent; @@ -550,7 +550,7 @@ pub trait CostModel { /// [`realize_extension`](Self::realize_extension). Only ever called /// when `realize_extension` returned `Sketch` for the same /// `(ext_kind, payload)` — `replacement::readout` has no other way to build a - /// `SketchQuery` for a shape core doesn't know. A deployment that + /// `SketchStatistic` for a shape core doesn't know. A deployment that /// overrides `realize_extension` to return `Sketch` for some /// `ext_kind` MUST also override this for that same `ext_kind`, or /// this default panics loudly (rather than silently misinterpreting @@ -560,7 +560,7 @@ pub trait CostModel { ext_kind: &str, _payload: &serde_json::Value, _col: &ColumnRef, - ) -> SketchQuery { + ) -> SketchStatistic { unimplemented!( "CostModel::realize_extension returned Sketch for ext_kind={ext_kind:?} but \ readout_extension wasn't overridden to match" diff --git a/crates/asap-aware-mapping/src/grouping.rs b/crates/asap-aware-mapping/src/grouping.rs index 247472ed9..fc4abfe62 100644 --- a/crates/asap-aware-mapping/src/grouping.rs +++ b/crates/asap-aware-mapping/src/grouping.rs @@ -673,7 +673,7 @@ mod tests { &self, _op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&asap_types::post_asap::SketchQuery>, + _query: Option<&asap_types::post_asap::SketchStatistic>, ) -> PropagationStats { PropagationStats { hydra_shared_grid_collision_bound: Some(0.0), @@ -717,7 +717,7 @@ mod tests { &self, _op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&asap_types::post_asap::SketchQuery>, + _query: Option<&asap_types::post_asap::SketchStatistic>, ) -> PropagationStats { PropagationStats { hydra_shared_grid_failure_probability: Some(1.5), @@ -763,7 +763,7 @@ mod tests { &self, _op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&asap_types::post_asap::SketchQuery>, + _query: Option<&asap_types::post_asap::SketchStatistic>, ) -> PropagationStats { PropagationStats { hydra_shared_grid_collision_bound: Some(0.1), diff --git a/crates/asap-aware-mapping/src/maintained_population.rs b/crates/asap-aware-mapping/src/maintained_population.rs index 99960dd08..4764212f3 100644 --- a/crates/asap-aware-mapping/src/maintained_population.rs +++ b/crates/asap-aware-mapping/src/maintained_population.rs @@ -23,7 +23,9 @@ fn strip_projection(mut root: &QueryExpr) -> &QueryExpr { root } -fn recognize(root: &QueryExpr) -> Option<(MaintainedPopulation, PopulationReadout, Rc)> { +fn recognize( + root: &QueryExpr, +) -> Option<(MaintainedPopulation, PopulationStatistic, Rc)> { let root = strip_projection(root); let (source, grouping, readout, value_column) = match root { QueryExpr::Aggregate { @@ -42,12 +44,12 @@ fn recognize(root: &QueryExpr) -> Option<(MaintainedPopulation, PopulationReadou } let (col, readout) = match intent { AggIntent::Quantile { q, col, .. } if q.is_finite() => { - (*col, PopulationReadout::Quantile { q: *q }) + (*col, PopulationStatistic::Quantile { q: *q }) } - AggIntent::TopK { k, .. } => (None, PopulationReadout::TopK { k: *k }), - AggIntent::Sum { col } => (*col, PopulationReadout::Sum), - AggIntent::Count { .. } => (None, PopulationReadout::Count), - AggIntent::Avg { col } => (*col, PopulationReadout::Average), + AggIntent::TopK { k, .. } => (None, PopulationStatistic::TopK { k: *k }), + AggIntent::Sum { col } => (*col, PopulationStatistic::Sum), + AggIntent::Count { .. } => (None, PopulationStatistic::Count), + AggIntent::Avg { col } => (*col, PopulationStatistic::Average), _ => return None, }; let schema = child.output_schema().ok()?; @@ -81,7 +83,7 @@ fn recognize(root: &QueryExpr) -> Option<(MaintainedPopulation, PopulationReadou ( child, partition_by, - PopulationReadout::TopK { k: *n }, + PopulationStatistic::TopK { k: *n }, Some(*col), ) } @@ -237,11 +239,13 @@ impl MaintainedPopulationStrategy { if let Some((p, r, _)) = recognize(other) { if p == identity { match r { - PopulationReadout::Quantile { .. } => population.quantiles = true, - PopulationReadout::TopK { k } => population.max_k = population.max_k.max(k), - PopulationReadout::Sum - | PopulationReadout::Count - | PopulationReadout::Average => {} + PopulationStatistic::Quantile { .. } => population.quantiles = true, + PopulationStatistic::TopK { k } => { + population.max_k = population.max_k.max(k) + } + PopulationStatistic::Sum + | PopulationStatistic::Count + | PopulationStatistic::Average => {} } } } @@ -469,7 +473,7 @@ mod tests { unreachable!() }; *operation = ValueOperation::ReadPopulation { - readout: PopulationReadout::TopK { k: 6 }, + readout: PopulationStatistic::TopK { k: 6 }, }; assert!(compile_post_asap_dag(&Rc::new(bad.clone())).is_err()); let SummaryExpr::ValueOperation { @@ -479,7 +483,7 @@ mod tests { unreachable!() }; *operation = ValueOperation::ReadPopulation { - readout: PopulationReadout::TopK { k: 5 }, + readout: PopulationStatistic::TopK { k: 5 }, }; let producer = Rc::make_mut(child); let SummaryExpr::ValueOperation { diff --git a/crates/asap-aware-mapping/src/replacement.rs b/crates/asap-aware-mapping/src/replacement.rs index 32c6d1123..44ffef189 100644 --- a/crates/asap-aware-mapping/src/replacement.rs +++ b/crates/asap-aware-mapping/src/replacement.rs @@ -353,7 +353,7 @@ use asap_types::post_asap::{ ExactOperationSchemaError, ExactParams, ExecutionDataState, ExecutionDataStateError, ExecutionTiming, Field, FieldDataType, GroupingStrategy, NonNegativeWeightProof, SamplingKind, SamplingParams, Schema, SketchAlgorithm, SketchKind, SketchParams, - SketchQuery as PostAsapSketchQuery, StatModelKind, StatModelParams, SummaryExpr, + SketchStatistic as PostAsapSketchStatistic, StatModelKind, StatModelParams, SummaryExpr, SummaryInputExpr, SummaryNode, SummaryUpdate, ValueOperation, WaveletKind, WaveletParams, WeightDomain, }; @@ -2257,7 +2257,7 @@ fn ddsketch_ratio_operand_target(target: &AccuracyTarget) -> Option Option { let SummaryExpr::SummaryEstimate { summary_input, - query: PostAsapSketchQuery::Quantile { .. }, + query: PostAsapSketchStatistic::Quantile { .. }, } = &node.expr else { return None; @@ -2874,7 +2874,7 @@ fn construct_summary_agg( | SketchParams::CountSketchWithHeap { heap_size, .. } => *heap_size, _ => unreachable!(), }; - return PostAsapSketchQuery::TopK { + return PostAsapSketchStatistic::TopK { k: capacity as usize, }; } @@ -3534,7 +3534,7 @@ fn schema_column_ref(child: &QueryExpr, index: usize) -> Option { /// exact child) — unknown, never exact. fn compose_guarantee( family: &FieldDataType, - query: Option<&PostAsapSketchQuery>, + query: Option<&PostAsapSketchStatistic>, child: &SummaryNode, intent: &AggIntent, accuracy: &dyn AccuracyModel, @@ -3566,7 +3566,7 @@ fn compose_guarantee( ) } (_, Some(query)) => ( - if matches!(query, PostAsapSketchQuery::TopK { .. }) { + if matches!(query, PostAsapSketchStatistic::TopK { .. }) { CompositionOperator::TopKSelection } else { CompositionOperator::ApproximateAggregate @@ -3690,14 +3690,14 @@ fn readout( intent: &AggIntent, input: &SummaryUpdate, cost_model: &dyn CostModel, -) -> PostAsapSketchQuery { +) -> PostAsapSketchStatistic { match intent { - AggIntent::Quantile { q, .. } => PostAsapSketchQuery::Quantile { q: *q }, - AggIntent::Cardinality { .. } => PostAsapSketchQuery::Cardinality, - AggIntent::FrequencyL2 { .. } => PostAsapSketchQuery::FrequencyL2, - AggIntent::FrequencyEntropy { .. } => PostAsapSketchQuery::FrequencyEntropy, - AggIntent::TopK { k, .. } => PostAsapSketchQuery::TopK { k: *k }, - AggIntent::Count { .. } => PostAsapSketchQuery::PointCount { + AggIntent::Quantile { q, .. } => PostAsapSketchStatistic::Quantile { q: *q }, + AggIntent::Cardinality { .. } => PostAsapSketchStatistic::Cardinality, + AggIntent::FrequencyL2 { .. } => PostAsapSketchStatistic::FrequencyL2, + AggIntent::FrequencyEntropy { .. } => PostAsapSketchStatistic::FrequencyEntropy, + AggIntent::TopK { k, .. } => PostAsapSketchStatistic::TopK { k: *k }, + AggIntent::Count { .. } => PostAsapSketchStatistic::PointCount { key: match &input.weight { SummaryInputExpr::Column(col) => col.clone(), SummaryInputExpr::Constant(1.0) => ColumnRef::SampleValue, @@ -9849,7 +9849,7 @@ mod tests { else { panic!("expected SummaryEstimate root, got {:?}", root.expr); }; - assert!(matches!(query, PostAsapSketchQuery::Quantile { q } if *q == 0.99)); + assert!(matches!(query, PostAsapSketchStatistic::Quantile { q } if *q == 0.99)); // Estimate edge: plain row shape — group key + Float64 answer. assert_eq!( field(&root.schema, "quantile_0_99").dtype, @@ -9954,7 +9954,7 @@ mod tests { /// intent as a real sketch instead of the default `PassThrough` (issue /// #150) — `realizations_for_intent` must consult `realize_extension` /// for the `Extension` arm, and `readout` must consult - /// `readout_extension` to build its `SketchQuery` without panicking. + /// `readout_extension` to build its `SketchStatistic` without panicking. struct FrequencyCostModel; impl CostModel for FrequencyCostModel { @@ -9985,10 +9985,10 @@ mod tests { ext_kind: &str, payload: &serde_json::Value, _col: &ColumnRef, - ) -> PostAsapSketchQuery { + ) -> PostAsapSketchStatistic { assert_eq!(ext_kind, "frequency"); let value = payload["item"].as_str().map(str::to_string); - PostAsapSketchQuery::PointCount { + PostAsapSketchStatistic::PointCount { key: ColumnRef::Named("item".into()), value, } @@ -10027,7 +10027,7 @@ mod tests { }; assert!(matches!( query, - PostAsapSketchQuery::PointCount { key: ColumnRef::Named(k), value: Some(v) } + PostAsapSketchStatistic::PointCount { key: ColumnRef::Named(k), value: Some(v) } if k == "item" && v == "checkout" )); @@ -10375,7 +10375,7 @@ mod tests { &self, op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&PostAsapSketchQuery>, + _query: Option<&PostAsapSketchStatistic>, ) -> PropagationStats { if matches!(op, CompositionOperator::TopKSelection) { PropagationStats { @@ -10470,7 +10470,7 @@ mod tests { else { panic!("expected Top-K readout") }; - assert!(matches!(query, PostAsapSketchQuery::TopK { k: 10 })); + assert!(matches!(query, PostAsapSketchStatistic::TopK { k: 10 })); let SummaryExpr::SummaryAgg { child, family, @@ -10546,7 +10546,7 @@ mod tests { else { panic!("expected Top-K readout") }; - assert!(matches!(query, PostAsapSketchQuery::TopK { k: 5 })); + assert!(matches!(query, PostAsapSketchStatistic::TopK { k: 5 })); let SummaryExpr::SummaryAgg { child, input, .. } = &summary_input.expr else { panic!("expected fused summary aggregation") }; @@ -10767,7 +10767,7 @@ mod tests { fn local_guarantee( &self, family: &FieldDataType, - query: &PostAsapSketchQuery, + query: &PostAsapSketchStatistic, ) -> Option { DefaultAccuracyModel.local_guarantee(family, query) } diff --git a/crates/asap-aware-mapping/src/summary_maintenance_cost/model.rs b/crates/asap-aware-mapping/src/summary_maintenance_cost/model.rs index 00e2ce705..331b7e1a5 100644 --- a/crates/asap-aware-mapping/src/summary_maintenance_cost/model.rs +++ b/crates/asap-aware-mapping/src/summary_maintenance_cost/model.rs @@ -3076,7 +3076,7 @@ mod tests { Rc::new(SummaryNode { expr: SummaryExpr::SummaryEstimate { summary_input: root, - query: asap_types::post_asap::SketchQuery::PointCount { + query: asap_types::post_asap::SketchStatistic::PointCount { key: ColumnRef::Wildcard, value: None, }, @@ -3117,7 +3117,7 @@ mod tests { Rc::new(SummaryNode { expr: SummaryExpr::SummaryEstimate { summary_input: join, - query: asap_types::post_asap::SketchQuery::PointCount { + query: asap_types::post_asap::SketchStatistic::PointCount { key: ColumnRef::Wildcard, value: None, }, diff --git a/crates/asap-physical-operators/src/capability.rs b/crates/asap-physical-operators/src/capability.rs index 459371dbd..5ed1c5501 100644 --- a/crates/asap-physical-operators/src/capability.rs +++ b/crates/asap-physical-operators/src/capability.rs @@ -11,7 +11,7 @@ use crate::Error; use planner_types::post_asap::{ ExactKind, ExactParams, FieldDataType, GroupingStrategy, SketchAlgorithm, SketchParams, - SketchQuery, SummaryUpdate, + SketchStatistic, SummaryUpdate, }; /// Check the same contract used by `create_planner_accumulator` before a plan @@ -185,14 +185,18 @@ pub fn validate_native_family(family: &FieldDataType) -> Result<(), Error> { } /// A sketch readout is native only for the families Planner can read directly. -pub fn validate_sketch_readout(family: &FieldDataType, query: &SketchQuery) -> Result<(), Error> { +pub fn validate_sketch_readout( + family: &FieldDataType, + query: &SketchStatistic, +) -> Result<(), Error> { validate_native_family(family)?; use planner_types::post_asap::SketchAlgorithm as A; // A point count without an item value reads the total count. - let bare_count = matches!(query, SketchQuery::PointCount { value: None, .. }); + let bare_count = matches!(query, SketchStatistic::PointCount { value: None, .. }); let supported = match family { FieldDataType::Sketch(kind, _) => match (kind.algorithm(), query) { - (A::Kll, SketchQuery::Quantile { q }) | (A::DDSketch, SketchQuery::Quantile { q }) => { + (A::Kll, SketchStatistic::Quantile { q }) + | (A::DDSketch, SketchStatistic::Quantile { q }) => { if !(0.0..=1.0).contains(q) { return Err(Error::Invalid( "quantile readout requires quantile in [0,1]".into(), @@ -201,7 +205,7 @@ pub fn validate_sketch_readout(family: &FieldDataType, query: &SketchQuery) -> R true } (A::DDSketch, _) => bare_count, - (A::Hll, SketchQuery::Cardinality) => true, + (A::Hll, SketchStatistic::Cardinality) => true, (A::Hll, _) => bare_count, // Only count intents read a Count-Min bare count, and their // updates have unit weight; the readout is typed Int64 on that basis. diff --git a/crates/asap-physical-operators/src/operators/summary/mod.rs b/crates/asap-physical-operators/src/operators/summary/mod.rs index 00a4d0b19..90cc2c724 100644 --- a/crates/asap-physical-operators/src/operators/summary/mod.rs +++ b/crates/asap-physical-operators/src/operators/summary/mod.rs @@ -2,7 +2,7 @@ use super::*; /// A summary readout: a sketch query, or an exact readout with typed parameters. #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] pub enum ReadoutQuery { - Sketch(planner_types::post_asap::SketchQuery), + Sketch(planner_types::post_asap::SketchStatistic), Exact(crate::summary_kernels::exact::ExactReadout), } @@ -215,7 +215,7 @@ fn integral_count(family: &FieldDataType, query: &ReadoutQuery) -> bool { if kind.algorithm() == &planner_types::post_asap::SketchAlgorithm::Cms) && matches!( query, - ReadoutQuery::Sketch(planner_types::post_asap::SketchQuery::PointCount { + ReadoutQuery::Sketch(planner_types::post_asap::SketchStatistic::PointCount { value: None, .. }) diff --git a/crates/asap-physical-operators/src/physical_planner/mod.rs b/crates/asap-physical-operators/src/physical_planner/mod.rs index 71a3eb351..e1490c03c 100644 --- a/crates/asap-physical-operators/src/physical_planner/mod.rs +++ b/crates/asap-physical-operators/src/physical_planner/mod.rs @@ -11,7 +11,7 @@ use crate::{ use planner_types::{ post_asap::{ ExactOperation, FieldDataType, PostAsapDAG, PostAsapDAGNode, - PostAsapOperatorPayload as Payload, SketchQuery, SummaryInputExpr, ValueOperation, + PostAsapOperatorPayload as Payload, SketchStatistic, SummaryInputExpr, ValueOperation, }, pre_asap::{ AggIntent, ColumnRef, CompareOpKind, DataType, GroupKeys, QueryExpr, @@ -341,7 +341,7 @@ fn compile_internal( } = &node.payload { use planner_types::post_asap::maintained_population::{ - PopulationInput, PopulationReadout, + PopulationInput, PopulationStatistic, }; let [producer] = inputs.as_slice() else { return Err(invalid("population readout requires one input")); @@ -363,7 +363,7 @@ fn compile_internal( )); } let input = schemas[0].clone(); - let PopulationReadout::TopK { k } = readout else { + let PopulationStatistic::TopK { k } = readout else { let mut chain = row_values::population_aggregate(&input, &spec.grouping, readout)?; let last = chain.pop().expect("nonempty chain"); @@ -623,11 +623,11 @@ fn temporal_readout_drops_name(node: &PostAsapDAGNode) -> bool { Payload::Value { operation: ValueOperation::FinalizeExactAccumulator } | Payload::SummaryEstimate { - query: SketchQuery::Quantile { .. } - | SketchQuery::Cardinality - | SketchQuery::PointCount { .. } - | SketchQuery::FrequencyL2 - | SketchQuery::FrequencyEntropy + query: SketchStatistic::Quantile { .. } + | SketchStatistic::Cardinality + | SketchStatistic::PointCount { .. } + | SketchStatistic::FrequencyL2 + | SketchStatistic::FrequencyEntropy } ) } @@ -944,7 +944,7 @@ fn bind_operation(node: &PostAsapDAGNode, inputs: &[SchemaRef]) -> Result { - if let SketchQuery::TopK { k } = query { + if let SketchStatistic::TopK { k } = query { return Operator::keyed_readout( input.clone(), summary_column(input)?, diff --git a/crates/asap-physical-operators/src/physical_planner/promql_rows.rs b/crates/asap-physical-operators/src/physical_planner/promql_rows.rs index 106f4a522..f3082927b 100644 --- a/crates/asap-physical-operators/src/physical_planner/promql_rows.rs +++ b/crates/asap-physical-operators/src/physical_planner/promql_rows.rs @@ -79,7 +79,7 @@ pub fn compile_current_series_readout( selected: &Rc, ) -> Result { use planner_types::post_asap::{ - compile_post_asap_dag, maintained_population::PopulationReadout, Field, + compile_post_asap_dag, maintained_population::PopulationStatistic, Field, }; let mut dag = compile_post_asap_dag(selected).map_err(|error| invalid(error.to_string()))?; // Typed snapshot candidates already carry full identity throughout the DAG. @@ -112,7 +112,7 @@ pub fn compile_current_series_readout( node.payload, Payload::Value { operation: ValueOperation::ReadPopulation { - readout: PopulationReadout::TopK { .. } + readout: PopulationStatistic::TopK { .. } } } ) @@ -136,7 +136,7 @@ pub fn compile_current_series_readout( Payload::Value { operation: ValueOperation::ReadPopulation { - readout: PopulationReadout::TopK { .. }, + readout: PopulationStatistic::TopK { .. }, }, } => {} _ => return Err(invalid("unsupported current-series readout dependency")), diff --git a/crates/asap-physical-operators/src/physical_planner/row_values.rs b/crates/asap-physical-operators/src/physical_planner/row_values.rs index 78d0227a1..3396df685 100644 --- a/crates/asap-physical-operators/src/physical_planner/row_values.rs +++ b/crates/asap-physical-operators/src/physical_planner/row_values.rs @@ -1,6 +1,6 @@ //! Query-time PromQL value computation over logical row schemas. use super::*; -use planner_types::post_asap::maintained_population::PopulationReadout; +use planner_types::post_asap::maintained_population::PopulationStatistic; use planner_types::pre_asap::{DataType, ScalarValue}; /// A PromQL number literal has no row schema; its consumer folds it in. @@ -16,7 +16,7 @@ pub(super) fn scalar_literal(expression: &QueryExpr) -> Option { pub(super) fn population_aggregate( input: &SchemaRef, grouping: &[String], - readout: &PopulationReadout, + readout: &PopulationStatistic, ) -> Result, Error> { let groups = grouping .iter() @@ -24,14 +24,14 @@ pub(super) fn population_aggregate( .collect::, _>>()?; let value = named_column(input, &ColumnRef::SampleValue)?; let reduction = match readout { - PopulationReadout::Sum => Reduction::Sum(value), - PopulationReadout::Count => Reduction::Count, - PopulationReadout::Average => Reduction::Avg(value), - PopulationReadout::Quantile { q } => Reduction::Quantile { + PopulationStatistic::Sum => Reduction::Sum(value), + PopulationStatistic::Count => Reduction::Count, + PopulationStatistic::Average => Reduction::Avg(value), + PopulationStatistic::Quantile { q } => Reduction::Quantile { column: value, q: *q, }, - PopulationReadout::TopK { .. } => { + PopulationStatistic::TopK { .. } => { return Err(invalid( "TopK population readout ranks; it does not aggregate", )) diff --git a/crates/asap-physical-operators/src/summary_kernels/count_min_sketch.rs b/crates/asap-physical-operators/src/summary_kernels/count_min_sketch.rs index 8f1db45df..af0815c25 100644 --- a/crates/asap-physical-operators/src/summary_kernels/count_min_sketch.rs +++ b/crates/asap-physical-operators/src/summary_kernels/count_min_sketch.rs @@ -1,7 +1,7 @@ //! Count-Min Sketch frequency summary over `asap_sketchlib::CountMinSketch`. use crate::{AggregateCore, KernelError, KeyByLabelValues}; use asap_sketchlib::CountMinSketch; -use planner_types::post_asap::SketchQuery; +use planner_types::post_asap::SketchStatistic; #[derive(Debug, Clone)] pub struct CountMinSketchAccumulator { @@ -45,9 +45,9 @@ impl AggregateCore for CountMinSketchAccumulator { /// A bare point count reads the total update weight: every Count-Min row /// receives each update exactly once, so one row's mass survives collisions. - fn estimate(&self, query: &SketchQuery) -> Result { + fn estimate(&self, query: &SketchStatistic) -> Result { match query { - SketchQuery::PointCount { value: None, .. } => Ok(row_mass(&self.inner.sketch())), + SketchStatistic::PointCount { value: None, .. } => Ok(row_mass(&self.inner.sketch())), _ => Err(format!("{query:?} is not supported by Count-Min Sketch").into()), } } @@ -86,7 +86,7 @@ mod tests { // The bare count keeps colliding items' weight, adds across merges, and is 0 when empty. #[test] fn bare_count_reads_total_weight() { - let bare_count = SketchQuery::PointCount { + let bare_count = SketchStatistic::PointCount { key: planner_types::pre_asap::ColumnRef::SampleValue, value: None, }; @@ -98,7 +98,7 @@ mod tests { assert_eq!(merged.estimate(&bare_count).unwrap(), 20.0); let empty = CountMinSketchAccumulator::new(2, 1); assert_eq!(empty.estimate(&bare_count).unwrap(), 0.0); - assert!(state.estimate(&SketchQuery::Cardinality).is_err()); + assert!(state.estimate(&SketchStatistic::Cardinality).is_err()); } // Merge rejects a different summary family. diff --git a/crates/asap-physical-operators/src/summary_kernels/datasketches_kll.rs b/crates/asap-physical-operators/src/summary_kernels/datasketches_kll.rs index 3417bb8cc..e4ecb56a0 100644 --- a/crates/asap-physical-operators/src/summary_kernels/datasketches_kll.rs +++ b/crates/asap-physical-operators/src/summary_kernels/datasketches_kll.rs @@ -1,7 +1,7 @@ //! KLL quantile summary over `asap_sketchlib::KllSketch`. use crate::{AggregateCore, KernelError}; use asap_sketchlib::KllSketch; -use planner_types::post_asap::SketchQuery; +use planner_types::post_asap::SketchStatistic; #[derive(Clone)] pub struct DatasketchesKLLAccumulator { @@ -60,10 +60,10 @@ impl AggregateCore for DatasketchesKLLAccumulator { })) } - fn estimate(&self, query: &SketchQuery) -> Result { + fn estimate(&self, query: &SketchStatistic) -> Result { match query { - SketchQuery::Quantile { q } if (0.0..=1.0).contains(q) => Ok(self.get_quantile(*q)), - SketchQuery::Quantile { .. } => Err("quantile must be in [0, 1]".into()), + SketchStatistic::Quantile { q } if (0.0..=1.0).contains(q) => Ok(self.get_quantile(*q)), + SketchStatistic::Quantile { .. } => Err("quantile must be in [0, 1]".into()), other => Err(format!("KLL does not answer {other:?}").into()), } } @@ -95,7 +95,7 @@ mod tests { all.update(f64::from(v)); } let merged = a.merge_with(&b).unwrap(); - let q = SketchQuery::Quantile { q: 0.5 }; + let q = SketchStatistic::Quantile { q: 0.5 }; assert_eq!(merged.estimate(&q).unwrap(), all.estimate(&q).unwrap()); } @@ -103,7 +103,7 @@ mod tests { #[test] fn rejects_unsupported_or_out_of_range_queries() { let kll = DatasketchesKLLAccumulator::new(200); - assert!(kll.estimate(&SketchQuery::Quantile { q: 1.5 }).is_err()); - assert!(kll.estimate(&SketchQuery::Cardinality).is_err()); + assert!(kll.estimate(&SketchStatistic::Quantile { q: 1.5 }).is_err()); + assert!(kll.estimate(&SketchStatistic::Cardinality).is_err()); } } diff --git a/crates/asap-physical-operators/src/summary_kernels/dd_sketch.rs b/crates/asap-physical-operators/src/summary_kernels/dd_sketch.rs index dcda7ad47..e9cdf9d9c 100644 --- a/crates/asap-physical-operators/src/summary_kernels/dd_sketch.rs +++ b/crates/asap-physical-operators/src/summary_kernels/dd_sketch.rs @@ -1,7 +1,7 @@ //! DDSketch quantile summary over `asap_sketchlib::DdSketch`. use crate::{AggregateCore, KernelError}; use asap_sketchlib::DdSketch; -use planner_types::post_asap::SketchQuery; +use planner_types::post_asap::SketchStatistic; #[derive(Debug, Clone)] pub struct DDSketchAccumulator { @@ -39,14 +39,14 @@ impl AggregateCore for DDSketchAccumulator { } /// Quantiles, and the total sample count as a bare `PointCount`. - fn estimate(&self, query: &SketchQuery) -> Result { + fn estimate(&self, query: &SketchStatistic) -> Result { match query { - SketchQuery::Quantile { q } if (0.0..=1.0).contains(q) => self + SketchStatistic::Quantile { q } if (0.0..=1.0).contains(q) => self .inner .quantile(*q) .ok_or_else(|| "DDSketch quantile of an empty population".into()), - SketchQuery::Quantile { .. } => Err("quantile must be in [0, 1]".into()), - SketchQuery::PointCount { value: None, .. } => Ok(self.inner.total_count() as f64), + SketchStatistic::Quantile { .. } => Err("quantile must be in [0, 1]".into()), + SketchStatistic::PointCount { value: None, .. } => Ok(self.inner.total_count() as f64), other => Err(format!("DDSketch does not answer {other:?}").into()), } } @@ -57,8 +57,8 @@ mod tests { use super::*; use planner_types::pre_asap::ColumnRef; - fn bare_count() -> SketchQuery { - SketchQuery::PointCount { + fn bare_count() -> SketchStatistic { + SketchStatistic::PointCount { key: ColumnRef::SampleValue, value: None, } @@ -77,7 +77,9 @@ mod tests { } let merged = a.merge_with(&b).unwrap(); assert_eq!(merged.estimate(&bare_count()).unwrap(), 100.0); - let median = merged.estimate(&SketchQuery::Quantile { q: 0.5 }).unwrap(); + let median = merged + .estimate(&SketchStatistic::Quantile { q: 0.5 }) + .unwrap(); assert!((median - 50.0).abs() <= 1.0, "{median}"); } @@ -85,7 +87,7 @@ mod tests { #[test] fn empty_quantile_and_unsupported_queries_fail() { let dd = DDSketchAccumulator::new(0.01); - assert!(dd.estimate(&SketchQuery::Quantile { q: 0.5 }).is_err()); - assert!(dd.estimate(&SketchQuery::Cardinality).is_err()); + assert!(dd.estimate(&SketchStatistic::Quantile { q: 0.5 }).is_err()); + assert!(dd.estimate(&SketchStatistic::Cardinality).is_err()); } } diff --git a/crates/asap-physical-operators/src/summary_kernels/hll_sketch.rs b/crates/asap-physical-operators/src/summary_kernels/hll_sketch.rs index f675da230..993f9d9b6 100644 --- a/crates/asap-physical-operators/src/summary_kernels/hll_sketch.rs +++ b/crates/asap-physical-operators/src/summary_kernels/hll_sketch.rs @@ -1,7 +1,7 @@ //! HyperLogLog distinct-count summary over `asap_sketchlib::HllSketch`. use crate::{AggregateCore, KernelError}; use asap_sketchlib::{HllSketch, HllVariant}; -use planner_types::post_asap::SketchQuery; +use planner_types::post_asap::SketchStatistic; #[derive(Debug, Clone)] pub struct HllSketchAccumulator { @@ -39,9 +39,9 @@ impl AggregateCore for HllSketchAccumulator { } /// Distinct count. A bare `PointCount` over an HLL also reads the distinct count. - fn estimate(&self, query: &SketchQuery) -> Result { + fn estimate(&self, query: &SketchStatistic) -> Result { match query { - SketchQuery::Cardinality | SketchQuery::PointCount { value: None, .. } => { + SketchStatistic::Cardinality | SketchStatistic::PointCount { value: None, .. } => { Ok(self.inner.estimate()) } other => Err(format!("HLL does not answer {other:?}").into()), @@ -69,7 +69,7 @@ mod tests { b.inner.update(&(v + 500).to_le_bytes()); } let merged = a.merge_with(&b).unwrap(); - let estimate = merged.estimate(&SketchQuery::Cardinality).unwrap(); + let estimate = merged.estimate(&SketchStatistic::Cardinality).unwrap(); assert!((estimate - 1500.0).abs() / 1500.0 < 0.05, "{estimate}"); } @@ -77,6 +77,6 @@ mod tests { #[test] fn rejects_quantile() { let hll = HllSketchAccumulator::new(HllVariant::Regular, 12); - assert!(hll.estimate(&SketchQuery::Quantile { q: 0.5 }).is_err()); + assert!(hll.estimate(&SketchStatistic::Quantile { q: 0.5 }).is_err()); } } diff --git a/crates/asap-physical-operators/src/summary_kernels/traits.rs b/crates/asap-physical-operators/src/summary_kernels/traits.rs index 3902a296c..9c5d028fb 100644 --- a/crates/asap-physical-operators/src/summary_kernels/traits.rs +++ b/crates/asap-physical-operators/src/summary_kernels/traits.rs @@ -1,4 +1,4 @@ -use planner_types::post_asap::SketchQuery; +use planner_types::post_asap::SketchStatistic; pub type KernelError = Box; @@ -22,7 +22,7 @@ pub trait AggregateCore: Send + Sync { /// Answer a sketch readout. Exact states are read through /// [`ExactAccumulator::readout`](super::exact::ExactAccumulator::readout). - fn estimate(&self, query: &SketchQuery) -> Result { + fn estimate(&self, query: &SketchStatistic) -> Result { Err(format!("{query:?} is not supported by this summary").into()) } @@ -52,7 +52,7 @@ mod tests { .downcast_mut::() .unwrap(); dd.inner.update(3.0); - let count = SketchQuery::PointCount { + let count = SketchStatistic::PointCount { key: planner_types::pre_asap::ColumnRef::SampleValue, value: None, }; diff --git a/crates/asap-physical-operators/src/summary_kernels/univmon.rs b/crates/asap-physical-operators/src/summary_kernels/univmon.rs index 6d42c336f..9340b1c0e 100644 --- a/crates/asap-physical-operators/src/summary_kernels/univmon.rs +++ b/crates/asap-physical-operators/src/summary_kernels/univmon.rs @@ -2,7 +2,7 @@ use crate::AggregateCore; use asap_sketchlib::{DataInput, UnivMon}; -use planner_types::{post_asap::SketchQuery, pre_asap::ColumnRef}; +use planner_types::{post_asap::SketchStatistic, pre_asap::ColumnRef}; type Error = Box; @@ -144,15 +144,15 @@ impl AggregateCore for UnivMonAccumulator { /// Sample count (a bare `PointCount`), distinct count, L2 norm and entropy /// of the sample-value frequencies. - fn estimate(&self, query: &SketchQuery) -> Result { + fn estimate(&self, query: &SketchStatistic) -> Result { Ok(match query { - SketchQuery::PointCount { + SketchStatistic::PointCount { key: ColumnRef::SampleValue, value: None, } => self.inner.calc_l1(), - SketchQuery::Cardinality => self.inner.calc_card(), - SketchQuery::FrequencyL2 => self.inner.calc_l2(), - SketchQuery::FrequencyEntropy => self.inner.calc_entropy(), + SketchStatistic::Cardinality => self.inner.calc_card(), + SketchStatistic::FrequencyL2 => self.inner.calc_l2(), + SketchStatistic::FrequencyEntropy => self.inner.calc_entropy(), other => return Err(format!("UnivMon does not answer {other:?}").into()), }) } @@ -162,8 +162,8 @@ impl AggregateCore for UnivMonAccumulator { mod tests { use super::*; - fn count() -> SketchQuery { - SketchQuery::PointCount { + fn count() -> SketchStatistic { + SketchStatistic::PointCount { key: ColumnRef::SampleValue, value: None, } @@ -179,10 +179,12 @@ mod tests { } let read = |query| state.estimate(&query).unwrap(); assert_eq!(read(count()), 4.0); - assert!((read(SketchQuery::Cardinality) - 2.0).abs() < 0.01); - assert!((read(SketchQuery::FrequencyL2) - 8.0f64.sqrt()).abs() < 0.01); - assert!((read(SketchQuery::FrequencyEntropy) - 1.0).abs() < 0.01); - assert!(state.estimate(&SketchQuery::Quantile { q: 0.5 }).is_err()); + assert!((read(SketchStatistic::Cardinality) - 2.0).abs() < 0.01); + assert!((read(SketchStatistic::FrequencyL2) - 8.0f64.sqrt()).abs() < 0.01); + assert!((read(SketchStatistic::FrequencyEntropy) - 1.0).abs() < 0.01); + assert!(state + .estimate(&SketchStatistic::Quantile { q: 0.5 }) + .is_err()); } // A sketch taken out and adopted back answers the same readouts. @@ -196,8 +198,8 @@ mod tests { assert_eq!(adopted.dimensions(), state.dimensions()); for query in [ count(), - SketchQuery::Cardinality, - SketchQuery::FrequencyEntropy, + SketchStatistic::Cardinality, + SketchStatistic::FrequencyEntropy, ] { assert_eq!( adopted.estimate(&query).unwrap(), diff --git a/crates/asap-physical-operators/tests/deployment.rs b/crates/asap-physical-operators/tests/deployment.rs index 6db0e990d..2857a81cb 100644 --- a/crates/asap-physical-operators/tests/deployment.rs +++ b/crates/asap-physical-operators/tests/deployment.rs @@ -28,7 +28,9 @@ fn build(values: &[f64]) -> Box { } fn read(state: &dyn AggregateCore) -> f64 { state - .estimate(&asap_physical_operators::planner::post_asap::SketchQuery::Quantile { q: 0.5 }) + .estimate( + &asap_physical_operators::planner::post_asap::SketchStatistic::Quantile { q: 0.5 }, + ) .unwrap() } diff --git a/crates/asap-physical-operators/tests/deployment_computation.rs b/crates/asap-physical-operators/tests/deployment_computation.rs index 996552e7d..e20fc27ee 100644 --- a/crates/asap-physical-operators/tests/deployment_computation.rs +++ b/crates/asap-physical-operators/tests/deployment_computation.rs @@ -639,7 +639,7 @@ fn stored_count_min_bare_count_compiles_to_a_readout() { matches!( &n.payload, PostAsapOperatorPayload::SummaryEstimate { - query: SketchQuery::PointCount { value: None, .. } + query: SketchStatistic::PointCount { value: None, .. } } ) }); diff --git a/crates/asap-physical-operators/tests/physical_dag.rs b/crates/asap-physical-operators/tests/physical_dag.rs index df8650816..e2ad735d6 100644 --- a/crates/asap-physical-operators/tests/physical_dag.rs +++ b/crates/asap-physical-operators/tests/physical_dag.rs @@ -299,7 +299,7 @@ fn binding_rejects_unsupported_operations() { sum.schema(), 0, asap_physical_operators::operators::ReadoutQuery::Sketch( - planner_types::post_asap::SketchQuery::Quantile { q: 0.5 } + planner_types::post_asap::SketchStatistic::Quantile { q: 0.5 } ) ) .is_err()); @@ -400,7 +400,7 @@ fn kll_raw_partial_and_precomputed_are_native_dags() { state.clone(), 0, asap_physical_operators::operators::ReadoutQuery::Sketch( - planner_types::post_asap::SketchQuery::Quantile { q: 0.5 }, + planner_types::post_asap::SketchStatistic::Quantile { q: 0.5 }, ), ) .unwrap(), diff --git a/crates/asap-physical-operators/tests/physical_semantics.rs b/crates/asap-physical-operators/tests/physical_semantics.rs index 61621c56f..56b62590b 100644 --- a/crates/asap-physical-operators/tests/physical_semantics.rs +++ b/crates/asap-physical-operators/tests/physical_semantics.rs @@ -592,7 +592,7 @@ fn kll_partial_merge_and_multiple_readouts_preserve_population() { state.clone(), 0, asap_physical_operators::operators::ReadoutQuery::Sketch( - planner_types::post_asap::SketchQuery::Quantile { q }, + planner_types::post_asap::SketchStatistic::Quantile { q }, ), ) .unwrap(), diff --git a/crates/asap-physical-operators/tests/plan_properties.rs b/crates/asap-physical-operators/tests/plan_properties.rs index fe2ad378b..e3dd7b5fc 100644 --- a/crates/asap-physical-operators/tests/plan_properties.rs +++ b/crates/asap-physical-operators/tests/plan_properties.rs @@ -117,7 +117,7 @@ fn blocking_inputs_require_an_explicit_finite_source() { fn summary_capability_levels_are_distinct() { use asap_physical_operators::{ capability::{validate_native_family, validate_sketch_readout, validate_summary_kernel}, - planner::post_asap::SketchQuery, + planner::post_asap::SketchStatistic, }; use planner_types::{ post_asap::{GroupingStrategy, SketchAlgorithm, SketchKind, SketchParams, SummaryUpdate}, @@ -144,14 +144,14 @@ fn summary_capability_levels_are_distinct() { assert!(validate_summary_kernel(&cms, &update, &grouping).is_ok()); // Stored Count-Min state reads only its bare count natively. assert!(validate_native_family(&cms).is_ok()); - let bare_count = SketchQuery::PointCount { + let bare_count = SketchStatistic::PointCount { key: ColumnRef::SampleValue, value: None, }; assert!(validate_sketch_readout(&cms, &bare_count).is_ok()); assert!(validate_sketch_readout( &cms, - &SketchQuery::PointCount { + &SketchStatistic::PointCount { key: ColumnRef::Named("host".into()), value: Some("a".into()), } @@ -162,7 +162,7 @@ fn summary_capability_levels_are_distinct() { grouping, ); assert!(validate_native_family(&kll).is_ok()); - assert!(validate_sketch_readout(&kll, &SketchQuery::Quantile { q: 1.5 }).is_err()); - assert!(validate_sketch_readout(&kll, &SketchQuery::Cardinality).is_err()); - assert!(validate_sketch_readout(&kll, &SketchQuery::Quantile { q: 0.5 }).is_ok()); + assert!(validate_sketch_readout(&kll, &SketchStatistic::Quantile { q: 1.5 }).is_err()); + assert!(validate_sketch_readout(&kll, &SketchStatistic::Cardinality).is_err()); + assert!(validate_sketch_readout(&kll, &SketchStatistic::Quantile { q: 0.5 }).is_ok()); } diff --git a/crates/asap-physical-operators/tests/planspace_series_identity_heap.rs b/crates/asap-physical-operators/tests/planspace_series_identity_heap.rs index 3ca750ca8..1f03b61c4 100644 --- a/crates/asap-physical-operators/tests/planspace_series_identity_heap.rs +++ b/crates/asap-physical-operators/tests/planspace_series_identity_heap.rs @@ -32,7 +32,7 @@ impl AccuracyEvidenceProvider for Evidence { &self, op: &CompositionOperator, _: &FieldDataType, - _: Option<&SketchQuery>, + _: Option<&SketchStatistic>, ) -> PropagationStats { if matches!(op, CompositionOperator::TopKSelection) { PropagationStats { diff --git a/crates/asap-physical-operators/tests/weighted_topk_binding.rs b/crates/asap-physical-operators/tests/weighted_topk_binding.rs index a5d0d4dd8..fe79948d6 100644 --- a/crates/asap-physical-operators/tests/weighted_topk_binding.rs +++ b/crates/asap-physical-operators/tests/weighted_topk_binding.rs @@ -28,7 +28,7 @@ impl AccuracyEvidenceProvider for Evidence { &self, op: &CompositionOperator, _: &FieldDataType, - _: Option<&SketchQuery>, + _: Option<&SketchStatistic>, ) -> PropagationStats { if matches!(op, CompositionOperator::TopKSelection) { PropagationStats { diff --git a/crates/devtools/src/bin/dag_export.rs b/crates/devtools/src/bin/dag_export.rs index f4c8928de..b0615f017 100644 --- a/crates/devtools/src/bin/dag_export.rs +++ b/crates/devtools/src/bin/dag_export.rs @@ -99,7 +99,7 @@ use asap_types::dag_export::{ }; use asap_types::post_asap::SummaryExpr; use asap_types::post_asap::SummaryNode; -use asap_types::post_asap::{CompositionOperator, FieldDataType, SketchQuery}; +use asap_types::post_asap::{CompositionOperator, FieldDataType, SketchStatistic}; use asap_types::pre_asap::cse::{structural_hash, HashCache}; use asap_types::pre_asap::query_expr::QueryExpr; use asap_types::pre_asap::schema::{DataType, Field, Schema}; @@ -826,7 +826,7 @@ impl AccuracyEvidenceProvider for TopKMarginEvidence { &self, op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&SketchQuery>, + _query: Option<&SketchStatistic>, ) -> PropagationStats { if matches!(op, CompositionOperator::TopKSelection) { PropagationStats { diff --git a/crates/frontend-promql/tests/univmon_candidates.rs b/crates/frontend-promql/tests/univmon_candidates.rs index e0ce77fe5..2b4891a08 100644 --- a/crates/frontend-promql/tests/univmon_candidates.rs +++ b/crates/frontend-promql/tests/univmon_candidates.rs @@ -10,7 +10,7 @@ mod support; use asap_types::post_asap::{ compile_post_asap_dag, cse::share_common_summary_sub_dags, AccuracyError, BoundExpr, CompositionOperator, ErrorMetric, FieldDataType, ProbabilityExpr, ResultGuarantee, - SketchAlgorithm, SketchQuery, SummaryExpr, SummaryInputExpr, SummaryNode, + SketchAlgorithm, SketchStatistic, SummaryExpr, SummaryInputExpr, SummaryNode, }; use asap_types::types::AccuracyTarget; use support::lower_promql; @@ -21,10 +21,10 @@ impl AccuracyModel for TestEvidence { fn local_guarantee( &self, family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { if matches!(family, FieldDataType::Sketch(kind, _) if kind.algorithm() == &SketchAlgorithm::UnivMon) - && !matches!(query, SketchQuery::PointCount { .. }) + && !matches!(query, SketchStatistic::PointCount { .. }) { let mut guarantee = ResultGuarantee::exact("SYNTHETIC test evidence; not measured"); guarantee.metric = ErrorMetric::RelativeValue; @@ -101,7 +101,10 @@ fn four_readouts_share_one_value_frequency_state_and_keep_honest_guarantees() { assert!(matches!(input.item, Some(SummaryInputExpr::Column(_)))); assert_eq!(input.weight, SummaryInputExpr::Constant(1.0)); if *index == 1 { - assert!(matches!(query, SketchQuery::PointCount { value: None, .. })); + assert!(matches!( + query, + SketchStatistic::PointCount { value: None, .. } + )); assert!(root.guarantee.as_ref().is_some_and(|g| g.is_exact())); } else { assert!(!root.guarantee.as_ref().unwrap().is_exact()); diff --git a/crates/integration-tests/tests/exact_composition.rs b/crates/integration-tests/tests/exact_composition.rs index 5067a6112..917ef7b3a 100644 --- a/crates/integration-tests/tests/exact_composition.rs +++ b/crates/integration-tests/tests/exact_composition.rs @@ -96,7 +96,7 @@ struct StatsModel; fn custom_accuracy_rule_survives_root_target_and_materialization() { use asap_aware_mapping::{AccuracyModel, DefaultAccuracyModel, PropagationStats}; use asap_types::post_asap::{ - AccuracyError, CompositionOperator, ExactOperation, ResultGuarantee, SketchQuery, + AccuracyError, CompositionOperator, ExactOperation, ResultGuarantee, SketchStatistic, }; struct Model; impl AccuracyModel for Model { @@ -106,7 +106,7 @@ fn custom_accuracy_rule_survives_root_target_and_materialization() { fn local_guarantee( &self, family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { DefaultAccuracyModel.local_guarantee(family, query) } diff --git a/crates/integration-tests/tests/kll_pane_execution.rs b/crates/integration-tests/tests/kll_pane_execution.rs index 65f4fc6c4..b48d14bf7 100644 --- a/crates/integration-tests/tests/kll_pane_execution.rs +++ b/crates/integration-tests/tests/kll_pane_execution.rs @@ -11,7 +11,7 @@ use asap_physical_operators::{ }; use asap_types::{ post_asap::{ - Field, FieldDataType, Schema, SketchAlgorithm, SketchKind, SketchParams, SketchQuery, + Field, FieldDataType, Schema, SketchAlgorithm, SketchKind, SketchParams, SketchStatistic, }, pre_asap::DataType, }; @@ -99,7 +99,12 @@ fn restore(schema: SchemaRef, states: &[Arc]) -> Batch { .unwrap() } fn readout(schema: SchemaRef, q: f64) -> Operator { - Operator::readout(schema, 0, ReadoutQuery::Sketch(SketchQuery::Quantile { q })).unwrap() + Operator::readout( + schema, + 0, + ReadoutQuery::Sketch(SketchStatistic::Quantile { q }), + ) + .unwrap() } struct CountStarts { operator: Operator, diff --git a/crates/integration-tests/tests/precompute_raw_samples.rs b/crates/integration-tests/tests/precompute_raw_samples.rs index 4ce172709..9937469cc 100644 --- a/crates/integration-tests/tests/precompute_raw_samples.rs +++ b/crates/integration-tests/tests/precompute_raw_samples.rs @@ -19,7 +19,7 @@ use asap_physical_operators::{ }; use asap_types::post_asap::{ compile_post_asap_dag, EntityIdentity, ExactKind, FieldDataType, PostAsapDAG, - PostAsapOperatorPayload, SketchAlgorithm, SketchQuery, SummaryInputExpr, SummaryNode, + PostAsapOperatorPayload, SketchAlgorithm, SketchStatistic, SummaryInputExpr, SummaryNode, SummaryUpdate, }; use asap_types::pre_asap::{expr_ir::ColumnRef, query_expr::Reduction}; @@ -265,9 +265,9 @@ fn readouts(state: &dyn AggregateCore, family: &FieldDataType) -> Vec { match kind.algorithm() { SketchAlgorithm::Kll | SketchAlgorithm::DDSketch => [0.1, 0.5, 0.9] .into_iter() - .map(|q| state.estimate(&SketchQuery::Quantile { q }).unwrap()) + .map(|q| state.estimate(&SketchStatistic::Quantile { q }).unwrap()) .collect(), - SketchAlgorithm::Hll => vec![state.estimate(&SketchQuery::Cardinality).unwrap()], + SketchAlgorithm::Hll => vec![state.estimate(&SketchStatistic::Cardinality).unwrap()], other => panic!("unexpected unkeyed sketch {other:?}"), } } diff --git a/crates/integration-tests/tests/promql_numeric_regressions.rs b/crates/integration-tests/tests/promql_numeric_regressions.rs index 9fbb2a9bb..692fe9c7a 100644 --- a/crates/integration-tests/tests/promql_numeric_regressions.rs +++ b/crates/integration-tests/tests/promql_numeric_regressions.rs @@ -171,7 +171,7 @@ impl asap_aware_mapping::accuracy::AccuracyEvidenceProvider for OneKeyTopKEviden &self, op: &asap_types::post_asap::CompositionOperator, _family: &FieldDataType, - _query: Option<&asap_types::post_asap::SketchQuery>, + _query: Option<&asap_types::post_asap::SketchStatistic>, ) -> asap_aware_mapping::accuracy::PropagationStats { // Single-key fixture: no excluded keys; bounds cover every value below. if matches!( diff --git a/crates/integration-tests/tests/promql_to_post_asap.rs b/crates/integration-tests/tests/promql_to_post_asap.rs index d48ef6078..97a08a0c4 100644 --- a/crates/integration-tests/tests/promql_to_post_asap.rs +++ b/crates/integration-tests/tests/promql_to_post_asap.rs @@ -22,7 +22,7 @@ use asap_integration_tests::fixtures::lower_promql; use asap_types::post_asap::{ compile_post_asap_dag, CompositionOperator, EntityIdentity, ExactKind, ExactParams, FieldDataType, GroupingStrategy, Schema, SketchAlgorithm, SketchKind, SketchParams, - SketchQuery, SummaryExpr, SummaryInputExpr, SummaryNode, SummaryUpdate, ValueOperation, + SketchStatistic, SummaryExpr, SummaryInputExpr, SummaryNode, SummaryUpdate, ValueOperation, }; use asap_types::pre_asap::expr_ir::ColumnRef; use asap_types::pre_asap::query_expr::{QueryExpr, Reduction}; @@ -66,7 +66,7 @@ fn distinct_over_time_offers_hll_cardinality_readout() { assert!(candidates.iter().any(|candidate| { let Replacement::Summary(node) = &candidate.replacement else { return false }; let SummaryExpr::SummaryEstimate { summary_input, query, .. } = &node.expr else { return false }; - matches!(query, SketchQuery::Cardinality) + matches!(query, SketchStatistic::Cardinality) && matches!(&summary_input.expr, SummaryExpr::SummaryAgg { family: FieldDataType::Sketch(kind, _), .. } if kind.algorithm() == &SketchAlgorithm::Hll) }), "no HLL cardinality candidate: {candidates:?}"); @@ -255,7 +255,7 @@ impl AccuracyEvidenceProvider for SeparatedTopK { &self, op: &CompositionOperator, _family: &FieldDataType, - _query: Option<&SketchQuery>, + _query: Option<&SketchStatistic>, ) -> PropagationStats { matches!(op, CompositionOperator::TopKSelection) .then_some(PropagationStats { @@ -327,7 +327,7 @@ fn weighted_topk_keeps_candidates_with_missing_population_evidence() { &self, op: &CompositionOperator, family: &FieldDataType, - query: Option<&SketchQuery>, + query: Option<&SketchStatistic>, ) -> PropagationStats { SeparatedTopK.propagation_stats(op, family, query) } @@ -478,7 +478,7 @@ fn rate_and_increase_topk_use_summary_scores_and_grouped_limits() { }; let SummaryExpr::SummaryEstimate { summary_input, - query: SketchQuery::TopK { k }, + query: SketchStatistic::TopK { k }, } = &readout.expr else { panic!("heap readout") @@ -705,7 +705,7 @@ fn planner_only_e2e_temporal_topk_preserves_query_update_and_readout_contract() .expect("heap-backed temporal Top-K candidate"); let SummaryExpr::SummaryEstimate { summary_input, - query: SketchQuery::TopK { k, .. }, + query: SketchStatistic::TopK { k, .. }, } = &candidate.expr else { panic!("expected Top-K estimate, got {:?}", candidate.expr) @@ -752,7 +752,7 @@ fn execute_topk_reference(plan: &SummaryNode) -> Vec<(String, f64)> { use std::collections::BTreeMap; let SummaryExpr::SummaryEstimate { summary_input, - query: SketchQuery::TopK { k }, + query: SketchStatistic::TopK { k }, } = &plan.expr else { panic!("expected TopK readout") @@ -868,7 +868,7 @@ fn planner_heap_topk_reference_execution_matches_ground_truth() { // This reference executor consumes keyed heap updates. The inventory // also contains maintained exact values followed by sort/limit; those // have a different execution contract and must not enter this fixture. - let candidates: Vec<_> = strategy.replacements(&TargetSubDAG::new(&pre)).into_iter().filter(|candidate| matches!(&candidate.replacement, Replacement::Summary(plan) if matches!(plan.expr, SummaryExpr::SummaryEstimate { query: SketchQuery::TopK { .. }, .. }))).collect(); + let candidates: Vec<_> = strategy.replacements(&TargetSubDAG::new(&pre)).into_iter().filter(|candidate| matches!(&candidate.replacement, Replacement::Summary(plan) if matches!(plan.expr, SummaryExpr::SummaryEstimate { query: SketchStatistic::TopK { .. }, .. }))).collect(); assert!(!candidates.is_empty(), "no heap candidate for {query}"); for candidate in candidates { let Replacement::Summary(plan) = candidate.replacement else { @@ -912,7 +912,7 @@ fn promql_quantile_of_rate_binds_kll_over_rate_accumulator() { else { panic!("expected SummaryEstimate root, got {:?}", root.expr); }; - assert!(matches!(query, SketchQuery::Quantile { q } if *q == 0.99)); + assert!(matches!(query, SketchStatistic::Quantile { q } if *q == 0.99)); assert_eq!( dtype(&root.schema, "quantile_0_99"), &FieldDataType::Plain(DataType::Float64), diff --git a/crates/integration-tests/tests/sql_to_post_asap.rs b/crates/integration-tests/tests/sql_to_post_asap.rs index abd6c90c5..4cecd6952 100644 --- a/crates/integration-tests/tests/sql_to_post_asap.rs +++ b/crates/integration-tests/tests/sql_to_post_asap.rs @@ -28,8 +28,8 @@ use asap_aware_mapping::{ use asap_frontend_sql::{lower_sql, lower_sql_dialect, SqlCatalog}; use asap_types::post_asap::{ compile_post_asap_dag, EdgeRole, ExactKind, ExactParams, FieldDataType, GroupingStrategy, - PostAsapOperatorPayload, SketchAlgorithm, SketchKind, SketchParams, SketchQuery, SummaryExpr, - SummaryNode, SummaryUpdate, ValueOperation, + PostAsapOperatorPayload, SketchAlgorithm, SketchKind, SketchParams, SketchStatistic, + SummaryExpr, SummaryNode, SummaryUpdate, ValueOperation, }; use asap_types::pre_asap::expr_ir::ColumnRef; use asap_types::pre_asap::query_expr::{QueryExpr, Reduction}; @@ -629,7 +629,7 @@ async fn sql_quantile_binds_kll_sketch_over_named_column() { else { panic!("expected SummaryEstimate root, got {:?}", root.expr); }; - assert!(matches!(query, SketchQuery::Quantile { q } if *q == 0.99)); + assert!(matches!(query, SketchStatistic::Quantile { q } if *q == 0.99)); assert_eq!( root.schema.fields.len(), 1, @@ -716,7 +716,7 @@ async fn sql_count_distinct_with_epsilon_binds_hll_rse_over_named_column() { else { panic!("expected SummaryEstimate root, got {:?}", root.expr); }; - assert!(matches!(query, SketchQuery::Cardinality)); + assert!(matches!(query, SketchStatistic::Cardinality)); assert_eq!( root.schema.fields[0].dtype, FieldDataType::Plain(DataType::Int64), diff --git a/crates/planner/tests/summary_sharing.rs b/crates/planner/tests/summary_sharing.rs index a7c1f4ea0..41b489e9c 100644 --- a/crates/planner/tests/summary_sharing.rs +++ b/crates/planner/tests/summary_sharing.rs @@ -22,7 +22,7 @@ use asap_frontend_sql::SqlCatalog; use asap_planner::{e2e_plan, FrontendInput, UserInput}; use asap_types::post_asap::{ share_common_summary_sub_dags, AccuracyError, BoundExpr, CompositionOperator, ErrorMetric, - ProbabilityExpr, ResultGuarantee, SketchQuery, + ProbabilityExpr, ResultGuarantee, SketchStatistic, }; use asap_types::post_asap::{ FieldDataType, SketchAlgorithm, SketchParams, SummaryExpr, SummaryNode, @@ -459,7 +459,7 @@ impl AccuracyModel for UnivMonEvidence { fn local_guarantee( &self, family: &FieldDataType, - query: &SketchQuery, + query: &SketchStatistic, ) -> Option { if matches!(family, FieldDataType::Sketch(kind, _) if kind.algorithm() == &SketchAlgorithm::UnivMon) { diff --git a/crates/types/src/dag_export.rs b/crates/types/src/dag_export.rs index 43f248054..f26673ea7 100644 --- a/crates/types/src/dag_export.rs +++ b/crates/types/src/dag_export.rs @@ -326,7 +326,7 @@ pub struct WorkloadDAG { /// separately-exported DAG the way pre-ASAP notes are). /// /// Several of `SummaryExpr`'s own fields (`FieldDataType`, -/// `GroupingStrategy`, `SketchQuery`) derive neither `Serialize` nor +/// `GroupingStrategy`, `SketchStatistic`) derive neither `Serialize` nor /// `Deserialize` in `asap_types::post_asap` — they carry no reporting /// obligation there, since nothing before this module ever needed to /// serialize a post-ASAP node. Rather than adding `Serialize` impls to @@ -1705,7 +1705,7 @@ mod tests { use crate::post_asap::{ BoundExpr, CompositionOperator, ErrorMetric, FieldDataType, GroupingStrategy, GuaranteeSource, ProbabilityExpr, Schema, SketchAlgorithm, SketchKind, SketchParams, - SketchQuery, + SketchStatistic, }; let leaf = Rc::new(scan("t", vec![Field::plain("v", DataType::Float64, false)])); let kept = Rc::new(SummaryNode { @@ -1758,7 +1758,7 @@ mod tests { let root = SummaryNode { expr: SummaryExpr::SummaryEstimate { summary_input: agg, - query: SketchQuery::Quantile { q: 0.99 }, + query: SketchStatistic::Quantile { q: 0.99 }, }, schema: Schema::lifted(vec![], None), guarantee: Some(guarantee), diff --git a/crates/types/src/post_asap/cse.rs b/crates/types/src/post_asap/cse.rs index 549c48e15..55889008c 100644 --- a/crates/types/src/post_asap/cse.rs +++ b/crates/types/src/post_asap/cse.rs @@ -356,7 +356,7 @@ mod tests { fn quantile_roots_share_producer_but_not_readout_or_parameters() { use crate::post_asap::{ FieldDataType, GroupingStrategy, SketchAlgorithm, SketchKind, SketchParams, - SketchQuery, SummaryUpdate, + SketchStatistic, SummaryUpdate, }; use crate::pre_asap::{ColumnRef, Reduction}; fn readout(q: f64, alpha: f64) -> Rc { @@ -381,7 +381,7 @@ mod tests { Rc::new(SummaryNode { expr: SummaryExpr::SummaryEstimate { summary_input: producer, - query: SketchQuery::Quantile { q }, + query: SketchStatistic::Quantile { q }, }, schema: Schema::lifted(vec![], None), guarantee: None, diff --git a/crates/types/src/post_asap/execution_data_state.rs b/crates/types/src/post_asap/execution_data_state.rs index d70467ef8..91373816b 100644 --- a/crates/types/src/post_asap/execution_data_state.rs +++ b/crates/types/src/post_asap/execution_data_state.rs @@ -809,7 +809,7 @@ pub enum ExactOperationSchemaError { #[cfg(test)] mod tests { use super::*; - use crate::post_asap::{ExactKind, ExactParams, GroupingStrategy, SketchQuery}; + use crate::post_asap::{ExactKind, ExactParams, GroupingStrategy, SketchStatistic}; use crate::pre_asap::agg_intent::AggIntent; use crate::pre_asap::expr_ir::ColumnRef; use crate::pre_asap::query_expr::{QueryExpr, Reduction, Source}; @@ -907,7 +907,7 @@ mod tests { Rc::new(SummaryNode { expr: SummaryExpr::SummaryEstimate { summary_input: child, - query: SketchQuery::Quantile { q: 0.99 }, + query: SketchStatistic::Quantile { q: 0.99 }, }, schema: plain(&["quantile_0_99"]), guarantee: None, diff --git a/crates/types/src/post_asap/expr.rs b/crates/types/src/post_asap/expr.rs index 9312d95c6..7de1e81db 100644 --- a/crates/types/src/post_asap/expr.rs +++ b/crates/types/src/post_asap/expr.rs @@ -2,7 +2,7 @@ use super::ExecutionTiming; use std::rc::Rc; use super::guarantee::ResultGuarantee; -use super::sketch::{GroupingStrategy, SketchQuery, SummaryUpdate}; +use super::sketch::{GroupingStrategy, SketchStatistic, SummaryUpdate}; use crate::pre_asap::agg_intent::AggIntent; use crate::pre_asap::query_expr::Predicate; use crate::pre_asap::schema::{FieldDataType, Schema}; @@ -37,7 +37,7 @@ pub enum ValueOperation { }, /// Read an aggregate or TopK prefix from the maintained population. ReadPopulation { - readout: super::maintained_population::PopulationReadout, + readout: super::maintained_population::PopulationStatistic, }, Exact(ExactOperation), /// Read an exact accumulator's state as its finalized scalar value. @@ -249,7 +249,7 @@ pub enum SummaryExpr { /// for count/cardinality, `[(key, count)]` for top-k). SummaryEstimate { summary_input: Rc, - query: SketchQuery, + query: SketchStatistic, }, /// ⊕ — union of summaries across stages / shards. Distinct from the diff --git a/crates/types/src/post_asap/maintained_population.rs b/crates/types/src/post_asap/maintained_population.rs index 28aec0e54..1357fa63d 100644 --- a/crates/types/src/post_asap/maintained_population.rs +++ b/crates/types/src/post_asap/maintained_population.rs @@ -27,7 +27,7 @@ pub enum CurrentSeriesMatch { } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub enum PopulationReadout { +pub enum PopulationStatistic { Quantile { q: f64 }, TopK { k: usize }, Sum, @@ -148,11 +148,13 @@ impl MaintainedPopulation { } } - pub fn supports(&self, readout: &PopulationReadout) -> bool { + pub fn supports(&self, readout: &PopulationStatistic) -> bool { match readout { - PopulationReadout::Quantile { q } => self.quantiles && q.is_finite(), - PopulationReadout::TopK { k } => *k <= self.max_k, - PopulationReadout::Sum | PopulationReadout::Count | PopulationReadout::Average => true, + PopulationStatistic::Quantile { q } => self.quantiles && q.is_finite(), + PopulationStatistic::TopK { k } => *k <= self.max_k, + PopulationStatistic::Sum + | PopulationStatistic::Count + | PopulationStatistic::Average => true, } } } diff --git a/crates/types/src/post_asap/mod.rs b/crates/types/src/post_asap/mod.rs index d4715ca79..f71aaca0f 100644 --- a/crates/types/src/post_asap/mod.rs +++ b/crates/types/src/post_asap/mod.rs @@ -68,7 +68,7 @@ pub use query_time::{ pub use sketch::{ default_hydra_params, hydra_kind_for, EntityIdentity, ExactKind, ExactParams, GroupingStrategy, HydraKind, HydraParams, NonNegativeWeightProof, SamplingKind, SamplingParams, SketchAlgorithm, - SketchCategory, SketchKind, SketchParams, SketchQuery, StatModelKind, StatModelParams, + SketchCategory, SketchKind, SketchParams, SketchStatistic, StatModelKind, StatModelParams, SummaryInputExpr, SummaryUpdate, WaveletKind, WaveletParams, WeightDomain, }; pub use summary_maintenance::SummaryMaintenanceMode; diff --git a/crates/types/src/post_asap/post_asap_dag.rs b/crates/types/src/post_asap/post_asap_dag.rs index 5cdbb3d81..d489c055e 100644 --- a/crates/types/src/post_asap/post_asap_dag.rs +++ b/crates/types/src/post_asap/post_asap_dag.rs @@ -9,7 +9,7 @@ use super::{ }; use super::{ BinaryOperator, CandidateCompleteness, ExecutionTiming, FieldDataType, GroupingStrategy, - SketchQuery, SummaryUpdate, ValueOperation, + SketchStatistic, SummaryUpdate, ValueOperation, }; use crate::pre_asap::{ColumnRef, JoinKind, Predicate, QueryExpr, Reduction}; use thiserror::Error; @@ -83,7 +83,7 @@ pub enum PostAsapOperatorPayload { key: ColumnRef, }, SummaryEstimate { - query: SketchQuery, + query: SketchStatistic, }, SummaryMerge, } @@ -625,7 +625,7 @@ mod tests { key: ColumnRef::SampleValue, }, PostAsapOperatorPayload::SummaryEstimate { - query: SketchQuery::Cardinality, + query: SketchStatistic::Cardinality, }, PostAsapOperatorPayload::SummaryMerge, ]; diff --git a/crates/types/src/post_asap/sketch.rs b/crates/types/src/post_asap/sketch.rs index cddb4903a..a5e1edcc1 100644 --- a/crates/types/src/post_asap/sketch.rs +++ b/crates/types/src/post_asap/sketch.rs @@ -592,7 +592,7 @@ pub enum SummaryInputExpr { /// What to extract from a built summary. Carried by `SummaryEstimate`. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub enum SketchQuery { +pub enum SketchStatistic { /// sqrt(sum_v frequency(v)^2), not the norm of numeric input values. FrequencyL2, /// Shannon entropy of the value-frequency distribution, in bits. @@ -646,9 +646,12 @@ mod tests { serde_json::from_str::(&input_json).unwrap(), input ); - let query = SketchQuery::TopK { k: 10 }; + let query = SketchStatistic::TopK { k: 10 }; let json = serde_json::to_string(&query).unwrap(); - assert_eq!(serde_json::from_str::(&json).unwrap(), query); + assert_eq!( + serde_json::from_str::(&json).unwrap(), + query + ); } } diff --git a/docs/design_docs/proposals/operator-sharing.md b/docs/design_docs/proposals/operator-sharing.md index 3420c7d58..1851d1809 100644 --- a/docs/design_docs/proposals/operator-sharing.md +++ b/docs/design_docs/proposals/operator-sharing.md @@ -159,11 +159,11 @@ enum ASAPOp { reduction: Reduction, grouping: GroupingStrategy, }, SummaryEstimate { - summary_input: Rc, query: SketchQuery, + summary_input: Rc, query: SketchStatistic, }, FinalizeExactAccumulator { child: Rc }, MaintainPopulation { child: Rc, population: MaintainedPopulation }, - ReadPopulation { child: Rc, readout: PopulationReadout }, + ReadPopulation { child: Rc, readout: PopulationStatistic }, // Reserved operations; semantics and support require further design. SummaryMerge { children: Vec> }, diff --git a/docs/develop_docs/asap-aware-mapping-contracts.md b/docs/develop_docs/asap-aware-mapping-contracts.md index d642cbfb5..447cb3823 100644 --- a/docs/develop_docs/asap-aware-mapping-contracts.md +++ b/docs/develop_docs/asap-aware-mapping-contracts.md @@ -250,7 +250,7 @@ bounds, but does not execute workloads or own deployment measurements. Most hook - **`readout_extension`** — define how queries read an extension summary that `realize_extension` mapped to a `Sketch`. The two hooks are a pair: realization defines what is maintained; readout defines how it is queried. Override both for the same `ext_kind`. The default readout panics to prevent a silent wrong answer. ```rust - fn readout_extension(&self, ext_kind: &str, payload: &serde_json::Value, col: &ColumnRef) -> SketchQuery; + fn readout_extension(&self, ext_kind: &str, payload: &serde_json::Value, col: &ColumnRef) -> SketchStatistic; ``` - **`cse_recompute_cost`** — estimate the one-time cost of recomputing a CSE candidate's sub-DAG independently at a single consumer. Default: `default_cse_recompute_cost`, a structural-size proxy. diff --git a/docs/develop_docs/extend-asap-aware-mapping.md b/docs/develop_docs/extend-asap-aware-mapping.md index c8c1b4973..5a5e069a8 100644 --- a/docs/develop_docs/extend-asap-aware-mapping.md +++ b/docs/develop_docs/extend-asap-aware-mapping.md @@ -651,7 +651,7 @@ fn readout_extension( ext_kind: &str, payload: &serde_json::Value, col: &ColumnRef, -) -> SketchQuery; +) -> SketchStatistic; ``` This complements `realize_extension`: realization defines what gets maintained; readout defines how it is queried (see the [CostModel reference](asap-aware-mapping-contracts.md#costmodel)).