Repository navigation
Commit 66a9952
feat(ir): derive summary coverage as definition + selection (#646)
* feat(ir): derive summary coverage as definition + selection
Coverage is derived from the node, never declared. For a SummaryAgg,
predicate conjuncts that lift through Filter, a range TimeRange, a
TimeShift without @ and direct-column Project items, and are a value set
or an interval on one column, form the selection; everything else stays
in the definition (the SummaryAgg with the selection removed). A
TimeRange(w) over TimeShift(s) gives the relative window (-(s+w), -s].
A SummaryMerge is valid only when its inputs have structurally equal
definitions (ignoring timing and guarantee) and pairwise disjoint
selections; OperatorNode::new and validate_structure enforce it. Its
coverage is the shared definition and the union of the selections,
joining adjacent windows and value sets.
OperatorNode.coverage becomes a private cache behind coverage():
ignored by equality, skipped by serde, emptied on clone. with_coverage,
requires_coverage and CoverageError::Missing are removed, as are the
coverage fields of CSE keys and FlatNode.
Design: docs/design_docs/proposals/asap-primitive-schema.md §4 (#573).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
* fix(ir): keep ambiguous columns and untyped-equal literals out of selections
From an independent review of the derivation:
- a column whose (table, name) is not unique in the agg child's schema
cannot be named in a selection, so its conjuncts stay in the definition;
- value sets compare literals by typed order, so 1 and 1.0 (or NaN) are
never proven different;
- a partly lifted Scan predicate is rebuilt with only its residual.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
* test(ir): cover the design doc's worked coverage example
Point the module docs at #573 §4.2 and note that a Project renames
columns in their identity.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
* perf(ir): cache a merge's coverage when it is checked
OperatorNode::new and validate_structure derived a SummaryMerge's coverage
to check it and dropped the result, so coverage() derived it again. Store
it in the cache instead. Also correct two comments (Project qualifier,
absolute time needs timestamp literals).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
* test(ir): worked example follows the SQL query of the design doc
The #573 worked example (§4.2.2) is now a SQL query; build the DAG the SQL
frontend lowers it to (WHERE folded into Scan.predicates, no time window).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
* feat(ir): join touching value ranges in a merged selection
Value ranges on one column now join like touching time windows, so every
selection dimension follows Goldstein & Larson's one-range-per-column form.
The joined range stays explicit: neither input took NULL rows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
* fix(ir): derive coverage on each call and keep renaming nodes
Review of #646:
- The coverage cache could go stale: `operator` and `schema` are public,
so a node edited in place (e.g. through `Rc::make_mut`) kept the
coverage of its old value. Drop the cache; `coverage()` derives on each
call and returns an owned value.
- A `Filter`, `TimeRange` or `TimeShift` whose schema renames columns was
removed from the definition once everything was lifted out of it, taking
the rename with it, so `tier = 'eu'` named `region` looked disjoint from
`region = 'us'`. The walk now stops at such a node, which stays in the
definition.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W7qG9aFyPij5uWsyAJCxDW
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>1 parent 0ebeb9d commit 66a9952
8 files changed
Lines changed: 1348 additions & 353 deletions
File tree
- crates/types
- src/ir
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
115 | | - | |
116 | 115 | | |
117 | 116 | | |
118 | 117 | | |
| |||
168 | 167 | | |
169 | 168 | | |
170 | 169 | | |
171 | | - | |
172 | 170 | | |
173 | 171 | | |
174 | 172 | | |
| |||
250 | 248 | | |
251 | 249 | | |
252 | 250 | | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | | - | |
259 | | - | |
260 | | - | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
261 | 254 | | |
262 | 255 | | |
263 | 256 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
19 | 18 | | |
20 | 19 | | |
21 | 20 | | |
| |||
31 | 30 | | |
32 | 31 | | |
33 | 32 | | |
34 | | - | |
35 | | - | |
36 | 33 | | |
37 | 34 | | |
38 | 35 | | |
| |||
80 | 77 | | |
81 | 78 | | |
82 | 79 | | |
83 | | - | |
84 | 80 | | |
85 | 81 | | |
86 | 82 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
103 | | - | |
104 | | - | |
105 | 103 | | |
106 | 104 | | |
107 | 105 | | |
| |||
110 | 108 | | |
111 | 109 | | |
112 | 110 | | |
113 | | - | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
| |||
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
127 | | - | |
128 | 127 | | |
129 | 128 | | |
130 | 129 | | |
| |||
145 | 144 | | |
146 | 145 | | |
147 | 146 | | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
159 | | - | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
160 | 152 | | |
161 | 153 | | |
162 | | - | |
163 | | - | |
164 | | - | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
165 | 161 | | |
166 | 162 | | |
167 | 163 | | |
| |||
315 | 311 | | |
316 | 312 | | |
317 | 313 | | |
318 | | - | |
319 | | - | |
320 | | - | |
321 | | - | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | 314 | | |
| 315 | + | |
326 | 316 | | |
327 | 317 | | |
328 | 318 | | |
| |||
0 commit comments