org.apache.calcite.rel.rules

Class JoinToMultiJoinRule

• ```public class JoinToMultiJoinRule
extends RelOptRule```
Planner rule to flatten a tree of `LogicalJoin`s 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 `MultiJoin`s 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`.

`FilterMultiJoinMergeRule`, `ProjectMultiJoinMergeRule`
• Field Summary

Fields
Modifier and Type Field and Description
`static JoinToMultiJoinRule` `INSTANCE`
• Fields inherited from class org.apache.calcite.plan.RelOptRule

`description, operands, relBuilderFactory`
• Constructor Summary

Constructors
Constructor and Description
`JoinToMultiJoinRule(java.lang.Class<? extends Join> clazz)`
Deprecated.
```JoinToMultiJoinRule(java.lang.Class<? extends Join> clazz, RelBuilderFactory relBuilderFactory)```
Creates a JoinToMultiJoinRule.
• Method Summary

All Methods
Modifier and Type Method and Description
`void` `onMatch(RelOptRuleCall call)`
• Methods inherited from class org.apache.calcite.plan.RelOptRule

`any, convert, convert, convertList, convertOperand, convertOperand, equals, equals, getOperand, getOperands, getOutConvention, getOutTrait, hashCode, matches, none, operand, operand, operand, operand, operand, operandJ, operandJ, some, toString, unordered`
• Methods inherited from class java.lang.Object

`clone, finalize, getClass, notify, notifyAll, wait, wait, wait`
• Field Detail

• INSTANCE

`public static final JoinToMultiJoinRule INSTANCE`
• Constructor Detail

• JoinToMultiJoinRule

```@Deprecated
public JoinToMultiJoinRule(java.lang.Class<? extends Join> clazz)```
Deprecated.
• JoinToMultiJoinRule

```public JoinToMultiJoinRule(java.lang.Class<? extends Join> clazz,
RelBuilderFactory relBuilderFactory)```
Creates a JoinToMultiJoinRule.