Package org.apache.calcite.rel.rules
Class MinusToAntiJoinRule
java.lang.Object
org.apache.calcite.plan.RelOptRule
org.apache.calcite.plan.RelRule<MinusToAntiJoinRule.Config>
org.apache.calcite.rel.rules.MinusToAntiJoinRule
- All Implemented Interfaces:
TransformationRule
@Enclosing
public class MinusToAntiJoinRule
extends RelRule<MinusToAntiJoinRule.Config>
implements TransformationRule
Planner rule that translates a
Minus
to a series of Join that type is
JoinRelType.ANTI. This rule supports n-way Minus conversion,
as this rule can be repeatedly applied during query optimization to
refine the plan.
Example for 2-way
Original sql:
select ename from emp where deptno = 10
except
select ename from emp where deptno = 20
Original plan:
LogicalMinus(all=[false])
LogicalProject(ENAME=[$1])
LogicalFilter(condition=[=($7, 10)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalProject(ENAME=[$1])
LogicalFilter(condition=[=($7, 20)])
Plan after conversion:
LogicalAggregate(group=[{0}])
LogicalJoin(condition=[IS NOT DISTINCT FROM($0, $1)], joinType=[anti])
LogicalProject(ENAME=[$1])
LogicalFilter(condition=[=($7, 10)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalProject(ENAME=[$1])
LogicalFilter(condition=[=($7, 20)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
Example for n-way
Original sql:
select ename from emp where deptno = 10
except
select deptno from emp where ename in ('a', 'b')
except
select ename from empnullables
Original plan:
LogicalMinus(all=[false])
LogicalProject(ENAME=[$1])
LogicalFilter(condition=[=($7, 10)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalProject(DEPTNO=[CAST($7):VARCHAR NOT NULL])
LogicalFilter(condition=[OR(=($1, 'a'), =($1, 'b'))])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalProject(ENAME=[$1])
LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
Plan after conversion:
LogicalProject(ENAME=[CAST($0):VARCHAR])
LogicalAggregate(group=[{0}])
LogicalJoin(condition=[<=>(CAST($0):VARCHAR, CAST($1):VARCHAR)], joinType=[anti])
LogicalJoin(condition=[=(CAST($0):VARCHAR, $1)], joinType=[anti])
LogicalProject(ENAME=[$1])
LogicalFilter(condition=[=($7, 10)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalProject(DEPTNO=[CAST($7):VARCHAR NOT NULL])
LogicalFilter(condition=[OR(=($1, 'a'), =($1, 'b'))])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalProject(ENAME=[$1])
LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
-
Nested Class Summary
Nested ClassesNested 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.OperandTransformNested 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
ConstructorsModifierConstructorDescriptionprotectedCreates an MinusToAntiJoinRule. -
Method Summary
Modifier and TypeMethodDescriptionvoidonMatch(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, matches, none, operand, operand, operand, operand, operand, operandJ, operandJ, some, toString, unordered
-
Constructor Details
-
MinusToAntiJoinRule
Creates an MinusToAntiJoinRule.
-
-
Method Details
-
onMatch
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.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:
onMatchin classRelOptRule- Parameters:
call- Rule call- See Also:
-