Class JoinToMultiJoinRule

All Implemented Interfaces:
TransformationRule

@Enclosing public class JoinToMultiJoinRule extends RelRule<JoinToMultiJoinRule.Config> implements TransformationRule
Planner rule to flatten a tree of LogicalJoins into a single MultiJoin with N inputs.

An input is not flattened if the input is a null generating input in an outer join, i.e., either input in a full outer join, the right hand side of a left outer join, or the left hand side of a right outer join.

Join conditions are also pulled up from the inputs into the topmost MultiJoin, unless the input corresponds to a null generating input in an outer join,

Outer join information is also stored in the MultiJoin. A boolean flag indicates if the join is a full outer join, and in the case of left and right outer joins, the join type and outer join conditions are stored in arrays in the MultiJoin. This outer join information is associated with the null generating input in the outer join. So, in the case of a a left outer join between A and B, the information is associated with B, not A.

Here are examples of the MultiJoins constructed after this rule has been applied on following join trees.

  • A JOIN B → MJ(A, B)
  • A JOIN B JOIN C → MJ(A, B, C)
  • A LEFT JOIN B → MJ(A, B), left outer join on input#1
  • A RIGHT JOIN B → MJ(A, B), right outer join on input#0
  • A FULL JOIN B → MJ[full](A, B)
  • A LEFT JOIN (B JOIN C) → MJ(A, MJ(B, C))), left outer join on input#1 in the outermost MultiJoin
  • (A JOIN B) LEFT JOIN C → MJ(A, B, C), left outer join on input#2
  • (A LEFT JOIN B) JOIN C → MJ(MJ(A, B), C), left outer join on input#1 of the inner MultiJoin TODO
  • A LEFT JOIN (B FULL JOIN C) → MJ(A, MJ[full](B, C)), left outer join on input#1 in the outermost MultiJoin
  • (A LEFT JOIN B) FULL JOIN (C RIGHT JOIN D) → MJ[full](MJ(A, B), MJ(C, D)), left outer join on input #1 in the first inner MultiJoin and right outer join on input#0 in the second inner MultiJoin

The constructor is parameterized to allow any sub-class of Join, not just LogicalJoin.

See Also: