Package org.apache.calcite.rel.rules
Class JoinPushThroughJoinRule
- java.lang.Object
-
- org.apache.calcite.plan.RelOptRule
-
- org.apache.calcite.rel.rules.JoinPushThroughJoinRule
-
public class JoinPushThroughJoinRule extends RelOptRule
Rule that pushes the right input of a join into through the left input of the join, provided that the left input is also a join.Thus,
(A join B) join C
becomes(A join C) join B
. The advantage of applying this rule is that it may be possible to apply conditions earlier. For instance,(sales as s join product_class as pc on true) join product as p on s.product_id = p.product_id and p.product_class_id = pc.product_class_id
becomes
(sales as s join product as p on s.product_id = p.product_id) join product_class as pc on p.product_class_id = pc.product_class_id
Before the rule, one join has two conditions and the other has none (
ON TRUE
). After the rule, each join has one condition.
-
-
Field Summary
Fields Modifier and Type Field Description static RelOptRule
LEFT
Instance of the rule that works on logical joins only, and pushes to the left.private boolean
right
static RelOptRule
RIGHT
Instance of the rule that works on logical joins only, and pushes to the right.-
Fields inherited from class org.apache.calcite.plan.RelOptRule
description, operands, relBuilderFactory
-
-
Constructor Summary
Constructors Constructor Description JoinPushThroughJoinRule(java.lang.String description, boolean right, java.lang.Class<? extends Join> clazz, RelFactories.ProjectFactory projectFactory)
Deprecated.JoinPushThroughJoinRule(java.lang.String description, boolean right, java.lang.Class<? extends Join> clazz, RelBuilderFactory relBuilderFactory)
Creates a JoinPushThroughJoinRule.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
onMatch(RelOptRuleCall call)
Receives notification about a rule match.private void
onMatchLeft(RelOptRuleCall call)
Similar toonMatch(org.apache.calcite.plan.RelOptRuleCall)
, but swaps the upper sibling with the left of the two lower siblings, rather than the right.private void
onMatchRight(RelOptRuleCall call)
(package private) static void
split(RexNode condition, ImmutableBitSet bitSet, java.util.List<RexNode> intersecting, java.util.List<RexNode> nonIntersecting)
Splits a condition into conjunctions that do or do not intersect with a given bit set.-
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
-
-
-
-
Field Detail
-
RIGHT
public static final RelOptRule RIGHT
Instance of the rule that works on logical joins only, and pushes to the right.
-
LEFT
public static final RelOptRule LEFT
Instance of the rule that works on logical joins only, and pushes to the left.
-
right
private final boolean right
-
-
Constructor Detail
-
JoinPushThroughJoinRule
public JoinPushThroughJoinRule(java.lang.String description, boolean right, java.lang.Class<? extends Join> clazz, RelBuilderFactory relBuilderFactory)
Creates a JoinPushThroughJoinRule.
-
JoinPushThroughJoinRule
@Deprecated public JoinPushThroughJoinRule(java.lang.String description, boolean right, java.lang.Class<? extends Join> clazz, RelFactories.ProjectFactory projectFactory)
Deprecated.
-
-
Method Detail
-
onMatch
public void onMatch(RelOptRuleCall call)
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>)
to register the expression.- Specified by:
onMatch
in classRelOptRule
- Parameters:
call
- Rule call- See Also:
RelOptRule.matches(RelOptRuleCall)
-
onMatchRight
private void onMatchRight(RelOptRuleCall call)
-
onMatchLeft
private void onMatchLeft(RelOptRuleCall call)
Similar toonMatch(org.apache.calcite.plan.RelOptRuleCall)
, but swaps the upper sibling with the left of the two lower siblings, rather than the right.
-
split
static void split(RexNode condition, ImmutableBitSet bitSet, java.util.List<RexNode> intersecting, java.util.List<RexNode> nonIntersecting)
Splits a condition into conjunctions that do or do not intersect with a given bit set.
-
-