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 | Class and Description |
|---|---|
private static class |
RelOptRule.ConverterRelOptRuleOperand
Operand to an instance of the converter rule.
|
| Modifier and Type | Field and Description |
|---|---|
protected String |
description
Description of rule, must be unique within planner.
|
private RelOptRuleOperand |
operand
Root of operand tree.
|
List<RelOptRuleOperand> |
operands
Flattened list of operands.
|
RelBuilderFactory |
relBuilderFactory
Factory for a builder for relational expressions.
|
| Constructor and Description |
|---|
RelOptRule(RelOptRuleOperand operand)
Creates a rule.
|
RelOptRule(RelOptRuleOperand operand,
RelBuilderFactory relBuilderFactory,
String description)
Creates a rule with an explicit description.
|
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.
|
private void |
assignSolveOrder()
Builds each operand's solve-order.
|
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.
|
protected static List<RelNode> |
convertList(List<RelNode> rels,
RelTrait trait)
Converts a list of relational expressions.
|
protected static <R extends RelNode> |
convertOperand(Class<R> clazz,
com.google.common.base.Predicate<? super R> predicate,
RelTrait trait)
Creates an operand for a converter rule.
|
boolean |
equals(Object obj) |
protected boolean |
equals(RelOptRule that)
Returns whether this rule is equal to another rule.
|
private List<RelOptRuleOperand> |
flattenOperands(RelOptRuleOperand rootOperand)
Creates a flattened list of this operand and its descendants in prefix
order.
|
private void |
flattenRecurse(List<RelOptRuleOperand> operandList,
RelOptRuleOperand parentOperand)
Adds the operand and its descendants to the list in prefix order.
|
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.
|
(package private) static String |
guessDescription(String className)
Deduces a name for a rule by taking the name of its class and returning
the segment after the last '.' or '$'.
|
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
private final RelOptRuleOperand operand
public final RelBuilderFactory relBuilderFactory
The actual builder is available via RelOptRuleCall.builder().
public final 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 RelOptRule(RelOptRuleOperand operand, RelBuilderFactory relBuilderFactory, String description)
operand - root operand, must not be nulldescription - Description, or null to guess descriptionrelBuilderFactory - Builder for relational expressionspublic 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 operandsprotected static <R extends RelNode> RelOptRule.ConverterRelOptRuleOperand convertOperand(Class<R> clazz, com.google.common.base.Predicate<? super R> predicate, RelTrait trait)
clazz - Class of relational expression to match (must not be null)trait - Trait to match, or null to match any traitpredicate - Predicate to apply to relational expressionpublic 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()
private List<RelOptRuleOperand> flattenOperands(RelOptRuleOperand rootOperand)
rootOperand - Root operandprivate void flattenRecurse(List<RelOptRuleOperand> operandList, RelOptRuleOperand parentOperand)
operandList - Flattened list of operandsparentOperand - Parent of this operandprivate void assignSolveOrder()
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 traitprotected static List<RelNode> convertList(List<RelNode> rels, RelTrait trait)
rels - Relational expressionstrait - Trait to add to each relational expressionstatic String guessDescription(String className)
Examples:
className - Name of the rule's classCopyright © 2012–2018 The Apache Software Foundation. All rights reserved.