Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions crates/e2e/tests/l4_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ fn promql_quantile_of_rate_binds_kll_over_rate_accumulator() {

// Root: the sketch readout, back to a plain row shape.
let SummaryExpr::SummaryEstimate {
sketch_input,
summary_input,
query,
} = &root.expr
else {
Expand All @@ -66,15 +66,15 @@ fn promql_quantile_of_rate_binds_kll_over_rate_accumulator() {
// same empty `by: []` (issue #163).
let SummaryExpr::SummaryAgg {
child,
sketch,
summary,
params,
col,
reduction,
} = &sketch_input.expr
} = &summary_input.expr
else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(sketch, &SummaryKind::Kll);
assert_eq!(summary, &SummaryKind::Kll);
assert_eq!(params, &SummaryParams::Kll { k: 200 });
assert_eq!(col, &ColumnRef::SampleValue);
assert_eq!(
Expand All @@ -83,7 +83,7 @@ fn promql_quantile_of_rate_binds_kll_over_rate_accumulator() {
"global quantile — no group keys, full reduction"
);
assert_eq!(
dtype(&sketch_input.schema, "quantile_0_99"),
dtype(&summary_input.schema, "quantile_0_99"),
&L4DataType::Sketch(SummaryKind::Kll, SummaryParams::Kll { k: 200 })
);

Expand All @@ -92,15 +92,15 @@ fn promql_quantile_of_rate_binds_kll_over_rate_accumulator() {
// grouping concept at all — every entity stays its own summary.
let SummaryExpr::SummaryAgg {
child: leaf,
sketch,
summary,
params,
reduction,
..
} = &child.expr
else {
panic!("expected inner SummaryAgg for rate, got {:?}", child.expr);
};
assert_eq!(sketch, &SummaryKind::Rate);
assert_eq!(summary, &SummaryKind::Rate);
assert_eq!(params, &SummaryParams::Rate);
assert_eq!(reduction, &Reduction::PerEntity);
assert_eq!(
Expand Down Expand Up @@ -140,15 +140,15 @@ fn promql_exact_workload_binds_accumulators_not_sketches() {
.expect("lowering failed");
let root = implement_tree(&l3).expect("binding failed");
let SummaryExpr::SummaryAgg {
sketch,
summary,
params,
reduction,
..
} = &root.expr
else {
panic!("expected SummaryAgg, got {:?}", root.expr);
};
assert_eq!(sketch, &SummaryKind::Sum);
assert_eq!(summary, &SummaryKind::Sum);
assert_eq!(params, &SummaryParams::Sum);
assert_eq!(
reduction,
Expand Down
101 changes: 53 additions & 48 deletions crates/plan/src/bind.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,11 @@ pub fn implement_tree_in_with(
// nodes and HAVING stay logical — see the module docs.)
if let ([intent], None) = (aggs.as_slice(), having) {
match implementation_for_with(intent, cost_model) {
Implementation::Sketch { kind, params } => {
Implementation::Summary { kind, params } => {
let estimate = !kind.is_exact();
return bind_summary_agg(
expr, reduction, intent, child, kind, params, scope, true, cost_model,
)
}
Implementation::ExactAccumulator { kind, params } => {
return bind_summary_agg(
expr, reduction, intent, child, kind, params, scope, false, cost_model,
)
expr, reduction, intent, child, kind, params, scope, estimate, cost_model,
);
}
Implementation::PassThrough => {}
}
Expand Down Expand Up @@ -154,7 +150,7 @@ fn bind_summary_agg(
let agg = Rc::new(L4Node {
expr: SummaryExpr::SummaryAgg {
child: implement_tree_in_with(child, scope, cost_model)?,
sketch: kind,
summary: kind,
params,
col,
reduction: reduction.clone(),
Expand All @@ -166,7 +162,7 @@ fn bind_summary_agg(
// row shape again (the `Sketch(…)` type does not propagate).
Some(query) => Ok(Rc::new(L4Node {
expr: SummaryExpr::SummaryEstimate {
sketch_input: agg,
summary_input: agg,
query,
},
schema: lift(&out_schema),
Expand Down Expand Up @@ -324,7 +320,7 @@ mod tests {
let root = implement_tree(&q).unwrap();

let SummaryExpr::SummaryEstimate {
sketch_input,
summary_input,
query,
} = &root.expr
else {
Expand All @@ -343,21 +339,21 @@ mod tests {

let SummaryExpr::SummaryAgg {
child,
sketch,
summary,
params,
col,
reduction,
} = &sketch_input.expr
} = &summary_input.expr
else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(sketch, &SummaryKind::Kll);
assert_eq!(summary, &SummaryKind::Kll);
assert_eq!(params, &SummaryParams::Kll { k: 200 });
assert_eq!(col, &ColumnRef::SampleValue);
assert_eq!(reduction, &Reduction::by(vec![2]));
// SummaryAgg edge: the state column carries the committed (kind, params).
assert_eq!(
field(&sketch_input.schema, "quantile_0_99").dtype,
field(&summary_input.schema, "quantile_0_99").dtype,
L4DataType::Sketch(SummaryKind::Kll, SummaryParams::Kll { k: 200 })
);
assert!(matches!(child.expr, SummaryExpr::Logical(ref e)
Expand Down Expand Up @@ -390,23 +386,26 @@ mod tests {

// Default: KLL (see `quantile_binds_kll_wrapped_in_estimate` above).
let default_root = implement_tree(&q).unwrap();
let SummaryExpr::SummaryEstimate { sketch_input, .. } = &default_root.expr else {
let SummaryExpr::SummaryEstimate { summary_input, .. } = &default_root.expr else {
panic!("expected SummaryEstimate root, got {:?}", default_root.expr);
};
let SummaryExpr::SummaryAgg { sketch, .. } = &sketch_input.expr else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
let SummaryExpr::SummaryAgg { summary, .. } = &summary_input.expr else {
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(sketch, &SummaryKind::Kll);
assert_eq!(summary, &SummaryKind::Kll);

// With `PreferDDSketch`: DDSketch instead, same query.
let custom_root = implement_tree_with(&q, &PreferDDSketch).unwrap();
let SummaryExpr::SummaryEstimate { sketch_input, .. } = &custom_root.expr else {
let SummaryExpr::SummaryEstimate { summary_input, .. } = &custom_root.expr else {
panic!("expected SummaryEstimate root, got {:?}", custom_root.expr);
};
let SummaryExpr::SummaryAgg { sketch, params, .. } = &sketch_input.expr else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
let SummaryExpr::SummaryAgg {
summary, params, ..
} = &summary_input.expr
else {
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(sketch, &SummaryKind::DDSketch);
assert_eq!(summary, &SummaryKind::DDSketch);
assert_eq!(params, &SummaryParams::DDSketch { alpha: 0.01 });
}

Expand All @@ -432,7 +431,7 @@ mod tests {
_payload: &serde_json::Value,
) -> crate::boundary::Implementation {
if ext_kind == "frequency" {
crate::boundary::Implementation::Sketch {
crate::boundary::Implementation::Summary {
kind: SummaryKind::CountSketch,
params: SummaryParams::CountSketch {
width: 256,
Expand Down Expand Up @@ -483,7 +482,7 @@ mod tests {
let root = implement_tree_with(&q, &FrequencyCostModel).unwrap();

let SummaryExpr::SummaryEstimate {
sketch_input,
summary_input,
query,
} = &root.expr
else {
Expand All @@ -495,10 +494,13 @@ mod tests {
if k == "item" && v == "checkout"
));

let SummaryExpr::SummaryAgg { sketch, params, .. } = &sketch_input.expr else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
let SummaryExpr::SummaryAgg {
summary, params, ..
} = &summary_input.expr
else {
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(sketch, &SummaryKind::CountSketch);
assert_eq!(summary, &SummaryKind::CountSketch);
assert_eq!(
params,
&SummaryParams::CountSketch {
Expand All @@ -512,13 +514,16 @@ mod tests {
fn exact_sum_binds_accumulator_without_estimate() {
let q = agg(vec![2], AggIntent::Sum { col: None }, metric_scan(&["job"]));
let root = implement_tree(&q).unwrap();
let SummaryExpr::SummaryAgg { sketch, params, .. } = &root.expr else {
let SummaryExpr::SummaryAgg {
summary, params, ..
} = &root.expr
else {
panic!(
"expected bare SummaryAgg (no estimate), got {:?}",
root.expr
);
};
assert_eq!(sketch, &SummaryKind::Sum);
assert_eq!(summary, &SummaryKind::Sum);
assert_eq!(params, &SummaryParams::Sum);
assert_eq!(
field(&root.schema, "sum").dtype,
Expand All @@ -538,10 +543,10 @@ mod tests {
},
);
let root = implement_tree(&q).unwrap();
let SummaryExpr::SummaryAgg { sketch, .. } = &root.expr else {
let SummaryExpr::SummaryAgg { summary, .. } = &root.expr else {
panic!("expected SummaryAgg, got {:?}", root.expr);
};
assert_eq!(sketch, &SummaryKind::Rate);
assert_eq!(summary, &SummaryKind::Rate);
assert_eq!(
root.schema
.fields
Expand Down Expand Up @@ -572,11 +577,11 @@ mod tests {
},
);
let root = implement_tree(&q).unwrap();
let SummaryExpr::SummaryEstimate { sketch_input, .. } = &root.expr else {
let SummaryExpr::SummaryEstimate { summary_input, .. } = &root.expr else {
panic!("expected estimate root, got {:?}", root.expr);
};
let SummaryExpr::SummaryAgg { reduction, .. } = &sketch_input.expr else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
let SummaryExpr::SummaryAgg { reduction, .. } = &summary_input.expr else {
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(reduction, &Reduction::PerEntity);
}
Expand All @@ -594,11 +599,11 @@ mod tests {
};
let q = agg(vec![], intent, metric_scan(&["job"]));
let root = implement_tree(&q).unwrap();
let SummaryExpr::SummaryEstimate { sketch_input, .. } = &root.expr else {
let SummaryExpr::SummaryEstimate { summary_input, .. } = &root.expr else {
panic!("expected estimate root, got {:?}", root.expr);
};
let SummaryExpr::SummaryAgg { reduction, .. } = &sketch_input.expr else {
panic!("expected SummaryAgg, got {:?}", sketch_input.expr);
let SummaryExpr::SummaryAgg { reduction, .. } = &summary_input.expr else {
panic!("expected SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(reduction, &Reduction::by(vec![]));
}
Expand All @@ -611,15 +616,15 @@ mod tests {
let outer = agg(vec![], default_quantile(0.9), inner);
let root = implement_tree(&outer).unwrap();

let SummaryExpr::SummaryEstimate { sketch_input, .. } = &root.expr else {
let SummaryExpr::SummaryEstimate { summary_input, .. } = &root.expr else {
panic!("expected estimate root, got {:?}", root.expr);
};
let SummaryExpr::SummaryAgg { child, sketch, .. } = &sketch_input.expr else {
panic!("expected outer SummaryAgg, got {:?}", sketch_input.expr);
let SummaryExpr::SummaryAgg { child, summary, .. } = &summary_input.expr else {
panic!("expected outer SummaryAgg, got {:?}", summary_input.expr);
};
assert_eq!(sketch, &SummaryKind::Kll);
assert_eq!(summary, &SummaryKind::Kll);
let SummaryExpr::SummaryAgg {
sketch: inner_kind,
summary: inner_kind,
child: leaf,
..
} = &child.expr
Expand Down Expand Up @@ -659,7 +664,7 @@ mod tests {
fn find_summary_col(node: &L4Node) -> Option<ColumnRef> {
match &node.expr {
SummaryExpr::SummaryAgg { col, .. } => Some(col.clone()),
SummaryExpr::SummaryEstimate { sketch_input, .. } => find_summary_col(sketch_input),
SummaryExpr::SummaryEstimate { summary_input, .. } => find_summary_col(summary_input),
_ => None,
}
}
Expand Down Expand Up @@ -739,17 +744,17 @@ mod tests {
);
let root = implement_tree(&q).unwrap();
let SummaryExpr::SummaryEstimate {
sketch_input,
summary_input,
query,
} = &root.expr
else {
panic!("expected estimate root, got {:?}", root.expr);
};
assert!(matches!(query, SketchQuery::TopK { k: 5 }));
assert!(matches!(
&sketch_input.expr,
&summary_input.expr,
SummaryExpr::SummaryAgg {
sketch: SummaryKind::CmsWithHeap,
summary: SummaryKind::CmsWithHeap,
..
}
));
Expand Down
Loading
Loading