Conversation
This was referenced Oct 3, 2026
zzylol
force-pushed
the
stack/528-02b-merge-structure
branch
6 times, most recently
from
October 3, 2026 17:29
3ab6be7 to
77628c8
Compare
zzylol
force-pushed
the
stack/528-02b-merge-structure
branch
from
October 3, 2026 17:40
77628c8 to
02a6a1b
Compare
zzylol
force-pushed
the
stack/528-02b-merge-structure
branch
2 times, most recently
from
October 3, 2026 19:45
60a9e4f to
cb00197
Compare
zzylol
marked this pull request as draft
October 3, 2026 20:02
zzylol
force-pushed
the
stack/528-02b-merge-structure
branch
from
October 3, 2026 20:48
cb00197 to
700838b
Compare
This was referenced Oct 3, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…coverage examples SummaryCoverage no longer repeats input/reduction, so SummaryMerge compares them through OperatorNode::summary_update. summary_coverage_examples.rs builds each example in docs/develop_docs/summary-coverage.md as a SummaryAgg -> SummaryMerge plan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… doc Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol
force-pushed
the
stack/528-02b-merge-structure
branch
from
October 5, 2026 06:21
700838b to
f2b7b3f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rebased on main d4869a7 (DF 54).
Why
First scope in the revised implementation order for #511/#509, above merged #535/#536. Extracts structural summary merge support from #555 before logical graph infrastructure.
Before this PR: constructing
ASAPOp::SummaryMergefails because the operation is reserved.After this PR: two structurally compatible KLL states can form a typed logical merge with no execution-phase assignment. This validates schema compatibility and conservatively proves disjoint coverage using #567's
SummaryCoverage. Merge inputs must be nonempty, carry state with exactly one state field, and have identical family/parameter/grouping schemas. Empty, raw and mismatched states fail.Schema/result-kind/state identity, coverage derivation and regression tests are included. Runtime execution, materialization and derived timing belong to the later physical scopes. Subtract/delete remain reserved.
Key code interface
SummaryMergeis a logical ASAP operator whose inputs are existing operator nodes producing partial state:It uses the same node construction and validation APIs as other operators:
Here
pane_aandpane_bareRc<OperatorNode>state producers.new_sharedreturnsResult<Rc<OperatorNode>, SchemaDerivationError>and derives the output schema/result kind.validate_structurechecks the complete reachable DAG, including the producers. No timing assignment is required.The key
ASAPOpmethods are:For
SummaryMerge:validate_inputsenforces the compatibility rules below.output_schemavalidates inputs, then clones the first input's complete schema.output_kindisOperatorResultKind::State.produced_statereturns the non-plain field type from the first input. This is a metadata accessor, not a runtime merge or an independent validation step.Coverage before and after merging
Why
Schemaequality alone is not enough is explained in #567. This PR uses #567'sSummaryCoverage. Coverage is required on summary nodes,SummaryMergeincluded. Every merge input must havecoverage,newderives the output coverage withSummaryCoverage::merge_disjoint, andvalidate_structurerejects a retained output coverage that differs from that union. The schema is unchanged.(job: Utf8, state: KLL{k=200}))[0,1)+[1,2)[0,2)Coverage(PossibleOverlap)[0,1)+[2,3)[0,1) ∪ [2,3), gap kept[0,2)+[1,3)Coverage(PossibleOverlap)region=us+region=eu, same timeregion=us+tier=premiumCoverage(PossibleOverlap)us×[0,1)+eu×[1,2){us,eu}×[0,2)coverage = NoneCoverage(UnknownInput)summary_updatemismatch)Coverage(MergeOutputMismatch)Coverage records only time and population, so the producers carry the rest: every input's
OperatorNode::summary_update()(theSummaryAgginputandreduction, or those shared by a nestedSummaryMerge) must be present and equal.crates/types/tests/summary_coverage_examples.rsbuilds each example from #567's body anddocs/design_docs/proposals/asap-primitive-schema.mdas a realScan → SummaryAgg(KLL k=200, by job) → SummaryMergeplan. It covers time, population, joint regions, tabular sources without time, source/update mismatch, required coverage, and the trusted-population case that #570 will close. It asserts the exact merged regions and that the schema is unchanged.Grouped merge keeps groups apart:
job='api'andjob='worker'stay separate states. Checking that the merged coverage contains the window or population a query asks for is left to the composition rule. A laterSummaryEstimateis the readout boundary that turns state into a plain value.Requirements for merging two summaries
This PR enforces these structural requirements:
childrenlist is rejected. The API is n-ary; a single compatible state is structurally allowed.result_kind == State; raw relations/vectors are rejected.Plainfield. Identical schemas enforce this on every other input too. Plain grouping fields may accompany it.FieldDataType. KLLk=200andk=300, or KLL and CMS, cannot merge here.time_index,unique_keysandclosedmust match as well. Matching only the state algorithm is insufficient.validate_structurechecks each producer's own contracts.Compatibility is deliberately strict: even differently named but otherwise equivalent schemas need an explicit normalization before this interface accepts them.
These checks establish typed structural compatibility and provably disjoint declared coverage. They do not prove that the inputs cover the intended population/window, that a runtime implements the family's merge operation, or that the merged result meets an accuracy requirement. Those checks belong to the logical composition rule and subsequent physical planning/selection. For example, overlapping frequency panes must not silently double-count observations; matching schemas alone cannot establish correct coverage.
When SummaryMerge can be used
During logical planning: a composition rule can construct
SummaryMergewhen it needs to combine compatible partial summary states—for example, several tumbling-window KLL panes answering one larger query window, or compatible partition summaries feeding a coarser computation. The planner must establish the intended input coverage and grouping semantics. The node can be constructed and structurally validated before choosing materialization.During execution: a physical implementation can merge the state contents once its inputs are available and the selected family/runtime supports the operation. Timing follows the materialization choice in #509. For example, a query can merge previously ingested/stored panes, or merge states rebuilt for that query. #560 itself adds no runtime kernel, storage, retention, window generation or execution-phase policy, and does not imply runtime support for every declared state family.
Source at this PR's head:
asap.rsand the structural regression incrates/types/tests/summary_merge_structure.rs.Validation: reproduced the original reserved-operator failure; the focused regression passes after the fix. The complete first-five tip passes 1,961 workspace tests/doctests, formatting, and workspace/all-target/all-feature Clippy with warnings denied.
Revised logical foundation 2/6 · Base: #567 · Next: #537 · Tracker: #528
Revised review order: #567 → #560 → #537 → #539 → #540 → #561.
🤖 Generated with Claude Code