public class RexProgram
extends java.lang.Object
Programs are immutable. It may help to use a RexProgramBuilder
,
which has the same relationship to RexProgram
as StringBuilder
has to String
.
A program can contain aggregate functions. If it does, the arguments to
each aggregate function must be an RexInputRef
.
RexProgramBuilder
Modifier and Type | Class and Description |
---|---|
(package private) static class |
RexProgram.Checker
Visitor which walks over a program and checks validity.
|
private class |
RexProgram.ConstantFinder
Walks over an expression and determines whether it is constant.
|
(package private) static class |
RexProgram.ExpansionShuttle
A RexShuttle used in the implementation of
expandLocalRef(org.apache.calcite.rex.RexLocalRef) . |
private class |
RexProgram.Marshaller
Given an expression in a program, creates a clone of the expression with
sub-expressions (represented by
RexLocalRef s) fully expanded. |
private class |
RexProgram.ReferenceCounter
Visitor which marks which expressions are used.
|
Modifier and Type | Field and Description |
---|---|
private RexLocalRef |
condition
The optional condition.
|
private java.util.List<RexNode> |
exprs
First stage of expression evaluation.
|
private RelDataType |
inputRowType |
private RelDataType |
outputRowType |
private java.util.List<RexLocalRef> |
projects
With
condition , the second stage of expression evaluation. |
private int[] |
refCounts
Reference counts for each expression, computed on demand.
|
Constructor and Description |
---|
RexProgram(RelDataType inputRowType,
java.util.List<? extends RexNode> exprs,
java.util.List<RexLocalRef> projects,
RexLocalRef condition,
RelDataType outputRowType)
Creates a program.
|
Modifier and Type | Method and Description |
---|---|
RelWriter |
collectExplainTerms(java.lang.String prefix,
RelWriter pw) |
RelWriter |
collectExplainTerms(java.lang.String prefix,
RelWriter pw,
SqlExplainLevel level)
Collects the expressions in this program into a list of terms and values.
|
boolean |
containsAggs()
Returns whether this program contains windowed aggregate functions
|
private static int |
countTrivial(java.util.List<RexLocalRef> refs)
Returns the number of expressions at the front of an array which are
simply projections of the same field.
|
static RexProgram |
create(RelDataType inputRowType,
java.util.List<? extends RexNode> projectExprs,
RexNode conditionExpr,
java.util.List<java.lang.String> fieldNames,
RexBuilder rexBuilder)
Creates a program which calculates projections and filters rows based
upon a condition.
|
static RexProgram |
create(RelDataType inputRowType,
java.util.List<? extends RexNode> projectExprs,
RexNode conditionExpr,
RelDataType outputRowType,
RexBuilder rexBuilder)
Creates a program which calculates projections and filters rows based
upon a condition.
|
static RexProgram |
createIdentity(RelDataType rowType)
Creates the identity program.
|
static RexProgram |
createIdentity(RelDataType rowType,
RelDataType outputRowType)
Creates a program that projects its input fields but with possibly
different names for the output fields.
|
static void |
deduceCollations(java.util.List<RelCollation> outputCollations,
int sourceCount,
java.util.List<RexLocalRef> refs,
java.util.List<RelCollation> inputCollations)
Given a list of expressions and a description of which are ordered,
populates a list of collations, sorted in natural order.
|
RexNode |
expandLocalRef(RexLocalRef ref)
Fully expands a RexLocalRef back into a pure RexNode tree containing no
RexLocalRefs (reversing the effect of common subexpression elimination).
|
RelWriter |
explainCalc(RelWriter pw)
Writes an explanation of the expressions in this program to a plan
writer.
|
RexNode |
gatherExpr(RexNode expr) |
java.util.List<RelCollation> |
getCollations(java.util.List<RelCollation> inputCollations)
Given a list of collations which hold for the input to this program,
returns a list of collations which hold for its output.
|
RexLocalRef |
getCondition()
Returns the field reference of this program's filter condition, or null
if there is no condition.
|
java.util.Set<java.lang.String> |
getCorrelVariableNames()
Returns the set of correlation variables used (read) by this program.
|
int |
getExprCount()
Returns the number of expressions in this program.
|
java.util.List<RexNode> |
getExprList()
Returns the common sub-expressions of this program.
|
RelDataType |
getInputRowType()
Returns the type of the input row to the program.
|
java.util.List<Pair<RexLocalRef,java.lang.String>> |
getNamedProjects()
Returns a list of project expressions and their field names.
|
RelDataType |
getOutputRowType()
Returns the type of the output row from this program.
|
Permutation |
getPermutation()
Returns a permutation, if this program is a permutation, otherwise null.
|
java.util.List<RexLocalRef> |
getProjectList()
Returns an array of references to the expressions which this program is
to project.
|
int[] |
getReferenceCounts()
Gets reference counts for each expression in the program, where the
references are detected from later expressions in the same program, as
well as the project list and condition.
|
int |
getSourceField(int outputOrdinal)
Returns the input field that an output field is populated from, or -1 if
it is populated from an expression.
|
boolean |
isConstant(RexNode ref)
Returns whether an expression is constant.
|
boolean |
isNormalized(Litmus litmus,
RexBuilder rexBuilder)
Returns whether this program is in canonical form.
|
boolean |
isNull(RexNode expr)
Returns whether an expression always evaluates to null.
|
boolean |
isPermutation()
Returns whether this program is a permutation of its inputs.
|
boolean |
isTrivial()
Returns whether this program returns its input exactly.
|
boolean |
isValid(Litmus litmus,
RelNode.Context context)
Checks that this program is valid.
|
RexProgram |
normalize(RexBuilder rexBuilder,
boolean simplify)
Deprecated.
|
RexProgram |
normalize(RexBuilder rexBuilder,
RexSimplify simplify)
Creates a simplified/normalized copy of this program.
|
boolean |
projectsIdentity(boolean fail)
Returns whether the fields on the leading edge of the project list are
the input fields.
|
boolean |
projectsOnlyIdentity()
Returns whether this program projects precisely its input fields.
|
Pair<com.google.common.collect.ImmutableList<RexNode>,com.google.common.collect.ImmutableList<RexNode>> |
split()
Splits this program into a list of project expressions and a list of
filter expressions.
|
java.lang.String |
toString() |
private final java.util.List<RexNode> exprs
private final java.util.List<RexLocalRef> projects
condition
, the second stage of expression evaluation.private final RexLocalRef condition
private final RelDataType inputRowType
private final RelDataType outputRowType
private int[] refCounts
public RexProgram(RelDataType inputRowType, java.util.List<? extends RexNode> exprs, java.util.List<RexLocalRef> projects, RexLocalRef condition, RelDataType outputRowType)
The expressions must be valid: they must not contain common expressions, forward references, or non-trivial aggregates.
inputRowType
- Input row typeexprs
- Common expressionsprojects
- Projection expressionscondition
- Condition expression. If null, calculator does not
filter rowsoutputRowType
- Description of the row produced by the programpublic java.util.List<RexNode> getExprList()
The list is never null but may be empty; each the expression in the list is not null; and no further reduction into smaller common sub-expressions is possible.
public java.util.List<RexLocalRef> getProjectList()
public java.util.List<Pair<RexLocalRef,java.lang.String>> getNamedProjects()
public RexLocalRef getCondition()
public static RexProgram create(RelDataType inputRowType, java.util.List<? extends RexNode> projectExprs, RexNode conditionExpr, RelDataType outputRowType, RexBuilder rexBuilder)
projectExprs
- Project expressionsconditionExpr
- Condition on which to filter rows, or null if rows
are not to be filteredoutputRowType
- Output row typerexBuilder
- Builder of rex expressionspublic static RexProgram create(RelDataType inputRowType, java.util.List<? extends RexNode> projectExprs, RexNode conditionExpr, java.util.List<java.lang.String> fieldNames, RexBuilder rexBuilder)
projectExprs
- Project expressionsconditionExpr
- Condition on which to filter rows, or null if rows
are not to be filteredfieldNames
- Names of projected fieldsrexBuilder
- Builder of rex expressionspublic java.lang.String toString()
toString
in class java.lang.Object
public RelWriter explainCalc(RelWriter pw)
pw
- Plan writerpublic RelWriter collectExplainTerms(java.lang.String prefix, RelWriter pw, SqlExplainLevel level)
prefix
- Prefix for term names, usually the empty string, but useful
if a relational expression contains more than one programpw
- Plan writerprivate static int countTrivial(java.util.List<RexLocalRef> refs)
refs
- Referencespublic int getExprCount()
public static RexProgram createIdentity(RelDataType rowType)
public static RexProgram createIdentity(RelDataType rowType, RelDataType outputRowType)
public RelDataType getInputRowType()
public boolean containsAggs()
public RelDataType getOutputRowType()
public boolean isValid(Litmus litmus, RelNode.Context context)
If fail
is true, executes assert false
, so
will throw an AssertionError
if assertions are enabled. If
fail
is false, merely returns whether the program is valid.
litmus
- What to do if an error is detectedcontext
- Context of enclosing RelNode
, for validity checking,
or null if not knownpublic boolean isNull(RexNode expr)
Like RexUtil.isNull(RexNode)
, null literals are null, and
casts of null literals are null. But this method also regards references
to null expressions as null.
expr
- Expressionpublic RexNode expandLocalRef(RexLocalRef ref)
program.expandLocalRef(program.getCondition())
will return the expansion of a program's condition.ref
- a RexLocalRef from this programpublic Pair<com.google.common.collect.ImmutableList<RexNode>,com.google.common.collect.ImmutableList<RexNode>> split()
Neither list is null. The filters are evaluated first.
public java.util.List<RelCollation> getCollations(java.util.List<RelCollation> inputCollations)
public static void deduceCollations(java.util.List<RelCollation> outputCollations, int sourceCount, java.util.List<RexLocalRef> refs, java.util.List<RelCollation> inputCollations)
public boolean projectsIdentity(boolean fail)
fail
- Whether to throw an assert failure if does not project
identitypublic boolean projectsOnlyIdentity()
public boolean isTrivial()
This is a stronger condition than projectsIdentity(boolean)
.
public int[] getReferenceCounts()
public boolean isConstant(RexNode ref)
public int getSourceField(int outputOrdinal)
public boolean isPermutation()
public Permutation getPermutation()
public java.util.Set<java.lang.String> getCorrelVariableNames()
public boolean isNormalized(Litmus litmus, RexBuilder rexBuilder)
litmus
- What to do if an error is detected (program is not in
canonical form)rexBuilder
- Rex builderpublic RexProgram normalize(RexBuilder rexBuilder, RexSimplify simplify)
rexBuilder
- Rex buildersimplify
- Simplifier to simplify (in addition to normalizing),
or null to not simplify@Deprecated public RexProgram normalize(RexBuilder rexBuilder, boolean simplify)
Copyright © 2012–2019 The Apache Software Foundation. All rights reserved.