Class SchemaInferenceVisitor
- All Implemented Interfaces:
RelNodeVisitor<Optional<Schema>>
Schema of every node in a relational algebra tree.
Each visit method returns the inferred schema for that node as an
Optional<Schema>. An empty optional signals that inference failed for
the subtree (e.g. an unresolved relation name); the failure is recorded in
the errors list and the node is left unannotated.
Successfully inferred schemas are written into the SchemaAnnotations
map supplied at construction time, keyed by object identity so that separate
occurrences of the same node structure are tracked independently.
Schema rules per operation
- RelationNode
- schema from the symbol table
- SelectionNode, SortNode, LimitNode, DistinctNode
- passthrough of input schema
- ProjectionNode
- one column per projected attribute; name from alias or attribute name; type inferred from operand kind and input schema
- RenameNode
- if attribute list is non-empty, rename columns positionally; otherwise same schema as input
- NaturalJoinNode
- left columns, then right columns whose names do not appear in left
- ThetaJoinNode, LeftOuterJoinNode, RightOuterJoinNode, FullOuterJoinNode, ProductNode
- concatenation of left and right schemas; right-side duplicate column
names are suffixed with
_r(and_r1,_r2, …) to keep names unique - SemiJoinNode, AntiJoinNode
- left schema only
- UnionNode, UnionAllNode, IntersectionNode, DifferenceNode
- left schema (compatible with right by convention)
- DivisionNode
- left columns whose names do not appear in the right schema
- AggregationNode
- group-by columns (from input schema) followed by one column per
aggregate function (alias or
operator_attributename)
-
Method Summary
Modifier and TypeMethodDescriptionvisit(AggregationNode node) Visits an aggregation (γ) node.visit(AntiJoinNode node) Visits an anti-join (▷) node.visit(AsOfJoinNode node) Visits an AS-OF temporal join (ASOF) node.visit(ClosureNode node) Visits a transitive-closure (CLOSURE/RCLOSURE) node.visit(ClusterNode node) Visits a connected-components (CLUSTER) node.visit(CompositionNode node) Visits a relational composition (∘) node.Visits a covering-reduction (COVER) node.visit(DifferenceNode node) Visits a set difference (−) node.visit(DistinctNode node) Visits a distinct (δ) node.visit(DivisionNode node) Visits a relational division (÷) node.visit(DownsampleNode node) Visits a time-series downsampling (DOWNSAMPLE) node.visit(EmptyRelationNode node) The optimizer-introduced empty relation (∅) has the heading of the expression it replaced, so inference recurses into that carried expression and reports its schema.visit(FixpointNode node) Visits a general-recursion fixpoint (FIX) node.visit(FullOuterJoinNode node) Visits a full outer join (⟗) node.visit(IntersectionNode node) Visits a set intersection (∩) node.visit(IntervalJoinNode node) Visits an interval join (IJOIN) node.visit(IterateNode node) ITERATEis typed exactly asFIX: the name is bound to the base schema, re-anchored to the name, inside the step, and the output carries the base's heading.visit(LateralJoinNode node) Visits a lateral (correlated) table-valued function join node.visit(LeftOuterJoinNode node) Visits a left outer join (⟕) node.Visits a limit (λ) node.visit(NaturalJoinNode node) Visits a natural join (⋈) node.visit(OptimizeNode node) Visits a declarative-optimisation (OPTIMIZE) node.visit(OuterUnionNode node) Visits an outer-union (⊔) node.visit(PairwiseUniversalNode node) Visits a pairwise-universal semi-join (USEMI) node.Visits a bounded variable-length path (PATH) node.Visits a row-pivoting (PIVOT) node.visit(ProductNode node) Visits a Cartesian product (×) node.visit(ProjectionNode node) Visits a projection (π) node.visit(RecursiveRefNode node) Visits a recursive-reference (FIX- orITERATE-bound name) node.visit(RelationFunctionCall node) Visits a table-valued (relation-returning) function call.visit(RelationNode node) Visits a base relation reference.visit(RenameNode node) Visits a rename (ρ) node.visit(ReservoirSampleNode node) Visits a reservoir (fixed-count) sampling (SAMPLE … ROWS) node.visit(RightOuterJoinNode node) Visits a right outer join (⟖) node.visit(SampleNode node) Visits a Bernoulli-sampling (SAMPLE) node.visit(SelectionNode node) Visits a selection (σ) node.visit(SemiJoinNode node) Visits a semi-join (⋉) node.visit(SessionizeNode node) Visits a gap-and-island / sessionization (SESSIONIZE) node.Visits a goal-seek (SOLVE) node.Visits a sort (τ) node.visit(SymmetricDifferenceNode node) Visits a symmetric-difference (∆) node.visit(ThetaJoinNode node) Visits a theta join (⨝) node.Visits a top-k-per-group (TOP) node.Visits an optimal-path extraction (TRACE) node.Visits an adjacency-to-forest nesting (TREE) node.visit(TruthRelationNode node) A nullary truth-relation literal (UNIT/EMPTY) has the empty (closed, zero-column) heading — the same schema the no-key whole-relation∀produces.visit(UnionAllNode node) Visits a multiset union (⊎) node.Visits a set union (∪) node.visit(UniversalNode node) Visits a universal-quantification (∀) node.visit(UnnestNode node) Visits an unnest (μ) node.visit(UnpivotNode node) Visits a column-folding (UNPIVOT) node.Visits a lineage-reification (WHY) node.visit(WindowNode node) Visits a window (ROLLING / WINDOW) node.
-
Method Details
-
visit
Description copied from interface:RelNodeVisitorVisits a base relation reference.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
A nullary truth-relation literal (UNIT/EMPTY) has the empty (closed, zero-column) heading — the same schema the no-key whole-relation∀produces. It resolves against no symbol, so it can never fail.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
The optimizer-introduced empty relation (∅) has the heading of the expression it replaced, so inference recurses into that carried expression and reports its schema.The recursion also annotates the carried expression's own nodes, which is harmless — nothing plans or executes them — and is what keeps the heading inferable at all: this node holds a
RelNode, not aSchema, becauserelix-astdoes not depend on the symbol layer.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a table-valued (relation-returning) function call.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a lateral (correlated) table-valued function join node.A
defaultthat throws rather than an abstract method: a visitor with no meaningful answer for a correlated TVF join inherits the failure instead of being forced to carry a stub. Visitors that do handle it — schema inference, validation, the executor — override this method.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a general-recursion fixpoint (FIX) node.A
defaultthat throws rather than an abstract method: a visitor with no meaningful answer for a least fixpoint inherits the failure instead of being forced to carry a stub. Visitors that do handle it — schema inference, validation, the semi-naïve executor — override this method.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
ITERATEis typed exactly asFIX: the name is bound to the base schema, re-anchored to the name, inside the step, and the output carries the base's heading. The step's positional compatibility with the base, and the stop clause's columns, are the validator's to check.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a recursive-reference (FIX- orITERATE-bound name) node.Provided as a
defaultthat throws — seeRelNodeVisitor.visit(FixpointNode).- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a selection (σ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a sort (τ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a limit (λ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a distinct (δ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a Bernoulli-sampling (SAMPLE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a reservoir (fixed-count) sampling (SAMPLE … ROWS) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a goal-seek (SOLVE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a declarative-optimisation (OPTIMIZE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a top-k-per-group (TOP) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a time-series downsampling (DOWNSAMPLE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a covering-reduction (COVER) node.A
defaultthat throws rather than an abstract method: a visitor with no meaningful answer for a covering reduction inherits the failure instead of being forced to carry a stub. Visitors that do handle it — schema inference, validation, the executor — override this method.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an unnest (μ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a transitive-closure (CLOSURE/RCLOSURE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a connected-components (CLUSTER) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a bounded variable-length path (PATH) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an optimal-path extraction (TRACE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a window (ROLLING / WINDOW) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a gap-and-island / sessionization (SESSIONIZE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an adjacency-to-forest nesting (TREE) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a lineage-reification (WHY) node.A
defaultthat throws rather than an abstract method: a visitor with no meaningful answer for a lineage reification inherits the failure instead of being forced to carry a stub. Visitors that do handle it — schema inference, validation, cost, planning, execution — override this method.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a column-folding (UNPIVOT) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a row-pivoting (PIVOT) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a projection (π) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a rename (ρ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a theta join (⨝) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a left outer join (⟕) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an AS-OF temporal join (ASOF) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an interval join (IJOIN) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a right outer join (⟖) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a full outer join (⟗) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a Cartesian product (×) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a natural join (⋈) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a semi-join (⋉) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an anti-join (▷) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a pairwise-universal semi-join (USEMI) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a set union (∪) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a multiset union (⊎) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an outer-union (⊔) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a set intersection (∩) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a set difference (−) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a symmetric-difference (∆) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a relational division (÷) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a relational composition (∘) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits a universal-quantification (∀) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-
visit
Description copied from interface:RelNodeVisitorVisits an aggregation (γ) node.- Specified by:
visitin interfaceRelNodeVisitor<Optional<Schema>>
-