public class SubstitutionVisitor extends Object
The call new SubstitutionVisitor(target, query).go(replacement))
will return query with every occurrence of target replaced
by replacement.
The following example shows how SubstitutionVisitor can be used
for materialized view recognition.
Note that result uses the materialized view table mv and a
simplified condition b = 4.
Uses a bottom-up matching algorithm. Nodes do not need to be identical. At each level, returns the residue.
The inputs must only include the core relational operators:
TableScan,
Filter,
Project,
Calc,
Join,
Union,
Intersect,
Aggregate.
| Modifier and Type | Class and Description |
|---|---|
static class |
SubstitutionVisitor.AbstractUnifyRule
Abstract base class for implementing
SubstitutionVisitor.UnifyRule. |
protected static class |
SubstitutionVisitor.MatchFailed
Exception thrown to exit a matcher.
|
static class |
SubstitutionVisitor.Operand
Operand to a
SubstitutionVisitor.UnifyRule. |
static class |
SubstitutionVisitor.UnifyResult
Result of an application of a
SubstitutionVisitor.UnifyRule indicating that the
rule successfully matched query against target and
generated a result that is equivalent to query and
contains target. |
static class |
SubstitutionVisitor.UnifyRule
Rule that attempts to match a query relational expression
against a target relational expression.
|
class |
SubstitutionVisitor.UnifyRuleCall
Arguments to an application of a
SubstitutionVisitor.UnifyRule. |
| Modifier and Type | Field and Description |
|---|---|
static com.google.common.collect.ImmutableList<SubstitutionVisitor.UnifyRule> |
DEFAULT_RULES |
protected RelBuilder |
relBuilder
Factory for a builder for relational expressions.
|
protected MutableRel[] |
slots
Workspace while rule is being matched.
|
| Constructor and Description |
|---|
SubstitutionVisitor(RelNode target_,
RelNode query_)
Creates a SubstitutionVisitor with the default rule set.
|
SubstitutionVisitor(RelNode target_,
RelNode query_,
com.google.common.collect.ImmutableList<SubstitutionVisitor.UnifyRule> rules)
Creates a SubstitutionVisitor with the default logical builder.
|
SubstitutionVisitor(RelNode target_,
RelNode query_,
com.google.common.collect.ImmutableList<SubstitutionVisitor.UnifyRule> rules,
RelBuilderFactory relBuilderFactory) |
| Modifier and Type | Method and Description |
|---|---|
static boolean |
equalType(String desc0,
MutableRel rel0,
String desc1,
MutableRel rel1,
Litmus litmus)
Returns whether two relational expressions have the same row-type.
|
static Pair<RexNode,List<RexNode>> |
explainCalc(MutableCalc calc)
Explain filtering condition and projections from MutableCalc.
|
static @Nullable SqlAggFunction |
getRollup(SqlAggFunction aggregation)
Deprecated.
|
List<RelNode> |
go(RelNode replacement_)
Returns a list of all possible rels that result from substituting the
matched RelNode with the replacement RelNode within the query.
|
@Nullable RelNode |
go0(RelNode replacement_) |
protected boolean |
isWeaker(MutableRel rel0,
MutableRel rel)
Returns if one rel is weaker than another.
|
static boolean |
mayBeSatisfiable(RexNode e)
Returns whether a boolean expression ever returns true.
|
static MutableAggregate |
permute(MutableAggregate aggregate,
MutableRel input,
Mapping mapping) |
static @Nullable org.apache.calcite.plan.SubstitutionVisitor.Replacement |
replace(MutableRel query,
MutableRel find,
MutableRel replace)
Within a relational expression
query, replaces occurrences of
find with replace. |
static @Nullable RexNode |
splitFilter(RexSimplify simplify,
RexNode condition,
RexNode target)
Maps a condition onto a target.
|
static @Nullable MutableRel |
unifyAggregates(MutableAggregate query,
@Nullable RexNode targetCond,
MutableAggregate target) |
public static final com.google.common.collect.ImmutableList<SubstitutionVisitor.UnifyRule> DEFAULT_RULES
protected final RelBuilder relBuilder
protected final MutableRel[] slots
public SubstitutionVisitor(RelNode target_, RelNode query_)
public SubstitutionVisitor(RelNode target_, RelNode query_, com.google.common.collect.ImmutableList<SubstitutionVisitor.UnifyRule> rules)
public SubstitutionVisitor(RelNode target_, RelNode query_, com.google.common.collect.ImmutableList<SubstitutionVisitor.UnifyRule> rules, RelBuilderFactory relBuilderFactory)
public static @Nullable RexNode splitFilter(RexSimplify simplify, RexNode condition, RexNode target)
If condition is stronger than target, returns the residue.
If it is equal to target, returns the expression that evaluates to
the constant true. If it is weaker than target, returns
null.
The terms satisfy the relation
condition = target AND residue
and residue must be as weak as possible.
Example #1: condition stronger than target
Note that residue x > 0 AND y = 2 would also satisfy the
relation condition = target AND residue but is stronger than
necessary, so we prefer y = 2.
Example #2: target weaker than condition (valid, but not currently implemented)
Example #3: condition and target are equivalent
Example #4: condition weaker than target
There are many other possible examples. It amounts to solving
whether condition AND NOT target can ever evaluate to
true, and therefore is a form of the NP-complete
Satisfiability
problem.
public static boolean mayBeSatisfiable(RexNode e)
This method may give false positives. For instance, it will say
that x = 5 AND x > 10 is satisfiable, because at present it
cannot prove that it is not.
public List<RelNode> go(RelNode replacement_)
For example, the substitution result of A join B, while A and B are both a qualified match for replacement R, is R join B, R join R, A join R.
public static @Nullable org.apache.calcite.plan.SubstitutionVisitor.Replacement replace(MutableRel query, MutableRel find, MutableRel replace)
query, replaces occurrences of
find with replace.
Assumes relational expressions (and their descendants) are not null. Does not handle cycles.
public static Pair<RexNode,List<RexNode>> explainCalc(MutableCalc calc)
public static MutableAggregate permute(MutableAggregate aggregate, MutableRel input, Mapping mapping)
public static @Nullable MutableRel unifyAggregates(MutableAggregate query, @Nullable RexNode targetCond, MutableAggregate target)
@Deprecated public static @Nullable SqlAggFunction getRollup(SqlAggFunction aggregation)
protected boolean isWeaker(MutableRel rel0, MutableRel rel)
public static boolean equalType(String desc0, MutableRel rel0, String desc1, MutableRel rel1, Litmus litmus)
Copyright © 2012-2022 Apache Software Foundation. All Rights Reserved.