Class RexProgram
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.
- See Also:
-
Constructor Summary
ConstructorsConstructorDescriptionRexProgram(RelDataType inputRowType, List<? extends RexNode> exprs, List<RexLocalRef> projects, @Nullable RexLocalRef condition, RelDataType outputRowType) Creates a program. -
Method Summary
Modifier and TypeMethodDescriptioncollectExplainTerms(String prefix, RelWriter pw) collectExplainTerms(String prefix, RelWriter pw, SqlExplainLevel level) Collects the expressions in this program into a list of terms and values.booleanReturns whether this program contains windowed aggregate functions.static RexProgramCreate a program from serialized output.static RexProgramcreate(RelDataType inputRowType, List<? extends RexNode> projectExprs, @Nullable RexNode conditionExpr, @Nullable List<? extends @Nullable String> fieldNames, RexBuilder rexBuilder) Creates a program which calculates projections and filters rows based upon a condition.static RexProgramcreate(RelDataType inputRowType, List<? extends RexNode> projectExprs, @Nullable RexNode conditionExpr, RelDataType outputRowType, RexBuilder rexBuilder) Creates a program which calculates projections and filters rows based upon a condition.static RexProgramcreateIdentity(RelDataType rowType) Creates the identity program.static RexProgramcreateIdentity(RelDataType rowType, RelDataType outputRowType) Creates a program that projects its input fields but with possibly different names for the output fields.static voiddeduceCollations(List<RelCollation> outputCollations, int sourceCount, List<RexLocalRef> refs, List<RelCollation> inputCollations) Given a list of expressions and a description of which are ordered, populates a list of collations, sorted in natural order.expandList(List<? extends RexNode> nodes) Expands a list of expressions that may containRexLocalRefs.Fully expands a RexLocalRef back into a pure RexNode tree containing no RexLocalRefs (reversing the effect of common subexpression elimination).explainCalc(RelWriter pw) Writes an explanation of the expressions in this program to a plan writer.@Nullable RexNodegatherExpr(RexNode expr) getCollations(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.@Nullable RexLocalRefReturns the field reference of this program's filter condition, or null if there is no condition.Returns the set of correlation variables used (read) by this program.intReturns the number of expressions in this program.Returns the common sub-expressions of this program.Returns the type of the input row to the program.Returns a list of project expressions and their field names.Returns the type of the output row from this program.getPartialMapping(int inputFieldCount) Returns a partial mapping of a set of project expressions.@Nullable PermutationReturns a permutation, if this program is a permutation, otherwise null.Returns an array of references to the expressions which this program is to project.int[]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.intgetSourceField(int outputOrdinal) Returns the input field that an output field is populated from, or -1 if it is populated from an expression.booleanisConstant(RexNode ref) Returns whether an expression is constant.booleanisNormalized(Litmus litmus, RexBuilder rexBuilder) Returns whether this program is in canonical form.booleanReturns whether an expression always evaluates to null.booleanReturns whether this program is a permutation of its inputs.booleanReturns whether this program returns its input exactly.booleanisValid(Litmus litmus, @Nullable RelNode.Context context) Checks that this program is valid.normalize(RexBuilder rexBuilder, boolean simplify) Deprecated.normalize(RexBuilder rexBuilder, @Nullable RexSimplify simplify) Creates a simplified/normalized copy of this program.booleanprojectsIdentity(boolean fail) Returns whether the fields on the leading edge of the project list are the input fields.booleanReturns 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.toString()
-
Constructor Details
-
RexProgram
public RexProgram(RelDataType inputRowType, List<? extends RexNode> exprs, List<RexLocalRef> projects, @Nullable RexLocalRef condition, RelDataType outputRowType) Creates a program.The expressions must be valid: they must not contain common expressions, forward references, or non-trivial aggregates.
- Parameters:
inputRowType- Input row typeexprs- Common expressionsprojects- Projection expressionscondition- Condition expression. If null, calculator does not filter rowsoutputRowType- Description of the row produced by the program
-
-
Method Details
-
getExprList
Returns the common sub-expressions of this program.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.
-
getProjectList
Returns an array of references to the expressions which this program is to project. Never null, may be empty. -
getNamedProjects
Returns a list of project expressions and their field names. -
getCondition
Returns the field reference of this program's filter condition, or null if there is no condition. -
create
public static RexProgram create(RelDataType inputRowType, List<? extends RexNode> projectExprs, @Nullable RexNode conditionExpr, RelDataType outputRowType, RexBuilder rexBuilder) Creates a program which calculates projections and filters rows based upon a condition. Does not attempt to eliminate common sub-expressions.- Parameters:
projectExprs- Project expressionsconditionExpr- Condition on which to filter rows, or null if rows are not to be filteredoutputRowType- Output row typerexBuilder- Builder of rex expressions- Returns:
- A program
-
create
public static RexProgram create(RelDataType inputRowType, List<? extends RexNode> projectExprs, @Nullable RexNode conditionExpr, @Nullable List<? extends @Nullable String> fieldNames, RexBuilder rexBuilder) Creates a program which calculates projections and filters rows based upon a condition. Does not attempt to eliminate common sub-expressions.- Parameters:
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 expressions- Returns:
- A program
-
create
Create a program from serialized output. In this case, the input is mainly from the output json string ofRelJsonWriter -
toString
-
explainCalc
Writes an explanation of the expressions in this program to a plan writer.- Parameters:
pw- Plan writer
-
collectExplainTerms
-
collectExplainTerms
Collects the expressions in this program into a list of terms and values.- Parameters:
prefix- Prefix for term names, usually the empty string, but useful if a relational expression contains more than one programpw- Plan writer
-
getExprCount
public int getExprCount()Returns the number of expressions in this program. -
createIdentity
Creates the identity program. -
createIdentity
Creates a program that projects its input fields but with possibly different names for the output fields. -
getInputRowType
Returns the type of the input row to the program.- Returns:
- input row type
-
containsAggs
public boolean containsAggs()Returns whether this program contains windowed aggregate functions.- Returns:
- whether this program contains windowed aggregate functions
-
getOutputRowType
Returns the type of the output row from this program.- Returns:
- output row type
-
isValid
public boolean isValid(@UnknownInitialization RexProgram this, Litmus litmus, @Nullable RelNode.Context context) Checks that this program is valid.If
failis true, executesassert false, so will throw anAssertionErrorif assertions are enabled. Iffailis false, merely returns whether the program is valid.- Parameters:
litmus- What to do if an error is detectedcontext- Context of enclosingRelNode, for validity checking, or null if not known- Returns:
- Whether the program is valid
-
isNull
Returns whether an expression always evaluates to null.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.- Parameters:
expr- Expression- Returns:
- Whether expression always evaluates to null
-
expandLocalRef
Fully expands a RexLocalRef back into a pure RexNode tree containing no RexLocalRefs (reversing the effect of common subexpression elimination). For example,program.expandLocalRef(program.getCondition())will return the expansion of a program's condition.- Parameters:
ref- a RexLocalRef from this program- Returns:
- expanded form
-
expandList
Expands a list of expressions that may containRexLocalRefs. -
split
public 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.Neither list is null. The filters are evaluated first.
-
getCollations
Given a list of collations which hold for the input to this program, returns a list of collations which hold for its output. The result is mutable and sorted. -
deduceCollations
public static void deduceCollations(List<RelCollation> outputCollations, int sourceCount, List<RexLocalRef> refs, List<RelCollation> inputCollations) Given a list of expressions and a description of which are ordered, populates a list of collations, sorted in natural order. -
projectsIdentity
public boolean projectsIdentity(boolean fail) Returns whether the fields on the leading edge of the project list are the input fields.- Parameters:
fail- Whether to throw an assert failure if does not project identity
-
projectsOnlyIdentity
public boolean projectsOnlyIdentity()Returns whether this program projects precisely its input fields. It may or may not apply a condition. -
isTrivial
public boolean isTrivial()Returns whether this program returns its input exactly.This is a stronger condition than
projectsIdentity(boolean). -
getReferenceCounts
public 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. Expressions with references counts greater than 1 are true common sub-expressions.- Returns:
- array of reference counts; the ith element in the returned array is the number of references to getExprList()[i]
-
isConstant
Returns whether an expression is constant. -
gatherExpr
-
getSourceField
public int getSourceField(int outputOrdinal) Returns the input field that an output field is populated from, or -1 if it is populated from an expression. -
isPermutation
public boolean isPermutation()Returns whether this program is a permutation of its inputs. -
getPermutation
Returns a permutation, if this program is a permutation, otherwise null. -
getCorrelVariableNames
Returns the set of correlation variables used (read) by this program.- Returns:
- set of correlation variable names
-
isNormalized
Returns whether this program is in canonical form.- Parameters:
litmus- What to do if an error is detected (program is not in canonical form)rexBuilder- Rex builder- Returns:
- whether in canonical form
-
normalize
Creates a simplified/normalized copy of this program.- Parameters:
rexBuilder- Rex buildersimplify- Simplifier to simplify (in addition to normalizing), or null to not simplify- Returns:
- Normalized program
-
normalize
Deprecated. -
getPartialMapping
Returns a partial mapping of a set of project expressions.The mapping is an inverse function. Every target has a source field, but a source might have 0, 1 or more targets. Project expressions that do not consist of a mapping are ignored.
- Parameters:
inputFieldCount- Number of input fields- Returns:
- Mapping of a set of project expressions, never null
-