public class IntersectToDistinctRule extends RelOptRulePlanner rule that translates a distinct
false) into a group of operators composed of
Rewrite: (GB-Union All-GB)-GB-UDTF (on all attributes)
R1 Intersect All R2
R3 = GB(R1 on all attributes, count(*) as c)
GB(R2 on all attributes, count(*) as c)
R4 = GB(R3 on all attributes, count(c) as cnt, min(c) as m)
Note that we do not need
min(c)in intersect distinct.
R5 = Filter(cnt == #branch)
If it is intersect all then
R6 = UDTF (R5) which will explode the tuples based on min(c)
R7 = Project(R6 on all attributes)
R6 = Proj(R5 on all attributes)
- See Also:
All Methods Instance Methods Concrete Methods Modifier and Type Method Description
onMatch(RelOptRuleCall call)Receives notification about a rule match.
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
public static final IntersectToDistinctRule INSTANCE
public void onMatch(RelOptRuleCall call)Description copied from class:
RelOptRuleReceives notification about a rule match. At the time that this method is called,
call.relsholds the set of relational expressions which match the operands to the rule;
call.relsis 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.