Class RelAlgebraValidator
- All Implemented Interfaces:
RelNodeVisitor<Void>
This visitor runs after schema inference, consuming the
already-populated SchemaAnnotations map rather than re-deriving
schemas. Nodes that were left unannotated (because inference failed) are
silently skipped — the upstream inference error is sufficient.
Checks performed
- Set operations (∪ ⊎ ∩ −)
- Both operands must have the same column count; columns at matching
positions must have compatible types (
ScalarType.ANYis compatible with any type). - Division (÷)
- Every column in the right (divisor) schema must appear, by name, in the left (dividend) schema.
- Projection (π)
AttributeOperandreferences in projected expressions must resolve to a column in the input schema (after stripping any qualifier).FunctionCallreferences are validated for existence and arity against the symbol table.- Aggregation (γ)
- Group-by attribute names and aggregate function attribute names must all resolve in the input schema.
- Sort (τ)
- Sort specification attribute names must resolve in the input schema.
All errors are appended to the mutable errors list supplied at
construction time; the visitor never throws.
-
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) Visits an empty relation carrying another expression's heading (∅).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) ITERATEsharesFIX's schema rule and none of its step rules: a round replaces the relation rather than adding to it, so the step may read the bound name any number of times, through any operator.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) Visits a nullary truth-relation literal (UNIT/DEE or EMPTY/DUM).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<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a nullary truth-relation literal (UNIT/DEE or EMPTY/DUM).- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an empty relation carrying another expression's heading (∅).- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a table-valued (relation-returning) function call.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
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<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a selection (σ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a distinct (δ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a Bernoulli-sampling (SAMPLE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a reservoir (fixed-count) sampling (SAMPLE … ROWS) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a time-series downsampling (DOWNSAMPLE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a top-k-per-group (TOP) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a declarative-optimisation (OPTIMIZE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
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<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a goal-seek (SOLVE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an unnest (μ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a transitive-closure (CLOSURE/RCLOSURE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a connected-components (CLUSTER) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a bounded variable-length path (PATH) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a window (ROLLING / WINDOW) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a gap-and-island / sessionization (SESSIONIZE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an adjacency-to-forest nesting (TREE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
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<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a column-folding (UNPIVOT) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a row-pivoting (PIVOT) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an optimal-path extraction (TRACE) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a limit (λ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
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<Void>
-
visit
ITERATEsharesFIX's schema rule and none of its step rules: a round replaces the relation rather than adding to it, so the step may read the bound name any number of times, through any operator. What it adds instead is that the step be reproducible — a round that could answer differently for the same input makes both convergence and a detected cycle meaningless — and that the stop clause name real columns.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
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<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a rename (ρ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a natural join (⋈) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a theta join (⨝) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a left outer join (⟕) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a right outer join (⟖) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a full outer join (⟗) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a semi-join (⋉) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an anti-join (▷) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a pairwise-universal semi-join (USEMI) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an AS-OF temporal join (ASOF) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an interval join (IJOIN) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a Cartesian product (×) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a set union (∪) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a multiset union (⊎) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an outer-union (⊔) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a set intersection (∩) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a set difference (−) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a symmetric-difference (∆) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a relational composition (∘) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a universal-quantification (∀) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a relational division (÷) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a projection (π) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits an aggregation (γ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-
visit
Description copied from interface:RelNodeVisitorVisits a sort (τ) node.- Specified by:
visitin interfaceRelNodeVisitor<Void>
-