Class RexUtil
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classHelper class that expands predicates from disjunctions (split by K).static classDeprecated.static classVisitor which builds a bitmap of the inputs used by an expression.static classShuttle that fixes up an expression to match changes in nullability of input fields.static classVisitor that tells whether a node matching a particular description exists in a tree.static classVisitor that collects all the top level SubQueriesRexSubQueryin a projection list of a givenProject.static classVisitor that throwsUtil.FoundOneif applied to an expression that contains aRexSubQuery. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final RexExecutorExecutor for a bit of constant reduction.static final RexUtil.RexFinderFinds calls to theSqlInternalOperators.M2Vfunction. -
Method Summary
Modifier and TypeMethodDescriptionstatic <E> booleanall(List<? extends E> list, Predicate1<E> predicate) Returns whetherpredicateis true for all elements oflist.static booleanallLiterals(List<RexNode> expressionOperands) Returns whether every expression in a list is a literal.static RexNodeandNot(RexBuilder rexBuilder, RexNode e, Iterable<? extends RexNode> notTerms) Creates the expressione1 AND NOT notTerm1 AND NOT notTerm2 ....static RexNodeandNot(RexBuilder rexBuilder, RexNode e, RexNode... notTerms) Creates the expressione1 AND NOT notTerm1 AND NOT notTerm2 ....static voidApplies a visitor to a list of expressions and, if specified, a single expression.static voidapply(RexVisitor<Void> visitor, RexNode[] exprs, @Nullable RexNode expr) Applies a visitor to an array of expressions and, if specified, a single expression.static <T extends RexNode>
T[]apply(RexVisitor<T> shuttle, T[] exprs) Applies a shuttle to an array of expressions.apply(Mappings.TargetMapping mapping, Iterable<? extends RexNode> nodes) Applies a mapping to an iterable over expressions.static List<RelCollation>apply(Mappings.TargetMapping mapping, List<RelCollation> collationList) Applies a mapping to a collation list.static RelCollationapply(Mappings.TargetMapping mapping, RelCollation collation) Applies a mapping to a collation.static @Nullable RelFieldCollationapply(Mappings.TargetMapping mapping, RelFieldCollation fieldCollation) Applies a mapping to a field collation.static RexNodeapply(Mappings.TargetMapping mapping, RexNode node) Applies a mapping to an expression.static List<RelFieldCollation>applyFields(Mappings.TargetMapping mapping, List<RelFieldCollation> fieldCollations) Applies a mapping to a list of field collations.static booleanstatic booleancompatibleTypes(List<RexNode> exprs, RelDataType type, Litmus litmus) Returns whether the type of an array of expressions is compatible with a struct type.static RexNodecomposeConjunction(RexBuilder rexBuilder, Iterable<? extends @Nullable RexNode> nodes) AscomposeConjunction(RexBuilder, Iterable, boolean)but never returns null.static @Nullable RexNodecomposeConjunction(RexBuilder rexBuilder, Iterable<? extends @Nullable RexNode> nodes, boolean nullOnEmpty) Converts a collection of expressions into an AND.static RexNodecomposeDisjunction(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes) Converts a collection of expressions into an OR.static @Nullable RexNodecomposeDisjunction(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes, boolean nullOnEmpty) Converts a collection of expressions into an OR, optionally returning null if the list is empty.static booleancontainComplexExprs(List<RexNode> exprs) Returns whether a list of expressions contains complex expressions, that is, a call whose arguments are notRexVariable(or a subtype such asRexInputRef) orRexLiteral.static booleancontainIdentity(List<? extends RexNode> exprs, RelDataType rowType, Litmus litmus) Returns whether the leading edge of a given array of expressions is whollyRexInputRefobjects with types corresponding to the underlying datatype.static booleancontainNoCommonExprs(List<RexNode> exprs, Litmus litmus) Returns whether an array of expressions has any common sub-expressions.static booleancontainNoForwardRefs(List<RexNode> exprs, RelDataType inputRowType, Litmus litmus) Returns whether an array of expressions contains no forward references.static booleancontainsCorrelation(RexNode condition) Returns whether an expression contains aRexCorrelVariable.static booleancontainsFieldAccess(RexNode node) Returns whether a given tree contains anyRexFieldAccessnodes.static booleancontainsInputRef(RexNode node) Returns whether a given tree contains any {link RexInputRef} nodes.static booleancontainsTableInputRef(List<RexNode> nodes) Returns whether any of the given expression trees contains a {link RexTableInputRef} node.static @Nullable RexTableInputRefcontainsTableInputRef(RexNode node) Returns whether a given tree contains any {link RexTableInputRef} nodes.static RelDataTypecreateStructType(RelDataTypeFactory typeFactory, List<? extends RexNode> exprs, @Nullable List<? extends @Nullable String> names, @Nullable SqlValidatorUtil.Suggester suggester) Creates a record type with specified field names.static RelDataTypecreateStructType(RelDataTypeFactory typeFactory, List<? extends RexNode> exprs, List<String> names) Deprecated.static RelDataTypecreateStructType(RelDataTypeFactory typeFactory, List<RexNode> exprs) Creates a record type with anonymous field names.static booleanDeprecated.static <E> booleanexists(List<? extends E> list, Predicate1<E> predicate) Returns whether there is an element inlistfor whichpredicateis true.static RexNodeexpandSearch(RexBuilder rexBuilder, @Nullable RexProgram program, RexNode node) Expands all the calls toSqlStdOperatorTable.SEARCHin an expression.static RexNodeexpandSearch(RexBuilder rexBuilder, @Nullable RexProgram program, RexNode node, int maxComplexity) Expands calls toSqlStdOperatorTable.SEARCHwhose complexity is greater thanmaxComplexityin an expression.static List<RelDataTypeFamily>families(List<RelDataType> types) static RexUtil.RexFinderReturns a visitor that finds nodes of givenSqlKinds.static RexUtil.RexFinderfind(RexInputRef ref) Returns a visitor that finds a particularRexInputRef.static RexUtil.RexFinderReturns a visitor that finds nodes of a givenSqlKind.static @Nullable RexCallfindOperatorCall(SqlOperator operator, RexNode node) Returns whether a given node contains a RexCall with a specified operator.fixUp(RexBuilder rexBuilder, List<RexNode> nodes, List<RelDataType> fieldTypes) Fixes up the type of allRexInputRefs in an expression to match differences in nullability.fixUp(RexBuilder rexBuilder, List<RexNode> nodes, RelDataType rowType) Deprecated.flatten(List<? extends RexNode> exprs, SqlOperator op) Converts a list of operands into a list that is flat with respect to the given operator.static RexNodeflatten(RexBuilder rexBuilder, RexNode node) Flattens an expression.static com.google.common.collect.ImmutableList<RexNode>flattenAnd(Iterable<? extends @Nullable RexNode> nodes) Flattens a list of AND nodes.static com.google.common.collect.ImmutableList<RexNode>Flattens a list of OR nodes.static Set<RexTableInputRef.RelTableRef>gatherTableReferences(List<RexNode> nodes) Gather all table references in input expressions.generateCastExpressions(RexBuilder rexBuilder, RelDataType lhsRowType, List<RexNode> rhsExps) Generates a cast for a row type.generateCastExpressions(RexBuilder rexBuilder, RelDataType lhsRowType, RelDataType rhsRowType) Generates a cast from one row type to another.static ImmutableBitSetgetNonConstColumns(List<RexNode> expressions) Given some expressions, gets the indices of the non-constant ones.static ImmutableBitSetgetNonConstColumns(ImmutableBitSet columns, List<RexNode> expressions) Given some expressions and columns, gets the indices of the non-constant ones.static doublegetSelectivity(@Nullable RexNode exp) Returns a guess for the selectivity of an expression.static @Nullable RexNodeinvert(RexBuilder rexBuilder, RexCall call) static booleanstatic booleanisCallTo(RexNode expr, SqlOperator op) static booleanisCasePredicate(RexCall call, int i) Returns whether a given operand of a CASE expression is a predicate.static booleanisConstant(RexNode node) Returns whether node is made up of constants.static booleanReturns whether a given expression is deterministic.static booleanReturns false if the expression can be optimized by flattening calls to an associative operator such as AND and OR.static booleanisIdentity(List<? extends RexNode> exps, RelDataType inputRowType) Returns whether a list of expressions projects the incoming fields.static booleanReturns whether a node represents a literal.static booleanisLosslessCast(RelDataType source, RelDataType target) Returns whether the conversion fromsourcetotargettype is a 'loss-less' cast, that is, a cast from which the original value of the field can be certainly recovered.static booleanisLosslessCast(RexNode node) Returns whether the input is a 'loss-less' cast, that is, a cast from which the original value of the field can be certainly recovered.static booleanReturns whether a node represents the NULL value or a series of nestedCAST(NULL AS type)calls.static booleanisNullabilityCast(RelDataTypeFactory typeFactory, RexNode node) Returns whether an expression is a cast just for the purposes of nullability, not changing any other aspect of the type.static booleanisNullLiteral(RexNode node, boolean allowCast) Returns whether a node represents the NULL value.static booleanisReferenceOrAccess(RexNode node, boolean allowCast) Returns whether a node represents an input reference or field access.static booleanisSymbolLiteral(RexNode expr) Returns whether a node represents aSqlTypeName.SYMBOLliteral.Creates a key forRexNodewhich is the same as another key of another RexNode only if the two have both the same type and textual representation.static @Nullable RexNodenegate(RexBuilder rexBuilder, RexCall call) static intReturns the number of nodes (including leaves) in a list of expressions.static RexNodeNegates a logical expression by adding or removing a NOT.notFn(RexBuilder rexBuilder) Deprecated.static SqlOperatorpredicateConstants(Class<C> clazz, RexBuilder rexBuilder, List<RexNode> predicates) Creates a map containing each (e, constant) pair that occurs within a predicate list.static RexNodepullFactors(RexBuilder rexBuilder, RexNode node) Creates an equivalent version of a node where common factors among ORs are pulled up.static booleanRemoves all expressions from a list that are equivalent to a given expression.static RexNodeRemoves any casts.static RexNoderemoveNullabilityCast(RelDataTypeFactory typeFactory, RexNode node) Removes any casts that change nullability but not type.static booleanrequiresDecimalExpansion(List<RexNode> operands, boolean recurse) Determines whether any operand of a set requires decimal expansion.static booleanrequiresDecimalExpansion(RexNode expr, boolean recurse) Determines whether aRexCallrequires decimal expansion.static booleanrequiresDecimalExpansion(RexProgram program, boolean recurse) Returns whether aRexProgramcontains expressions which require decimal expansion.retainDeterministic(List<RexNode> list) static <C extends Comparable<C>>
RexNodesargRef(RexBuilder rexBuilder, RexNode ref, Sarg<C> sarg, RelDataType type, RexUnknownAs unknownAs) static RexShuttlesearchShuttle(RexBuilder rexBuilder, @Nullable RexProgram program, int maxComplexity) Creates a shuttle that expands calls toSqlStdOperatorTable.SEARCH.Shifts everyRexInputRefin an expression byoffset.static RexNodeShifts everyRexInputRefin an expression byoffset.static RexNodestatic <C extends Comparable<C>>
RexNodesimpleSarg(RexBuilder rexBuilder, RexNode ref, Sarg<C> sarg, RexUnknownAs unknownAs) Expands an 'all' or 'none' sarg.static RexNodesimplify(RexBuilder rexBuilder, RexNode e) Deprecated.Create aRexSimplify, then call itsRexSimplify.simplify(RexNode, RexUnknownAs)method.static RexNodesimplify(RexBuilder rexBuilder, RexNode e, boolean unknownAsFalse) Deprecated.Create aRexSimplify, then call itsRexSimplify.simplify(RexNode, RexUnknownAs)method.static RexNodesimplifyAnd(RexBuilder rexBuilder, RexCall e, boolean unknownAsFalse) Deprecated.static RexNodesimplifyAnd2(RexBuilder rexBuilder, List<RexNode> terms, List<RexNode> notTerms) Deprecated.static RexNodesimplifyAnd2ForUnknownAsFalse(RexBuilder rexBuilder, List<RexNode> terms, List<RexNode> notTerms) Deprecated.static RexNodesimplifyAnds(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes) Deprecated.UseRexSimplify.simplifyAnds(Iterable, RexUnknownAs).static RexNodesimplifyAnds(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes, boolean unknownAsFalse) Deprecated.static RexNodesimplifyOr(RexBuilder rexBuilder, RexCall call) Deprecated.static RexNodesimplifyOrs(RexBuilder rexBuilder, List<RexNode> terms) Deprecated.static RexNodesimplifyPreservingType(RexBuilder rexBuilder, RexNode e) Deprecated.UseRexSimplify.simplifyPreservingType(RexNode), which allows you to specify anRexExecutor.Transforms a list of expressions to the list of digests.static RexNodeswapColumnReferences(RexBuilder rexBuilder, RexNode node, Map<RexTableInputRef, Set<RexTableInputRef>> ec) Given an expression, it will swap its column referencesRexTableInputRefusing the contents in the map (in particular, the first element of the set in the map value).static RexNodeswapColumnTableReferences(RexBuilder rexBuilder, RexNode node, Map<RexTableInputRef, ? extends @Nullable Set<RexTableInputRef>> ec, @Nullable Map<RexTableInputRef.RelTableRef, RexTableInputRef.RelTableRef> tableMapping) Given an expression, it will swap the column referencesRexTableInputRefusing the contents in the first map (in particular, the first element of the set in the map value), and then it will swap the table references contained in itsRexTableInputRefusing the contents in the second map.static RexNodeswapTableColumnReferences(RexBuilder rexBuilder, RexNode node, @Nullable Map<RexTableInputRef.RelTableRef, RexTableInputRef.RelTableRef> tableMapping, @Nullable Map<RexTableInputRef, Set<RexTableInputRef>> ec) Given an expression, it will swap the table references contained in itsRexTableInputRefusing the contents in the first map, and then it will swap the column referencesRexTableInputRefusing the contents in the second map (in particular, the first element of the set in the map value).static RexNodeswapTableReferences(RexBuilder rexBuilder, RexNode node, Map<RexTableInputRef.RelTableRef, RexTableInputRef.RelTableRef> tableMapping) Given an expression, it will swap the table references contained in itsRexTableInputRefusing the contents in the map.static RexNodetoCnf(RexBuilder rexBuilder, int maxCnfNodeCount, RexNode rex) Similar totoCnf(RexBuilder, RexNode); however, it lets you specify a threshold in the number of nodes that can be created out of the conversion.static RexNodetoCnf(RexBuilder rexBuilder, RexNode rex) Converts an expression to conjunctive normal form (CNF).static RexNodetoDnf(RexBuilder rexBuilder, RexNode rex) Converts an expression to disjunctive normal form (DNF).static List<RelDataType>Transforms a list of expressions into a list of their types.
-
Field Details
-
EXECUTOR
Executor for a bit of constant reduction. The user can pass in another executor. -
M2V_FINDER
Finds calls to theSqlInternalOperators.M2Vfunction.
-
-
Method Details
-
getSelectivity
Returns a guess for the selectivity of an expression.- Parameters:
exp- expression of interest, or null for none (implying a selectivity of 1.0)- Returns:
- guessed selectivity
-
generateCastExpressions
public static List<RexNode> generateCastExpressions(RexBuilder rexBuilder, RelDataType lhsRowType, RelDataType rhsRowType) Generates a cast from one row type to another.- Parameters:
rexBuilder- RexBuilder to use for constructing castslhsRowType- target row typerhsRowType- source row type; fields must be 1-to-1 with lhsRowType, in same order- Returns:
- cast expressions
-
generateCastExpressions
public static List<RexNode> generateCastExpressions(RexBuilder rexBuilder, RelDataType lhsRowType, List<RexNode> rhsExps) Generates a cast for a row type.- Parameters:
rexBuilder- RexBuilder to use for constructing castslhsRowType- target row typerhsExps- expressions to be cast- Returns:
- cast expressions
-
isNullLiteral
Returns whether a node represents the NULL value.Examples:
- For
RexLiteralUnknown, returns false. - For
CAST(NULL AS type), returns true ifallowCastis true, false otherwise. - For
CAST(CAST(NULL AS type) AS type)), returns false.
- For
-
isNull
Returns whether a node represents the NULL value or a series of nestedCAST(NULL AS type)calls. For example:isNull(CAST(CAST(NULL as INTEGER) AS VARCHAR(1)))returnstrue. -
isSymbolLiteral
Returns whether a node represents aSqlTypeName.SYMBOLliteral. -
isLiteral
Returns whether a node represents a literal.Examples:
- For
CAST(literal AS type), returns true ifallowCastis true, false otherwise. - For
CAST(CAST(literal AS type) AS type)), returns false.
- Parameters:
node- The node, never null.allowCast- whether to regard CAST(literal) as a literal- Returns:
- Whether the node is a literal
- For
-
allLiterals
Returns whether every expression in a list is a literal.- Parameters:
expressionOperands- list of expressions to check- Returns:
- true if every expression from the specified list is literal.
-
isReferenceOrAccess
Returns whether a node represents an input reference or field access.- Parameters:
node- The node, never null.allowCast- whether to regard CAST(x) as true- Returns:
- Whether the node is a reference or access
-
isNullabilityCast
Returns whether an expression is a cast just for the purposes of nullability, not changing any other aspect of the type. -
removeNullabilityCast
Removes any casts that change nullability but not type.For example,
CAST(1 = 0 AS BOOLEAN)becomes1 = 0. -
removeCast
Removes any casts.For example,
CAST('1' AS INTEGER)becomes'1'. -
predicateConstants
public static <C extends RexNode> com.google.common.collect.ImmutableMap<RexNode,C> predicateConstants(Class<C> clazz, RexBuilder rexBuilder, List<RexNode> predicates) Creates a map containing each (e, constant) pair that occurs within a predicate list.- Type Parameters:
C- what to consider a constant:RexLiteralto use a narrow definition of constant, orRexNodeto useisConstant(RexNode)- Parameters:
clazz- Class of expression that is considered constantrexBuilder- Rex builderpredicates- Predicate list- Returns:
- Map from values to constants
-
nodeCount
Returns the number of nodes (including leaves) in a list of expressions.- See Also:
-
find
Returns a visitor that finds nodes of a givenSqlKind. -
find
Returns a visitor that finds nodes of givenSqlKinds. -
find
Returns a visitor that finds a particularRexInputRef. -
expandSearch
public static RexNode expandSearch(RexBuilder rexBuilder, @Nullable RexProgram program, RexNode node) Expands all the calls toSqlStdOperatorTable.SEARCHin an expression. -
expandSearch
public static RexNode expandSearch(RexBuilder rexBuilder, @Nullable RexProgram program, RexNode node, int maxComplexity) Expands calls toSqlStdOperatorTable.SEARCHwhose complexity is greater thanmaxComplexityin an expression. -
searchShuttle
public static RexShuttle searchShuttle(RexBuilder rexBuilder, @Nullable RexProgram program, int maxComplexity) Creates a shuttle that expands calls toSqlStdOperatorTable.SEARCH.If
maxComplexityis non-negative, aSargwhose complexity is greater thanmaxComplexityis retained (not expanded); this gives a means to simplify simple expressions such asx IS NULLorx > 10while keeping more complex expressions such asx IN (3, 5, 7) OR x IS NULLas a Sarg. -
sargRef
public static <C extends Comparable<C>> RexNode sargRef(RexBuilder rexBuilder, RexNode ref, Sarg<C> sarg, RelDataType type, RexUnknownAs unknownAs) -
simpleSarg
public static <C extends Comparable<C>> RexNode simpleSarg(RexBuilder rexBuilder, RexNode ref, Sarg<C> sarg, RexUnknownAs unknownAs) Expands an 'all' or 'none' sarg. -
isConstant
Returns whether node is made up of constants.- Parameters:
node- Node to inspect- Returns:
- true if node is made up of constants, false otherwise
-
isDeterministic
Returns whether a given expression is deterministic.- Parameters:
e- Expression- Returns:
- true if tree result is deterministic, false otherwise
-
retainDeterministic
-
findOperatorCall
Returns whether a given node contains a RexCall with a specified operator.- Parameters:
operator- Operator to look fornode- a RexNode tree
-
containsInputRef
Returns whether a given tree contains any {link RexInputRef} nodes.- Parameters:
node- a RexNode tree
-
containsFieldAccess
Returns whether a given tree contains anyRexFieldAccessnodes.- Parameters:
node- a RexNode tree
-
requiresDecimalExpansion
Determines whether aRexCallrequires decimal expansion. It usually requires expansion if it has decimal operands.Exceptions to this rule are:
- isNull doesn't require expansion
- It's okay to cast decimals to and from char types
- It's okay to cast nulls as decimals
- Casts require expansion if their return type is decimal
- Reinterpret casts can handle a decimal operand
- Parameters:
expr- expression possibly in need of expansionrecurse- whether to check nested calls- Returns:
- whether the expression requires expansion
-
requiresDecimalExpansion
Determines whether any operand of a set requires decimal expansion. -
requiresDecimalExpansion
Returns whether aRexProgramcontains expressions which require decimal expansion. -
canReinterpretOverflow
-
containNoCommonExprs
Returns whether an array of expressions has any common sub-expressions. -
containNoForwardRefs
public static boolean containNoForwardRefs(List<RexNode> exprs, RelDataType inputRowType, Litmus litmus) Returns whether an array of expressions contains no forward references. That is, if expression #i contains aRexInputRefreferencing field i or greater.- Parameters:
exprs- Array of expressionsinputRowType- Input row typelitmus- What to do if an error is detected (there is a forward reference)- Returns:
- Whether there is a forward reference
-
containComplexExprs
Returns whether a list of expressions contains complex expressions, that is, a call whose arguments are notRexVariable(or a subtype such asRexInputRef) orRexLiteral. -
containsTableInputRef
Returns whether any of the given expression trees contains a {link RexTableInputRef} node.- Parameters:
nodes- a list of RexNode trees- Returns:
- true if at least one was found, otherwise false
-
containsTableInputRef
Returns whether a given tree contains any {link RexTableInputRef} nodes.- Parameters:
node- a RexNode tree- Returns:
- first such node found or null if it there is no such node
-
isAtomic
-
isCallTo
-
createStructType
Creates a record type with anonymous field names.- Parameters:
typeFactory- Type factoryexprs- Expressions- Returns:
- Record type
-
createStructType
public static RelDataType createStructType(RelDataTypeFactory typeFactory, List<? extends RexNode> exprs, @Nullable List<? extends @Nullable String> names, @Nullable SqlValidatorUtil.Suggester suggester) Creates a record type with specified field names.The array of field names may be null, or any of the names within it can be null. We recommend using explicit names where possible, because it makes it much easier to figure out the intent of fields when looking at planner output.
- Parameters:
typeFactory- Type factoryexprs- Expressionsnames- Field names, may be null, or elements may be nullsuggester- Generates alternative names ifnamesis not null and its elements are not unique- Returns:
- Record type
-
createStructType
@Deprecated public static RelDataType createStructType(RelDataTypeFactory typeFactory, List<? extends RexNode> exprs, List<String> names) Deprecated. -
compatibleTypes
Returns whether the type of an array of expressions is compatible with a struct type.- Parameters:
exprs- Array of expressionstype- Typelitmus- What to do if an error is detected (there is a mismatch)- Returns:
- Whether every expression has the same type as the corresponding member of the struct type
- See Also:
-
makeKey
Creates a key forRexNodewhich is the same as another key of another RexNode only if the two have both the same type and textual representation. For example, "10" integer and "10" bigint result in different keys. -
containIdentity
public static boolean containIdentity(List<? extends RexNode> exprs, RelDataType rowType, Litmus litmus) Returns whether the leading edge of a given array of expressions is whollyRexInputRefobjects with types corresponding to the underlying datatype. -
isIdentity
Returns whether a list of expressions projects the incoming fields. -
composeConjunction
public static RexNode composeConjunction(RexBuilder rexBuilder, Iterable<? extends @Nullable RexNode> nodes) AscomposeConjunction(RexBuilder, Iterable, boolean)but never returns null. -
composeConjunction
public static @Nullable RexNode composeConjunction(RexBuilder rexBuilder, Iterable<? extends @Nullable RexNode> nodes, boolean nullOnEmpty) Converts a collection of expressions into an AND. If there are zero expressions, returns TRUE. If there is one expression, returns just that expression. If any of the expressions are FALSE, returns FALSE. Removes expressions that always evaluate to TRUE. Returns null only ifnullOnEmptyand expression is TRUE. -
flattenAnd
public static com.google.common.collect.ImmutableList<RexNode> flattenAnd(Iterable<? extends @Nullable RexNode> nodes) Flattens a list of AND nodes.Treats null nodes as literal TRUE (i.e. ignores them).
-
composeDisjunction
Converts a collection of expressions into an OR. If there are zero expressions, returns FALSE. If there is one expression, returns just that expression. If any of the expressions are TRUE, returns TRUE. Removes expressions that always evaluate to FALSE. Flattens expressions that are ORs. -
composeDisjunction
public static @Nullable RexNode composeDisjunction(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes, boolean nullOnEmpty) Converts a collection of expressions into an OR, optionally returning null if the list is empty. -
flattenOr
public static com.google.common.collect.ImmutableList<RexNode> flattenOr(Iterable<? extends RexNode> nodes) Flattens a list of OR nodes. -
apply
public static List<RelCollation> apply(Mappings.TargetMapping mapping, List<RelCollation> collationList) Applies a mapping to a collation list.- Parameters:
mapping- MappingcollationList- Collation list- Returns:
- collation list with mapping applied to each field
-
apply
Applies a mapping to a collation.- Parameters:
mapping- Mappingcollation- Collation- Returns:
- collation with mapping applied
-
apply
public static @Nullable RelFieldCollation apply(Mappings.TargetMapping mapping, RelFieldCollation fieldCollation) Applies a mapping to a field collation.If the field is not mapped, returns null.
- Parameters:
mapping- MappingfieldCollation- Field collation- Returns:
- collation with mapping applied
-
applyFields
public static List<RelFieldCollation> applyFields(Mappings.TargetMapping mapping, List<RelFieldCollation> fieldCollations) Applies a mapping to a list of field collations.- Parameters:
mapping- MappingfieldCollations- Field collations- Returns:
- collations with mapping applied
-
apply
Applies a mapping to an expression. -
apply
public static List<RexNode> apply(Mappings.TargetMapping mapping, Iterable<? extends RexNode> nodes) Applies a mapping to an iterable over expressions. -
apply
Applies a shuttle to an array of expressions. Creates a copy first.- Parameters:
shuttle- Shuttleexprs- Array of expressions
-
apply
Applies a visitor to an array of expressions and, if specified, a single expression.- Parameters:
visitor- Visitorexprs- Array of expressionsexpr- Single expression, may be null
-
apply
public static void apply(RexVisitor<Void> visitor, List<? extends RexNode> exprs, @Nullable RexNode expr) Applies a visitor to a list of expressions and, if specified, a single expression.- Parameters:
visitor- Visitorexprs- List of expressionsexpr- Single expression, may be null
-
flatten
Flattens an expression.Returns the same expression if it is already flat.
-
flatten
Converts a list of operands into a list that is flat with respect to the given operator. The operands are assumed to be flat already. -
isFlat
Returns false if the expression can be optimized by flattening calls to an associative operator such as AND and OR. -
isLosslessCast
Returns whether the input is a 'loss-less' cast, that is, a cast from which the original value of the field can be certainly recovered.For instance, int → bigint is loss-less (as you can cast back to int without loss of information), but bigint → int is not loss-less.
The implementation of this method does not return false positives. However, it is not complete.
- Parameters:
node- input node to verify if it represents a loss-less cast- Returns:
- true iff the node is a loss-less cast
-
isLosslessCast
@API(since="1.22", status=EXPERIMENTAL) public static boolean isLosslessCast(RelDataType source, RelDataType target) Returns whether the conversion fromsourcetotargettype is a 'loss-less' cast, that is, a cast from which the original value of the field can be certainly recovered.For instance, int → bigint is loss-less (as you can cast back to int without loss of information), but bigint → int is not loss-less.
The implementation of this method does not return false positives. However, it is not complete.
- Parameters:
source- source typetarget- target type- Returns:
- 'true' when the conversion can certainly be determined to be loss-less cast, but may return 'false' for some lossless casts.
-
toCnf
Converts an expression to conjunctive normal form (CNF).The following expression is in CNF:
(a OR b) AND (c OR d)
The following expression is not in CNF:
(a AND b) OR c
but can be converted to CNF:
(a OR c) AND (b OR c)
The following expression is not in CNF:
NOT (a OR NOT b)
but can be converted to CNF by applying de Morgan's theorem:
NOT a AND b
Expressions not involving AND, OR or NOT at the top level are in CNF.
-
toCnf
Similar totoCnf(RexBuilder, RexNode); however, it lets you specify a threshold in the number of nodes that can be created out of the conversion.If the number of resulting nodes exceeds that threshold, stops conversion and returns the original expression.
If the threshold is negative it is ignored.
Leaf nodes in the expression do not count towards the threshold.
-
toDnf
Converts an expression to disjunctive normal form (DNF).DNF: It is a form of logical formula which is disjunction of conjunctive clauses.
All logical formulas can be converted into DNF.
The following expression is in DNF:
(a AND b) OR (c AND d)
The following expression is not in CNF:
(a OR b) AND c
but can be converted to DNF:
(a AND c) OR (b AND c)
The following expression is not in CNF:
NOT (a OR NOT b)
but can be converted to DNF by applying de Morgan's theorem:
NOT a AND b
Expressions not involving AND, OR or NOT at the top level are in DNF.
-
exists
Returns whether there is an element inlistfor whichpredicateis true. -
all
Returns whetherpredicateis true for all elements oflist. -
shift
Shifts everyRexInputRefin an expression byoffset. -
shift
Shifts everyRexInputRefin an expression byoffset. -
shift
-
pullFactors
Creates an equivalent version of a node where common factors among ORs are pulled up.For example,
(a AND b) OR (a AND c AND d)
becomes
a AND (b OR (c AND d))
Note that this result is not in CNF (see
toCnf(RexBuilder, RexNode)) because there is an AND inside an OR.This form is useful if, say,
acontains columns from only the left-hand side of a join, and can be pushed to the left input.- Parameters:
rexBuilder- Rex buildernode- Expression to transform- Returns:
- Equivalent expression with common factors pulled up
-
fixUp
@Deprecated public static List<RexNode> fixUp(RexBuilder rexBuilder, List<RexNode> nodes, RelDataType rowType) Deprecated. -
fixUp
public static List<RexNode> fixUp(RexBuilder rexBuilder, List<RexNode> nodes, List<RelDataType> fieldTypes) Fixes up the type of allRexInputRefs in an expression to match differences in nullability.Such differences in nullability occur when expressions are moved through outer joins.
Throws if there any greater inconsistencies of type.
-
types
Transforms a list of expressions into a list of their types. -
families
-
removeAll
Removes all expressions from a list that are equivalent to a given expression. Returns whether any were removed. -
eq
Deprecated.Returns whether twoRexNodes are structurally equal.This method considers structure, not semantics. 'x < y' is not equivalent to 'y > x'.
-
simplifyPreservingType
Deprecated.UseRexSimplify.simplifyPreservingType(RexNode), which allows you to specify anRexExecutor.Simplifies a boolean expression, always preserving its type and its nullability.This is useful if you are simplifying expressions in a
Project. -
simplify
Deprecated.Create aRexSimplify, then call itsRexSimplify.simplify(RexNode, RexUnknownAs)method.Simplifies a boolean expression, leaving UNKNOWN values as UNKNOWN, and using the default executor. -
simplify
@Deprecated public static RexNode simplify(RexBuilder rexBuilder, RexNode e, boolean unknownAsFalse) Deprecated.Create aRexSimplify, then call itsRexSimplify.simplify(RexNode, RexUnknownAs)method.Simplifies a boolean expression, using the default executor.In particular:
simplify(x = 1 AND y = 2 AND NOT x = 1)returnsy = 2simplify(x = 1 AND FALSE)returnsFALSE
If the expression is a predicate in a WHERE clause, UNKNOWN values have the same effect as FALSE. In situations like this, specify
unknownAsFalse = true, so and we can switch from 3-valued logic to simpler 2-valued logic and make more optimizations.- Parameters:
rexBuilder- Rex buildere- Expression to simplifyunknownAsFalse- Whether to convert UNKNOWN values to FALSE
-
simplifyAnds
@Deprecated public static RexNode simplifyAnds(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes) Deprecated.UseRexSimplify.simplifyAnds(Iterable, RexUnknownAs).Simplifies a conjunction of boolean expressions. -
simplifyAnds
@Deprecated public static RexNode simplifyAnds(RexBuilder rexBuilder, Iterable<? extends RexNode> nodes, boolean unknownAsFalse) Deprecated. -
not
Negates a logical expression by adding or removing a NOT. -
op
-
simplifyAnd
@Deprecated public static RexNode simplifyAnd(RexBuilder rexBuilder, RexCall e, boolean unknownAsFalse) Deprecated. -
simplifyAnd2
@Deprecated public static RexNode simplifyAnd2(RexBuilder rexBuilder, List<RexNode> terms, List<RexNode> notTerms) Deprecated. -
simplifyAnd2ForUnknownAsFalse
@Deprecated public static RexNode simplifyAnd2ForUnknownAsFalse(RexBuilder rexBuilder, List<RexNode> terms, List<RexNode> notTerms) Deprecated. -
negate
-
invert
-
simplifyOr
Deprecated. -
simplifyOrs
Deprecated. -
andNot
Creates the expressione1 AND NOT notTerm1 AND NOT notTerm2 .... -
andNot
public static RexNode andNot(RexBuilder rexBuilder, RexNode e, Iterable<? extends RexNode> notTerms) Creates the expressione1 AND NOT notTerm1 AND NOT notTerm2 ....Examples:
- andNot(p) returns "p"
- andNot(p, n1, n2) returns "p AND NOT n1 AND NOT n2"
- andNot(x = 10, x = 20, y = 30, x = 30) returns "x = 10 AND NOT (y = 30)"
-
isCasePredicate
Returns whether a given operand of a CASE expression is a predicate.A switched case (CASE x WHEN x1 THEN v1 ... ELSE e END) has an even number of arguments and odd-numbered arguments are predicates.
A condition case (CASE WHEN p1 THEN v1 ... ELSE e END) has an odd number of arguments and even-numbered arguments are predicates, except for the last argument.
-
notFn
@Deprecated public static com.google.common.base.Function<RexNode,RexNode> notFn(RexBuilder rexBuilder) Deprecated.Returns a function that applies NOT to its argument. -
containsCorrelation
Returns whether an expression contains aRexCorrelVariable. -
swapTableReferences
public static RexNode swapTableReferences(RexBuilder rexBuilder, RexNode node, Map<RexTableInputRef.RelTableRef, RexTableInputRef.RelTableRef> tableMapping) Given an expression, it will swap the table references contained in itsRexTableInputRefusing the contents in the map. -
swapColumnReferences
public static RexNode swapColumnReferences(RexBuilder rexBuilder, RexNode node, Map<RexTableInputRef, Set<RexTableInputRef>> ec) Given an expression, it will swap its column referencesRexTableInputRefusing the contents in the map (in particular, the first element of the set in the map value). -
swapTableColumnReferences
public static RexNode swapTableColumnReferences(RexBuilder rexBuilder, RexNode node, @Nullable Map<RexTableInputRef.RelTableRef, RexTableInputRef.RelTableRef> tableMapping, @Nullable Map<RexTableInputRef, Set<RexTableInputRef>> ec) Given an expression, it will swap the table references contained in itsRexTableInputRefusing the contents in the first map, and then it will swap the column referencesRexTableInputRefusing the contents in the second map (in particular, the first element of the set in the map value). -
swapColumnTableReferences
public static RexNode swapColumnTableReferences(RexBuilder rexBuilder, RexNode node, Map<RexTableInputRef, ? extends @Nullable Set<RexTableInputRef>> ec, @Nullable Map<RexTableInputRef.RelTableRef, RexTableInputRef.RelTableRef> tableMapping) Given an expression, it will swap the column referencesRexTableInputRefusing the contents in the first map (in particular, the first element of the set in the map value), and then it will swap the table references contained in itsRexTableInputRefusing the contents in the second map. -
gatherTableReferences
Gather all table references in input expressions.- Parameters:
nodes- expressions- Returns:
- set of table references
-
getNonConstColumns
Given some expressions, gets the indices of the non-constant ones. -
getNonConstColumns
public static ImmutableBitSet getNonConstColumns(ImmutableBitSet columns, List<RexNode> expressions) Given some expressions and columns, gets the indices of the non-constant ones. -
strings
Transforms a list of expressions to the list of digests.
-
not(org.apache.calcite.rex.RexNode)