Class FlinkJoinToMultiJoinRule

java.lang.Object
org.apache.calcite.plan.RelOptRule
org.apache.calcite.plan.RelRule<FlinkJoinToMultiJoinRule.Config>
org.apache.flink.table.planner.plan.rules.logical.FlinkJoinToMultiJoinRule
All Implemented Interfaces:
org.apache.calcite.rel.rules.TransformationRule

@Enclosing public class FlinkJoinToMultiJoinRule extends org.apache.calcite.plan.RelRule<FlinkJoinToMultiJoinRule.Config> implements org.apache.calcite.rel.rules.TransformationRule
Flink Planner rule to flatten a tree of LogicalJoins into a single MultiJoin with N inputs.

This rule is copied from JoinToMultiJoinRule. In this rule, we support richer join type to convert to one multi join set, like left outer join and right outer join, by rewrite $canCombine() method.

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, semi join, anti join, the right side of a left outer join, or the lef side of a right outer join.

Join conditions are also pulled up from the inputs into the topmost MultiJoin.

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 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)
  • A RIGHT JOIN B → MJ(A, B)
  • A FULL JOIN B → MJ[full](A, B)
  • A LEFT JOIN (B JOIN C) → MJ(A, B, C)
  • (A JOIN B) LEFT JOIN C → MJ(A, B, C)
  • (A LEFT JOIN B) JOIN C → MJ(A, B, C)
  • (A LEFT JOIN B) LEFT JOIN C → MJ(A, B, C)
  • (A RIGHT JOIN B) RIGHT JOIN C → MJ(MJ(A, B), C)
  • (A LEFT JOIN B) RIGHT JOIN C → MJ(MJ(A, B), C)
  • (A RIGHT JOIN B) LEFT JOIN C → MJ(MJ(A, B), C)
  • A LEFT JOIN (B FULL JOIN C) → MJ(A, MJ[full](B, C))
  • (A LEFT JOIN B) FULL JOIN (C RIGHT JOIN D) → MJ[full](MJ(A, B), MJ(C, D))
  • SEMI JOIN and ANTI JOIN not support now.

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

See Also:
  • FilterMultiJoinMergeRule
  • ProjectMultiJoinMergeRule
  • CoreRules.JOIN_TO_MULTI_JOIN
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static interface 
    Rule configuration.

    Nested classes/interfaces inherited from class org.apache.calcite.plan.RelRule

    org.apache.calcite.plan.RelRule.Done, org.apache.calcite.plan.RelRule.MatchHandler<R extends org.apache.calcite.plan.RelOptRule>, org.apache.calcite.plan.RelRule.OperandBuilder, org.apache.calcite.plan.RelRule.OperandDetailBuilder<R extends org.apache.calcite.rel.RelNode>, org.apache.calcite.plan.RelRule.OperandTransform

    Nested classes/interfaces inherited from class org.apache.calcite.plan.RelOptRule

    org.apache.calcite.plan.RelOptRule.ConverterRelOptRuleOperand
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
     

    Fields inherited from class org.apache.calcite.plan.RelRule

    config

    Fields inherited from class org.apache.calcite.plan.RelOptRule

    description, operands, relBuilderFactory
  • Constructor Summary

    Constructors
    Constructor
    Description
    FlinkJoinToMultiJoinRule(Class<? extends org.apache.calcite.rel.core.Join> clazz)
    Deprecated.
    FlinkJoinToMultiJoinRule(Class<? extends org.apache.calcite.rel.core.Join> joinClass, org.apache.calcite.tools.RelBuilderFactory relBuilderFactory)
    Deprecated.
    Creates a JoinToMultiJoinRule.
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    matches(org.apache.calcite.plan.RelOptRuleCall call)
     
    void
    onMatch(org.apache.calcite.plan.RelOptRuleCall call)
     

    Methods inherited from class org.apache.calcite.plan.RelOptRule

    any, convert, convert, convertList, convertOperand, convertOperand, equals, equals, getOperand, getOperands, getOutConvention, getOutTrait, hashCode, 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 Details

  • Constructor Details

    • FlinkJoinToMultiJoinRule

      public FlinkJoinToMultiJoinRule(FlinkJoinToMultiJoinRule.Config config)
      Creates a JoinToMultiJoinRule.
    • FlinkJoinToMultiJoinRule

      @Deprecated public FlinkJoinToMultiJoinRule(Class<? extends org.apache.calcite.rel.core.Join> clazz)
      Deprecated.
    • FlinkJoinToMultiJoinRule

      @Deprecated public FlinkJoinToMultiJoinRule(Class<? extends org.apache.calcite.rel.core.Join> joinClass, org.apache.calcite.tools.RelBuilderFactory relBuilderFactory)
      Deprecated.
  • Method Details

    • matches

      public boolean matches(org.apache.calcite.plan.RelOptRuleCall call)
      Overrides:
      matches in class org.apache.calcite.plan.RelOptRule
    • onMatch

      public void onMatch(org.apache.calcite.plan.RelOptRuleCall call)
      Specified by:
      onMatch in class org.apache.calcite.plan.RelOptRule