Interface ConditionalJoinNode

All Superinterfaces:
RelNode
All Known Implementing Classes:
AntiJoinNode, FullOuterJoinNode, LeftOuterJoinNode, PairwiseUniversalNode, RightOuterJoinNode, SemiJoinNode, ThetaJoinNode

The uniform shape shared by every condition-carrying binary join: (left, right, condition, location).

Seven of the join operators — θ-join, the three outer joins, semi-join, anti-join, and the pairwise universal semi-join — differ only in their runtime semantics; structurally they are identical. Consumers that treat them uniformly (predicate/expression simplification, parameter substitution, structural traversal) can match one case ConditionalJoinNode j instead of seven copy-pasted arms, and reconstruct via rebuild(RelNode, RelNode, Predicate) without losing the concrete type or its source location.

Consumers whose behaviour differs per join type (the planner's algorithm choice, selection pushdown's side rules, cost estimation, IR labels) should keep matching the concrete types — the sealed hierarchy keeps those switches exhaustive either way.

AsOfJoinNode and IntervalJoinNode are deliberately not members: the AS-OF join carries tolerance/window/tie-break state beyond the uniform shape, and the interval join has endpoint columns instead of a single predicate.

  • Method Details

    • left

      RelNode left()
      The left input relation; never null.
    • right

      RelNode right()
      The right input relation; never null.
    • condition

      Predicate condition()
      The join predicate; never null.
    • rebuild

      ConditionalJoinNode rebuild(RelNode left, RelNode right, Predicate condition)
      Reconstructs this node with new inputs and/or condition, preserving the concrete join type and this node's RelNode.location().
      Parameters:
      left - the new left input; must not be null
      right - the new right input; must not be null
      condition - the new join predicate; must not be null
      Returns:
      a node of the same concrete type; never null