public abstract class RelOptRule extends Object
RelOptRule transforms an expression into another. It has a
list of RelOptRuleOperands, which determine whether the rule can be
applied to a particular section of the tree.
The optimizer figures out which rules are applicable, then calls
onMatch(org.apache.calcite.plan.RelOptRuleCall) on each of them.
| Modifier and Type | Field and Description |
|---|---|
protected String |
description
Description of rule, must be unique within planner.
|
List<RelOptRuleOperand> |
operands
Flattened list of operands.
|
| Constructor and Description |
|---|
RelOptRule(RelOptRuleOperand operand)
Creates a rule.
|
RelOptRule(RelOptRuleOperand operand,
String description)
Creates a rule with an explicit description.
|
| Modifier and Type | Method and Description |
|---|---|
static RelOptRuleOperandChildren |
any()
Creates a list of child operands that signifies that the operand matches
any number of child relational expressions.
|
static RelNode |
convert(RelNode rel,
RelTrait toTrait)
Converts one trait of a relational expression, if it does not
already have that trait.
|
static RelNode |
convert(RelNode rel,
RelTraitSet toTraits)
Converts a relation expression to a given set of traits, if it does not
already have those traits.
|
static List<RelNode> |
convertList(List<RelNode> rels,
RelTrait trait)
Converts a list of relational expressions.
|
boolean |
equals(Object obj) |
protected boolean |
equals(RelOptRule that)
Returns whether this rule is equal to another rule.
|
RelOptRuleOperand |
getOperand()
Returns the root operand of this rule
|
List<RelOptRuleOperand> |
getOperands()
Returns a flattened list of operands of this rule.
|
Convention |
getOutConvention()
Returns the convention of the result of firing this rule, null if
not known.
|
RelTrait |
getOutTrait()
Returns the trait which will be modified as a result of firing this rule,
or null if the rule is not a converter rule.
|
int |
hashCode() |
boolean |
matches(RelOptRuleCall call)
Returns whether this rule could possibly match the given operands.
|
static RelOptRuleOperandChildren |
none()
Creates an empty list of child operands.
|
abstract void |
onMatch(RelOptRuleCall call)
Receives notification about a rule match.
|
static <R extends RelNode> |
operand(Class<R> clazz,
RelOptRuleOperandChildren operandList)
Creates an operand that matches a relational expression that has no
children.
|
static <R extends RelNode> |
operand(Class<R> clazz,
RelOptRuleOperand first,
RelOptRuleOperand... rest)
Creates an operand that matches a relational expression with a given
list of children.
|
static <R extends RelNode> |
operand(Class<R> clazz,
RelTrait trait,
com.google.common.base.Predicate<? super R> predicate,
RelOptRuleOperandChildren operandList)
Creates an operand that matches a relational expression that has a
particular trait and predicate.
|
static <R extends RelNode> |
operand(Class<R> clazz,
RelTrait trait,
com.google.common.base.Predicate<? super R> predicate,
RelOptRuleOperand first,
RelOptRuleOperand... rest)
Creates an operand that matches a relational expression that has no
children.
|
static <R extends RelNode> |
operand(Class<R> clazz,
RelTrait trait,
RelOptRuleOperandChildren operandList)
Creates an operand that matches a relational expression that has no
children.
|
static RelOptRuleOperandChildren |
some(RelOptRuleOperand first,
RelOptRuleOperand... rest)
Creates a list of child operands that matches child relational
expressions in the order they appear.
|
String |
toString()
Returns the description of this rule.
|
static RelOptRuleOperandChildren |
unordered(RelOptRuleOperand first,
RelOptRuleOperand... rest)
Creates a list of child operands that matches child relational
expressions in any order.
|
protected final String description
public List<RelOptRuleOperand> operands
public RelOptRule(RelOptRuleOperand operand)
operand - root operand, must not be nullpublic RelOptRule(RelOptRuleOperand operand, String description)
operand - root operand, must not be nulldescription - Description, or null to guess descriptionpublic static <R extends RelNode> RelOptRuleOperand operand(Class<R> clazz, RelOptRuleOperandChildren operandList)
R - Class of relational expression to matchclazz - Class of relational expression to match (must not be null)operandList - Child operandspublic static <R extends RelNode> RelOptRuleOperand operand(Class<R> clazz, RelTrait trait, RelOptRuleOperandChildren operandList)
R - Class of relational expression to matchclazz - Class of relational expression to match (must not be null)trait - Trait to match, or null to match any traitoperandList - Child operandspublic static <R extends RelNode> RelOptRuleOperand operand(Class<R> clazz, RelTrait trait, com.google.common.base.Predicate<? super R> predicate, RelOptRuleOperandChildren operandList)
R - Class of relational expression to matchclazz - Class of relational expression to match (must not be null)trait - Trait to match, or null to match any traitpredicate - Additional match predicateoperandList - Child operandspublic static <R extends RelNode> RelOptRuleOperand operand(Class<R> clazz, RelTrait trait, com.google.common.base.Predicate<? super R> predicate, RelOptRuleOperand first, RelOptRuleOperand... rest)
R - Class of relational expression to matchclazz - Class of relational expression to match (must not be null)trait - Trait to match, or null to match any traitpredicate - Additional match predicatefirst - First operandrest - Rest operandspublic static <R extends RelNode> RelOptRuleOperand operand(Class<R> clazz, RelOptRuleOperand first, RelOptRuleOperand... rest)
Shorthand for operand(clazz, some(...)).
If you wish to match a relational expression that has no children
(that is, a leaf node), write operand(clazz, none())
If you wish to match a relational expression that has any number of
children, write operand(clazz, any())
R - Class of relational expression to matchclazz - Class of relational expression to match (must not be null)first - First operandrest - Rest operandspublic static RelOptRuleOperandChildren some(RelOptRuleOperand first, RelOptRuleOperand... rest)
first - First child operandrest - Remaining child operands (may be empty)public static RelOptRuleOperandChildren unordered(RelOptRuleOperand first, RelOptRuleOperand... rest)
This is useful when matching a relational expression which can have a variable number of children. For example, the rule to eliminate empty children of a Union would have operands
Operand(Union, true, Operand(Empty))
and given the relational expressions
Union(LogicalFilter, Empty, LogicalProject)
would fire the rule with arguments
{Union, Empty}
It is up to the rule to deduce the other children, or indeed the position of the matched child.
first - First child operandrest - Remaining child operands (may be empty)public static RelOptRuleOperandChildren none()
public static RelOptRuleOperandChildren any()
public RelOptRuleOperand getOperand()
public List<RelOptRuleOperand> getOperands()
protected boolean equals(RelOptRule that)
The base implementation checks that the rules have the same class and that the operands are equal; derived classes can override.
that - Another rulepublic boolean matches(RelOptRuleCall call)
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 calling onMatch(RelOptRuleCall).
In implementations of RelOptPlanner which may queue up a
matched RelOptRuleCall for a long time before calling
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
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
call - Rule call which has been determined to match all operands of
this rulepublic abstract void onMatch(RelOptRuleCall call)
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.
call - Rule callmatches(RelOptRuleCall)public Convention getOutConvention()
public RelTrait getOutTrait()
public final String toString()
It must be unique (for rules that are not equal) and must consist of only the characters A-Z, a-z, 0-9, '_', '.', '(', ')'. It must start with a letter.
public static RelNode convert(RelNode rel, RelTraitSet toTraits)
rel - Relational expression to converttoTraits - desired traitspublic static RelNode convert(RelNode rel, RelTrait toTrait)
rel - Relational expression to converttoTrait - Desired traitCopyright © 2012–2015 The Apache Software Foundation. All rights reserved.