@API(since="1.27",
status=EXPERIMENTAL)
@Value.Enclosing
public final class FilterFlattenCorrelatedConditionRule
extends RelRule<FilterFlattenCorrelatedConditionRule.Config>
Filter expression with correlated variables, and rewrites the
condition in a simpler form that is more convenient for the decorrelation logic.
Uncorrelated calls below a comparison operator are turned into input references by extracting
the computation in a Project expression. An additional
projection may be added on top of the new filter to retain expression equivalence.
Sub-plan before
LogicalProject($f0=[true])
LogicalFilter(condition=[=($cor0.DEPTNO, +($7, 30))])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
Sub-plan after
LogicalProject($f0=[true])
LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2],..., COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
LogicalFilter(condition=[=($cor0.DEPTNO, $9)])
LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2],..., SLACKER=[$8], $f9=[+($7, 30)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
The rule should be used in conjunction with other rules and transformations to have a positive impact on the plan. At the moment it is tightly connected with the decorrelation logic and may not be useful in a broader context. Projects may implement decorrelation differently so they may choose to use this rule or not.
| Modifier and Type | Class and Description |
|---|---|
static interface |
FilterFlattenCorrelatedConditionRule.Config
Rule configuration.
|
RelRule.Done, RelRule.MatchHandler<R extends RelOptRule>, RelRule.OperandBuilder, RelRule.OperandDetailBuilder<R extends RelNode>, RelRule.OperandTransformRelOptRule.ConverterRelOptRuleOperanddescription, operands, relBuilderFactory| Constructor and Description |
|---|
FilterFlattenCorrelatedConditionRule(FilterFlattenCorrelatedConditionRule.Config config) |
| Modifier and Type | Method and Description |
|---|---|
boolean |
matches(RelOptRuleCall call)
Returns whether this rule could possibly match the given operands.
|
void |
onMatch(RelOptRuleCall call)
Receives notification about a rule match.
|
any, convert, convert, convertList, convertOperand, convertOperand, equals, equals, getOperand, getOperands, getOutConvention, getOutTrait, hashCode, none, operand, operand, operand, operand, operand, operandJ, operandJ, some, toString, unorderedpublic FilterFlattenCorrelatedConditionRule(FilterFlattenCorrelatedConditionRule.Config config)
public boolean matches(RelOptRuleCall call)
RelOptRuleThis 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 calling RelOptRule.onMatch(RelOptRuleCall).
In implementations of RelOptPlanner which may queue up a
matched RelOptRuleCall for a long time before calling
RelOptRule.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 have
RelOptRule.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
matches in class RelOptRulecall - Rule call which has been determined to match all operands of
this rulepublic void onMatch(RelOptRuleCall call)
RelOptRulecall.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.
onMatch in class RelOptRulecall - Rule callRelOptRule.matches(RelOptRuleCall)Copyright © 2012-2022 Apache Software Foundation. All Rights Reserved.