Class JoinToMultiJoinRule
- All Implemented Interfaces:
TransformationRule
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
.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.apache.calcite.plan.RelRule
RelRule.Done, RelRule.MatchHandler<R extends RelOptRule>, RelRule.OperandBuilder, RelRule.OperandDetailBuilder<R extends RelNode>, RelRule.OperandTransform
Nested classes/interfaces inherited from class org.apache.calcite.plan.RelOptRule
RelOptRule.ConverterRelOptRuleOperand
-
Field Summary
Fields inherited from class org.apache.calcite.plan.RelOptRule
description, operands, relBuilderFactory
-
Constructor Summary
ModifierConstructorDescriptionJoinToMultiJoinRule
(Class<? extends Join> clazz) Deprecated.JoinToMultiJoinRule
(Class<? extends Join> joinClass, RelBuilderFactory relBuilderFactory) Deprecated.protected
Creates a JoinToMultiJoinRule. -
Method Summary
Modifier and TypeMethodDescriptionboolean
matches
(RelOptRuleCall call) Returns whether this rule could possibly match the given operands.void
onMatch
(RelOptRuleCall call) Receives notification about a rule match.Methods inherited from class org.apache.calcite.plan.RelOptRule
any, convert, convert, convert, convert, convertList, convertOperand, convertOperand, equals, equals, getOperand, getOperands, getOutConvention, getOutTrait, hashCode, none, operand, operand, operand, operand, operand, operandJ, operandJ, some, toString, unordered
-
Constructor Details
-
JoinToMultiJoinRule
Creates a JoinToMultiJoinRule. -
JoinToMultiJoinRule
Deprecated. -
JoinToMultiJoinRule
@Deprecated public JoinToMultiJoinRule(Class<? extends Join> joinClass, RelBuilderFactory relBuilderFactory) Deprecated.
-
-
Method Details
-
matches
Description copied from class:RelOptRule
Returns whether this rule could possibly match the given operands.This method is an opportunity to apply side-conditions to a rule. The
RelOptPlanner
calls this method after matching all operands of the rule, and before callingRelOptRule.onMatch(RelOptRuleCall)
.In implementations of
RelOptPlanner
which may queue up a matchedRelOptRuleCall
for a long time before callingRelOptRule.onMatch(RelOptRuleCall)
, this method is beneficial because it allows the planner to discard rules earlier in the process.The default implementation of this method returns
true
. It is acceptable for any implementation of this method to give a false positives, that is, to say that the rule matches the operands but haveRelOptRule.onMatch(RelOptRuleCall)
subsequently not generate any successors.The following script is useful to identify rules which commonly produce no successors. You should override this method for these rules:
awk ' /Apply rule/ {rule=$4; ruleCount[rule]++;} /generated 0 successors/ {ruleMiss[rule]++;} END { printf "%-30s %s %s\n", "Rule", "Fire", "Miss"; for (i in ruleCount) { printf "%-30s %5d %5d\n", i, ruleCount[i], ruleMiss[i]; } } ' FarragoTrace.log
- Overrides:
matches
in classRelOptRule
- Parameters:
call
- Rule call which has been determined to match all operands of this rule- Returns:
- whether this RelOptRule matches a given RelOptRuleCall
-
onMatch
Description copied from class:RelOptRule
Receives notification about a rule match. At the time that this method is called,call.rels
holds the set of relational expressions which match the operands to the rule;call.rels[0]
is the root expression.Typically a rule would check that the nodes are valid matches, creates a new expression, then calls back
RelOptRuleCall.transformTo(org.apache.calcite.rel.RelNode, java.util.Map<org.apache.calcite.rel.RelNode, org.apache.calcite.rel.RelNode>, org.apache.calcite.plan.RelHintsPropagator)
to register the expression.- Specified by:
onMatch
in classRelOptRule
- Parameters:
call
- Rule call- See Also:
-