Skip to content

Commit eb3f3e3

Browse files
zzylolclaude
andcommitted
refactor(planner): port the extracted Stage 1 crate to derived coverage and flat DAGs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
1 parent b4df965 commit eb3f3e3

7 files changed

Lines changed: 26 additions & 135 deletions

File tree

‎crates/asap-aware-mapping/src/test_support.rs‎

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ pub(crate) fn lower_promql(query: &str, accuracy: AccuracyTarget) -> Rc<Operator
4747
// `OperatorNode::new_shared`, so a fixture is exactly what a front end
4848
// would hand the planner.
4949

50-
use asap_types::ir::operator::AggIntent;
51-
use asap_types::ir::operator::{GroupKeys, Reduction, Source};
52-
use asap_types::ir::schema::{ColumnId, DataType, Field, Schema};
53-
use asap_types::ir::{apply_materialization_timings, MaterializationAssignment, TimingMemo};
54-
use asap_types::ir::{NonASAPOp, Predicate, ScalarExpr, TimeRangeKind};
5550
use asap_types::ir::operator::agg_intent::AggIntent;
5651
use asap_types::ir::operator::operator_properties::{Reduction, Source};
5752
use asap_types::ir::schema::{ColumnId, DataType, Field, Schema};
@@ -127,86 +122,3 @@ pub(crate) fn agg(
127122
) -> Rc<OperatorNode> {
128123
aggregate(Reduction::by(by), vec![intent], vec![], None, child)
129124
}
130-
131-
/// `intent without (excluded)`.
132-
pub(crate) fn without_agg(
133-
excluded: Vec<ColumnId>,
134-
intent: AggIntent,
135-
child: Rc<OperatorNode>,
136-
) -> Rc<OperatorNode> {
137-
aggregate(
138-
Reduction::Reduce(GroupKeys::without(excluded)),
139-
vec![intent],
140-
vec![],
141-
None,
142-
child,
143-
)
144-
}
145-
146-
/// A per-entity (per-series) single-measure aggregate.
147-
pub(crate) fn agg_per_entity(intent: AggIntent, child: Rc<OperatorNode>) -> Rc<OperatorNode> {
148-
aggregate(Reduction::PerEntity, vec![intent], vec![], None, child)
149-
}
150-
151-
pub(crate) fn filter(pred: ScalarExpr, child: Rc<OperatorNode>) -> Rc<OperatorNode> {
152-
OperatorNode::new_shared(asap_types::ir::Operator::NonASAP(NonASAPOp::Filter {
153-
pred: Predicate(pred),
154-
child,
155-
}))
156-
.unwrap()
157-
}
158-
159-
pub(crate) fn dedup(cols: Vec<ColumnId>, child: Rc<OperatorNode>) -> Rc<OperatorNode> {
160-
OperatorNode::new_shared(asap_types::ir::Operator::NonASAP(NonASAPOp::Dedup {
161-
cols,
162-
child,
163-
}))
164-
.unwrap()
165-
}
166-
167-
/// An explicit range selector `child[range]`.
168-
pub(crate) fn time_range(range: Duration, child: Rc<OperatorNode>) -> Rc<OperatorNode> {
169-
OperatorNode::new_shared(asap_types::ir::Operator::NonASAP(NonASAPOp::TimeRange {
170-
range,
171-
kind: TimeRangeKind::Range,
172-
child,
173-
}))
174-
.unwrap()
175-
}
176-
177-
/// `root` timed under the default (every summary at query time)
178-
/// assignment — the shape export and the post-ASAP validators consume.
179-
pub(crate) fn timed(root: &Rc<OperatorNode>) -> Rc<OperatorNode> {
180-
apply_materialization_timings(
181-
root,
182-
&MaterializationAssignment::all_query_time(),
183-
&mut TimingMemo::new(),
184-
)
185-
.expect("default materialization timings apply")
186-
}
187-
188-
/// `root` timed with every summary maintained at ingestion time.
189-
pub(crate) fn maintained(root: &Rc<OperatorNode>) -> Rc<OperatorNode> {
190-
apply_materialization_timings(
191-
root,
192-
&MaterializationAssignment::all_ingestion_time(),
193-
&mut TimingMemo::new(),
194-
)
195-
.expect("maintained materialization timings apply")
196-
}
197-
198-
/// Time `root` under the default materialization assignment (which runs every
199-
/// data-state / population-contract check) and export it as a physical ASAP DAG.
200-
pub(crate) fn time_and_export(
201-
root: &Rc<OperatorNode>,
202-
) -> Result<
203-
asap_types::ir::physical_export::PhysicalASAPDAG,
204-
asap_types::ir::properties::ExecutionDataStateError,
205-
> {
206-
let timed = apply_materialization_timings(
207-
root,
208-
&MaterializationAssignment::all_query_time(),
209-
&mut TimingMemo::new(),
210-
)?;
211-
asap_types::ir::physical_export::compile_physical_asap_dag(&timed)
212-
}

‎crates/devtools/src/bin/stage_pipeline.rs‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,8 @@ use asap_aware_mapping::PlanningModels;
3030
use asap_logical_optimizer::pass1::logical_candidates::{
3131
choice_index, enumerate_local_logical_candidates, LocalLogicalCandidates,
3232
};
33-
use asap_aware_mapping::plan_selection::{select_exhaustive, Selection, MAX_ENUMERATED_CANDIDATES};
34-
use asap_aware_mapping::{PlanningModels, Realization};
35-
use asap_types::ir::flat::{flatten, FlatDag};
3633
use asap_logical_optimizer::Realization;
37-
use asap_types::ir::physical_export::{
38-
compile_logical_asap_workload, LogicalASAPDAG, LogicalASAPDAGDocument};
34+
use asap_types::ir::flat::{flatten, FlatDag};
3935
use asap_types::ir::schema::SketchAlgorithm;
4036
use asap_types::ir::schema_support::with_promql_series_identity;
4137
use asap_types::ir::{OperatorNode, QueryRoot};

‎crates/frontend-sql/tests/maintained_population.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
//! SQL and PromQL use the same shared-state rule without sharing membership semantics.
22
use asap_frontend_sql::{lower_sql, SqlCatalog};
33
use asap_logical_optimizer::pass1::maintained_population::MaintainedPopulationStrategy;
4-
use asap_types::ir::cse::share_common_sub_dags;
5-
use asap_types::ir::physical_export::compile_physical_asap_dag;
64
use asap_types::ir::operator::maintained_population::{MaintainedPopulation, PopulationInput};
75
use asap_types::ir::schema::{DataType, Field, Schema};
86
use asap_types::{
97
ir::{
108
apply_materialization_timings, cse::share_common_sub_dags,
119
physical_export::compile_physical_asap_dag, ASAPOp, MaterializationAssignment, NonASAPOp,
12-
Operator, OperatorNode, TimingMemo},
13-
types::AccuracyTarget};
10+
Operator, OperatorNode, TimingMemo,
11+
},
12+
types::AccuracyTarget,
13+
};
1414
use std::rc::Rc;
1515

1616
async fn aggregate(q: &str) -> Rc<OperatorNode> {

‎crates/integration-tests/tests/promql_to_post_asap.rs‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ use asap_integration_tests::fixtures::lower_promql;
1414
use asap_integration_tests::post_asap::{
1515
maintained, maintained_post_asap_dag, post_asap_dag, timed,
1616
};
17-
use asap_types::ir::operator::Reduction;
18-
use asap_types::ir::physical_export::PhysicalASAPOperatorPayload;
1917
use asap_logical_optimizer::accuracy::{
2018
AccuracyEvidenceProvider, DefaultAccuracyModel, EqualSplitAllocator, PropagationStats,
2119
QuantileInputDomain,
@@ -27,8 +25,8 @@ use asap_logical_optimizer::{
2725
search_workload, search_workload_with_targets, ASAPStrategies, AccuracyModel, Replacement,
2826
ReplacementStrategy, ReplacementSubDAG, TargetSubDAG,
2927
};
30-
use asap_types::ir::physical_export::{ PhysicalASAPOperatorPayload};
31-
use asap_types::ir::operator::operator_properties::Reduction;
28+
use asap_types::ir::operator::Reduction;
29+
use asap_types::ir::physical_export::PhysicalASAPOperatorPayload;
3230
use asap_types::ir::properties::CompositionOperator;
3331
use asap_types::ir::scalar::ColumnRef;
3432
use asap_types::ir::schema::DataType;

‎crates/integration-tests/tests/sql_to_post_asap.rs‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,13 @@ use asap_aware_mapping::plan_selection::candidate_selection::global_selection;
2323
use asap_aware_mapping::DefaultCostModel;
2424
use asap_frontend_sql::{lower_sql, lower_sql_dialect, SqlCatalog};
2525
use asap_integration_tests::post_asap::post_asap_dag;
26-
use asap_types::ir::operator::Reduction;
27-
use asap_types::ir::physical_export::{EdgeRole, PhysicalASAPNodeId, PhysicalASAPOperatorPayload};
2826
use asap_logical_optimizer::pass1::replacement::{retain_exact, RealizationError};
2927
use asap_logical_optimizer::{
3028
search_workload, ASAPStrategies, Replacement, ReplacementStrategy, ReplacementSubDAG,
3129
TargetSubDAG,
3230
};
33-
use asap_types::ir::physical_export::{
34-
EdgeRole, PhysicalASAPNodeId, PhysicalASAPOperatorPayload};
35-
use asap_types::ir::operator::operator_properties::Reduction;
31+
use asap_types::ir::operator::Reduction;
32+
use asap_types::ir::physical_export::{EdgeRole, PhysicalASAPNodeId, PhysicalASAPOperatorPayload};
3633
use asap_types::ir::scalar::ColumnRef;
3734
use asap_types::ir::schema::{DataType, Field, Schema};
3835
use asap_types::ir::schema::{

‎crates/logical-optimizer/src/pass1/replacement.rs‎

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,6 @@ use std::collections::{HashMap, HashSet, VecDeque};
351351
use asap_types::ir::cse::{share_common_sub_dags, structural_hash, HashCache};
352352
use asap_types::ir::operator::agg_intent::{agg_is_mergeable, AggIntent};
353353
use asap_types::ir::operator::operator_properties::{BinaryOpKind, JoinKind, Reduction};
354-
use asap_types::ir::properties::summary_coverage::{CoverageRegion, SummaryCoverage};
355354
use asap_types::ir::properties::timing::validate_maintained;
356355
use asap_types::ir::properties::{
357356
AccuracyError, CompositionOperator, GuaranteeSource, ResultGuarantee,
@@ -4784,10 +4783,8 @@ fn relink_agg_child(node: &Rc<OperatorNode>, new_child: &Rc<OperatorNode>) -> Rc
47844783
if Rc::ptr_eq(child, new_child) {
47854784
return Rc::clone(node);
47864785
}
4787-
// The same summary over a re-placed input keeps its coverage.
4788-
let rebuilt = std::rc::Rc::new(OperatorNode {
4789-
coverage: node.coverage.clone(),
4790-
..OperatorNode::with_schema(
4786+
let rebuilt = std::rc::Rc::new(
4787+
OperatorNode::with_schema(
47914788
asap_types::ir::Operator::ASAP(ASAPOp::SummaryAgg {
47924789
child: Rc::clone(new_child),
47934790
family: family.clone(),
@@ -4798,8 +4795,8 @@ fn relink_agg_child(node: &Rc<OperatorNode>, new_child: &Rc<OperatorNode>) -> Rc
47984795
}),
47994796
node.schema.clone(),
48004797
)
4801-
.with_guarantee(node.guarantee.clone())
4802-
});
4798+
.with_guarantee(node.guarantee.clone()),
4799+
);
48034800
match validate_maintained(&rebuilt, ExecutionTiming::IngestionTime) {
48044801
Ok(_) => rebuilt,
48054802
Err(_) => Rc::clone(node),
@@ -8400,20 +8397,13 @@ mod tests {
84008397
}
84018398
}
84028399

8403-
// Whole-source coverage names one source; over two it is not declared.
8404-
#[test]
8405-
fn whole_source_coverage_needs_exactly_one_source() {
8406-
let left = metric_scan(&["job"]);
8407-
let right = crate::test_support::scan("n", left.schema.clone());
8408-
assert!(whole_source_coverage(&left).is_some());
8409-
let join = OperatorNode::new_shared(asap_types::ir::Operator::NonASAP(NonASAPOp::Join {
8410-
kind: asap_types::ir::operator::operator_properties::JoinKind::Inner,
8411-
pred: equi_pred(0, 2),
8412-
left,
8413-
right,
8414-
}))
8415-
.unwrap();
8416-
assert_eq!(whole_source_coverage(&join), None);
8400+
fn equi_pred(left: ColumnId, right: ColumnId) -> Predicate {
8401+
Predicate(ScalarExpr::Compare {
8402+
left: Box::new(ScalarExpr::Column(left)),
8403+
op: asap_types::ir::scalar::CompareOpKind::Eq,
8404+
right: Box::new(ScalarExpr::Column(right)),
8405+
semantics: asap_types::ir::ExprSemantics::Sql,
8406+
})
84178407
}
84188408

84198409
#[test]

‎crates/logical-optimizer/src/test_support.rs‎

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,10 @@ pub(crate) fn lower_promql(query: &str, accuracy: AccuracyTarget) -> Rc<Operator
5050

5151
use std::time::Duration;
5252

53-
use asap_types::ir::operator::agg_intent::AggIntent;
54-
use asap_types::ir::operator::operator_properties::{GroupKeys, Reduction, Source};
55-
use asap_types::ir::properties::timing::{
56-
apply_materialization_timings, MaterializationAssignment, TimingMemo,
57-
};
53+
use asap_types::ir::operator::AggIntent;
54+
use asap_types::ir::operator::{GroupKeys, Reduction, Source};
5855
use asap_types::ir::schema::{ColumnId, DataType, Field, Schema};
56+
use asap_types::ir::{apply_materialization_timings, MaterializationAssignment, TimingMemo};
5957
use asap_types::ir::{NonASAPOp, Predicate, ScalarExpr, TimeRangeKind};
6058

6159
/// A `TimeSeries("m")` scan over `[ts(0), value(1), labels...]`, time index 0,
@@ -201,13 +199,13 @@ pub(crate) fn maintained(root: &Rc<OperatorNode>) -> Rc<OperatorNode> {
201199
pub(crate) fn time_and_export(
202200
root: &Rc<OperatorNode>,
203201
) -> Result<
204-
asap_types::ir::export::PhysicalASAPDAG,
205-
asap_types::ir::properties::execution::ExecutionDataStateError,
202+
asap_types::ir::physical_export::PhysicalASAPDAG,
203+
asap_types::ir::properties::ExecutionDataStateError,
206204
> {
207205
let timed = apply_materialization_timings(
208206
root,
209207
&MaterializationAssignment::all_query_time(),
210208
&mut TimingMemo::new(),
211209
)?;
212-
asap_types::ir::export::compile_physical_asap_dag(&timed)
210+
asap_types::ir::physical_export::compile_physical_asap_dag(&timed)
213211
}

0 commit comments

Comments
 (0)