| Modifier and Type | Class and Description |
|---|---|
static class |
RelOptUtil.Exists
|
static class |
RelOptUtil.InputFinder
Visitor which builds a bitmap of the inputs used by an expression.
|
static class |
RelOptUtil.InputReferencedVisitor
Shuttle that finds the set of inputs that are used.
|
static class |
RelOptUtil.Logic
Policies for handling two- and three-valued boolean logic.
|
static class |
RelOptUtil.RexInputConverter
Walks an expression tree, converting the index of RexInputRefs based on
some adjustment factor.
|
static class |
RelOptUtil.SubQueryType
What kind of sub-query.
|
static class |
RelOptUtil.TypeDumper
Converts types to descriptive strings.
|
static class |
RelOptUtil.VariableUsedVisitor
Visitor that finds all variables used in an expression.
|
| Modifier and Type | Field and Description |
|---|---|
static com.google.common.base.Predicate<Calc> |
CALC_PREDICATE
Deprecated.
|
static double |
EPSILON |
static com.google.common.base.Predicate<Filter> |
FILTER_PREDICATE
Deprecated.
|
static com.google.common.base.Predicate<Project> |
PROJECT_PREDICATE
Deprecated.
|
| Constructor and Description |
|---|
RelOptUtil() |
| Modifier and Type | Method and Description |
|---|---|
static <T extends RelNode> |
addTrait(T rel,
RelTrait trait) |
static List<Integer> |
adjustKeys(List<Integer> keys,
int adjustment)
Adjusts key values in a list by some fixed amount.
|
static boolean |
analyzeSimpleEquiJoin(LogicalJoin join,
int[] joinFieldOrdinals)
Deprecated.
|
static RexNode |
andJoinFilters(RexBuilder rexBuilder,
@Nullable RexNode left,
@Nullable RexNode right)
Ands two sets of join filters together, either of which can be null.
|
static boolean |
areRowTypesEqual(RelDataType rowType1,
RelDataType rowType2,
boolean compareNames) |
static boolean |
checkProjAndChildInputs(Project project,
boolean checkNames)
Deprecated.
|
static boolean |
classifyFilters(RelNode joinRel,
List<RexNode> filters,
boolean pushInto,
boolean pushLeft,
boolean pushRight,
List<RexNode> joinFilters,
List<RexNode> leftFilters,
List<RexNode> rightFilters)
Classifies filters according to where they should be processed.
|
static boolean |
classifyFilters(RelNode joinRel,
List<RexNode> filters,
JoinRelType joinType,
boolean pushInto,
boolean pushLeft,
boolean pushRight,
List<RexNode> joinFilters,
List<RexNode> leftFilters,
List<RexNode> rightFilters)
|
static RexCall |
collapseExpandedIsNotDistinctFromExpr(RexCall call,
RexBuilder rexBuilder)
Collapses an expanded version of
IS NOT DISTINCT FROM expression. |
static List<RexNode> |
conjunctions(@Nullable RexNode rexPredicate)
Returns a condition decomposed by AND.
|
static boolean |
contains(RelNode ancestor,
RelNode target)
Returns whether relational expression
target occurs within a
relational expression ancestor. |
static RelNode |
copyRelHints(RelNode originalRel,
RelNode newRel)
|
static RelNode |
copyRelHints(RelNode originalRel,
RelNode newRel,
boolean filterHints)
|
static ImmutableBitSet |
correlationColumns(CorrelationId id,
RelNode rel)
Finds which columns of a correlation variable are used within a
relational expression.
|
static int |
countJoins(RelNode rootRel)
Returns the number of
Join nodes in a
tree. |
static RelNode |
createCastRel(RelNode rel,
RelDataType castRowType,
boolean rename)
Creates a projection which casts a rel's output to a desired row type.
|
static RelNode |
createCastRel(RelNode rel,
RelDataType castRowType,
boolean rename,
RelFactories.ProjectFactory projectFactory)
Creates a projection which casts a rel's output to a desired row type.
|
static RelNode |
createDistinctRel(RelNode rel)
Deprecated.
|
static RelDataType |
createDmlRowType(SqlKind kind,
RelDataTypeFactory typeFactory)
Creates the row type descriptor for the result of a DML operation, which
is a single column named ROWCOUNT of type BIGINT for INSERT;
a single column named PLAN for EXPLAIN.
|
static RexNode |
createEquiJoinCondition(RelNode left,
List<Integer> leftKeys,
RelNode right,
List<Integer> rightKeys,
RexBuilder rexBuilder)
Builds an equi-join condition from a set of left and right keys.
|
static RelOptUtil.Exists |
createExistsPlan(RelNode seekRel,
RelOptUtil.SubQueryType subQueryType,
RelOptUtil.Logic logic,
boolean notIn)
Deprecated.
|
static RelOptUtil.Exists |
createExistsPlan(RelNode seekRel,
RelOptUtil.SubQueryType subQueryType,
RelOptUtil.Logic logic,
boolean notIn,
RelBuilder relBuilder)
Creates a plan suitable for use in
EXISTS or IN
statements. |
static RelNode |
createExistsPlan(RelOptCluster cluster,
RelNode seekRel,
@Nullable List<RexNode> conditions,
@Nullable RexLiteral extraExpr,
@Nullable String extraName)
Deprecated.
|
static RelNode |
createFilter(RelNode child,
Iterable<? extends RexNode> conditions)
Creates a filter, using the default filter factory,
or returns the original relational expression if the
condition is trivial.
|
static RelNode |
createFilter(RelNode child,
Iterable<? extends RexNode> conditions,
RelFactories.FilterFactory filterFactory)
Creates a filter using the default factory,
or returns the original relational expression if the
condition is trivial.
|
static RelNode |
createFilter(RelNode child,
RexNode condition)
Deprecated.
|
static RelNode |
createFilter(RelNode child,
RexNode condition,
RelFactories.FilterFactory filterFactory)
Deprecated.
|
static RelNode |
createNullFilter(RelNode rel,
Integer[] fieldOrdinals)
Deprecated.
|
static RelNode |
createProject(RelFactories.ProjectFactory factory,
RelNode child,
List<Integer> posList)
Creates a relational expression that projects the given fields of the
input.
|
static RelNode |
createProject(RelNode child,
List<? extends RexNode> exprs,
List<? extends String> fieldNames,
boolean optimize)
Deprecated.
|
static RelNode |
createProject(RelNode child,
List<? extends RexNode> exprs,
List<? extends String> fieldNames,
boolean optimize,
RelBuilder relBuilder)
Deprecated.
|
static RelNode |
createProject(RelNode child,
List<? extends RexNode> exprList,
List<String> fieldNameList)
Deprecated.
|
static RelNode |
createProject(RelNode child,
List<Integer> posList)
Creates a relational expression that projects the given fields of the
input.
|
static RelNode |
createProject(RelNode child,
List<Pair<RexNode,? extends String>> projectList,
boolean optimize)
Deprecated.
|
static RelNode |
createProject(RelNode child,
Mappings.TargetMapping mapping)
Creates a
LogicalProject that
projects particular fields of its input, according to a mapping. |
static RelNode |
createProject(RelNode child,
Mappings.TargetMapping mapping,
RelFactories.ProjectFactory projectFactory) |
static RelNode |
createProjectJoinRel(List<Integer> outputProj,
RelNode joinRel)
Deprecated.
|
static RelNode |
createRename(RelNode rel,
List<? extends String> fieldNames)
Deprecated.
|
static RelNode |
createRenameRel(RelDataType outputType,
RelNode rel)
Deprecated.
|
static RelNode |
createSingleValueAggRel(RelOptCluster cluster,
RelNode rel)
Creates a LogicalAggregate that removes all duplicates from the result of
an underlying relational expression.
|
static List<RexNode> |
createSwappedJoinExprs(RelNode newJoin,
Join origJoin,
boolean origOrder)
Creates projection expressions reflecting the swapping of a join's input.
|
static void |
decomposeConjunction(@Nullable RexNode rexPredicate,
List<RexNode> rexList)
Decomposes a predicate into a list of expressions that are AND'ed
together.
|
static void |
decomposeConjunction(@Nullable RexNode rexPredicate,
List<RexNode> rexList,
List<RexNode> notList)
Decomposes a predicate into a list of expressions that are AND'ed
together, and a list of expressions that are preceded by NOT.
|
static void |
decomposeDisjunction(@Nullable RexNode rexPredicate,
List<RexNode> rexList)
Decomposes a predicate into a list of expressions that are OR'ed
together.
|
static List<RelDataTypeField> |
deduplicateColumns(List<RelDataTypeField> baseColumns,
List<RelDataTypeField> extendedColumns)
Returns the set of columns with unique names, with prior columns taking
precedence over columns that appear later in the list.
|
static List<RexNode> |
disjunctions(RexNode rexPredicate)
Returns a condition decomposed by OR.
|
static String |
dumpPlan(String header,
RelNode rel,
boolean asXml,
SqlExplainLevel detailLevel)
Deprecated.
|
static String |
dumpPlan(String header,
RelNode rel,
SqlExplainFormat format,
SqlExplainLevel detailLevel)
Dumps a plan as a string.
|
static String |
dumpType(RelDataType type) |
static boolean |
eq(String desc1,
RelDataType type1,
String desc2,
RelDataType type2,
Litmus litmus)
Returns whether two types are equal using 'equals'.
|
static boolean |
equal(String desc1,
RelDataType type1,
String desc2,
RelDataType type2,
Litmus litmus)
Returns whether two types are equal using
areRowTypesEqual(RelDataType, RelDataType, boolean). |
static boolean |
equalType(String desc0,
RelNode rel0,
String desc1,
RelNode rel1,
Litmus litmus)
Returns whether two relational expressions have the same row-type.
|
static List<String> |
findAllTableQualifiedNames(RelNode rel)
Returns a list of all table qualified names used by this expression
or its children.
|
static List<RelOptTable> |
findAllTables(RelNode rel)
Returns a list of all tables used by this expression or its children.
|
static Set<RelOptTable> |
findTables(RelNode rel)
Returns a set of tables used by this expression or its children.
|
static Set<Integer> |
getAllFields(Aggregate aggregate)
Gets all fields in an aggregate.
|
static Set<Integer> |
getAllFields2(ImmutableBitSet groupSet,
List<AggregateCall> aggCallList)
Gets all fields in an aggregate.
|
static Map<Integer,RexNode> |
getColumnConstraints(ModifiableView modifiableViewTable,
RelDataType targetRowType,
RelDataTypeFactory typeFactory)
Returns a mapping of the column ordinal in the underlying table to a column
constraint of the modifiable view.
|
static RelOptTable.ToRelContext |
getContext(RelOptCluster cluster)
Deprecated.
|
static List<RelDataType> |
getFieldTypeList(RelDataType type)
Returns a list of the types of the fields in a given struct type.
|
static String |
getFullTypeDifferenceString(String sourceDesc,
RelDataType sourceType,
String targetDesc,
RelDataType targetType)
Returns the detailed difference of two types.
|
static Set<CorrelationId> |
getVariablesSet(RelNode rel)
Returns a list of variables set by a relational expression or its
descendants.
|
static List<CorrelationId> |
getVariablesSetAndUsed(RelNode rel0,
RelNode rel1)
Deprecated.
|
static Set<CorrelationId> |
getVariablesUsed(RelNode rel)
Returns a set of variables used by a relational expression or its
descendants.
|
static void |
go(RelVisitor visitor,
RelNode p)
Sets a
RelVisitor going on a given relational expression, and
returns the result. |
static void |
inferViewPredicates(Map<Integer,RexNode> projectMap,
List<RexNode> filters,
RexNode constraint)
Decomposes the WHERE clause of a view into predicates that constraint
a column to a particular value.
|
static RexNode |
isDistinctFrom(RexBuilder rexBuilder,
RexNode x,
RexNode y,
boolean neg)
Returns a translation of the
IS DISTINCT FROM (or IS
NOT DISTINCT FROM) sql operator. |
static boolean |
isEqui(RelNode left,
RelNode right,
RexNode condition)
Deprecated.
|
static boolean |
isLimit(RelNode rel)
Whether this node contains a limit specification.
|
static boolean |
isOrder(RelNode rel)
Whether this node contains a sort specification.
|
static boolean |
isPureLimit(RelNode rel)
Whether this node is a limit without sort specification.
|
static boolean |
isPureOrder(RelNode rel)
Whether this node is a sort without limit specification.
|
static boolean |
notContainsCorrelation(RelNode r,
CorrelationId correlationId,
Litmus litmus)
Returns true, and calls
Litmus.succeed() if a given relational
expression does not contain a given correlation. |
static boolean |
notContainsWindowedAgg(Calc calc)
Predicate for if a
Calc does not contain windowed aggregates. |
static boolean |
notContainsWindowedAgg(Filter filter)
Predicate for if a
Filter does not windowed aggregates. |
static boolean |
notContainsWindowedAgg(Project project)
Predicate for if a
Project does not contain windowed aggregates. |
static SqlOperator |
op(SqlKind kind,
SqlOperator operator)
|
static Mappings.TargetMapping |
permutation(List<RexNode> nodes,
RelDataType inputRowType)
Returns a permutation describing where output fields come from.
|
static Mappings.TargetMapping |
permutationIgnoreCast(List<RexNode> nodes,
RelDataType inputRowType)
Returns a permutation describing where output fields come from.
|
static Mappings.TargetMapping |
permutationPushDownProject(List<RexNode> nodes,
RelDataType inputRowType,
int sourceOffset,
int targetOffset)
Returns a permutation describing where the Project's fields come from
after the Project is pushed down.
|
static RelDataType |
permute(RelDataTypeFactory typeFactory,
RelDataType rowType,
Mapping mapping)
Permutes a record type according to a mapping.
|
static RelNode |
permute(RelNode rel,
Permutation permutation,
@Nullable List<String> fieldNames)
Creates a relational expression which permutes the output fields of a
relational expression according to a permutation.
|
static void |
projectJoinInputs(RelNode[] inputRels,
List<RexNode> leftJoinKeys,
List<RexNode> rightJoinKeys,
int systemColCount,
List<Integer> leftKeys,
List<Integer> rightKeys,
List<Integer> outputProj)
Deprecated.
|
static RelNode |
projectMapping(RelNode rel,
Mapping mapping,
@Nullable List<String> fieldNames,
RelFactories.ProjectFactory projectFactory)
Deprecated.
|
static MultiJoin |
projectMultiJoin(MultiJoin multiJoin,
Project project)
|
static RelNode |
propagateRelHints(RelNode rel,
boolean reset)
Propagates the relational expression hints from root node to leaf node.
|
static RelNode |
propagateRelHints(RelNode originalRel,
RelNode equiv)
|
static RelNode |
pushDownJoinConditions(Join originalJoin)
Deprecated.
|
static RelNode |
pushDownJoinConditions(Join originalJoin,
RelBuilder relBuilder)
Pushes down expressions in "equal" join condition.
|
static RelNode |
pushDownJoinConditions(Join originalJoin,
RelFactories.ProjectFactory projectFactory)
Deprecated.
|
static RexNode |
pushFilterPastProject(RexNode filter,
Project projRel)
Deprecated.
|
static RexNode |
pushPastCalc(RexNode node,
Calc calc)
Converts an expression that is based on the output fields of a
Calc to an equivalent expression on the Calc's input fields. |
static List<RexNode> |
pushPastProject(List<? extends RexNode> nodes,
Project project)
Converts a list of expressions that are based on the output fields of a
Project to equivalent expressions on the Project's
input fields. |
static RexNode |
pushPastProject(RexNode node,
Project project)
Converts an expression that is based on the output fields of a
Project to an equivalent expression on the Project's
input fields. |
static @Nullable List<RexNode> |
pushPastProjectUnlessBloat(List<? extends RexNode> nodes,
Project project,
int bloat)
As
pushPastProject(org.apache.calcite.rex.RexNode, org.apache.calcite.rel.core.Project), but returns null if the resulting expressions
are significantly more complex. |
static void |
registerAbstractRelationalRules(RelOptPlanner planner) |
static void |
registerAbstractRels(RelOptPlanner planner)
Deprecated.
|
static void |
registerAbstractRules(RelOptPlanner planner) |
static void |
registerDefaultRules(RelOptPlanner planner,
boolean enableMaterializations,
boolean enableBindable) |
static RelNode |
renameIfNecessary(RelNode rel,
RelDataType desiredRowType)
Deprecated.
|
static RelNode |
replace(RelNode query,
RelNode find,
RelNode replace)
Within a relational expression
query, replaces occurrences of
find with replace. |
static RelNode |
replaceInput(RelNode parent,
int ordinal,
RelNode newInput)
Returns a shallow copy of a relational expression with a particular
input replaced.
|
static JoinRelType |
simplifyJoin(RelNode joinRel,
com.google.common.collect.ImmutableList<RexNode> aboveFilters,
JoinRelType joinType)
Simplifies outer joins if filter above would reject nulls.
|
static @Nullable RexNode |
splitCorrelatedFilterCondition(Filter filter,
List<RexNode> joinKeys,
List<RexNode> correlatedJoinKeys,
boolean extractCorrelatedFieldAccess) |
static @Nullable RexNode |
splitCorrelatedFilterCondition(LogicalFilter filter,
List<RexInputRef> joinKeys,
List<RexNode> correlatedJoinKeys)
Deprecated.
|
static @Nullable RexNode |
splitCorrelatedFilterCondition(LogicalFilter filter,
List<RexNode> joinKeys,
List<RexNode> correlatedJoinKeys,
boolean extractCorrelatedFieldAccess) |
static void |
splitFilters(ImmutableBitSet childBitmap,
@Nullable RexNode predicate,
List<RexNode> pushable,
List<RexNode> notPushable)
Splits a filter into two lists, depending on whether or not the filter
only references its child input.
|
static RexNode |
splitJoinCondition(List<RelDataTypeField> sysFieldList,
List<RelNode> inputs,
RexNode condition,
List<List<RexNode>> joinKeys,
@Nullable List<Integer> filterNulls,
@Nullable List<SqlOperator> rangeOp)
Splits out the equi-join (and optionally, a single non-equi) components
of a join condition, and returns what's left.
|
static RexNode |
splitJoinCondition(List<RelDataTypeField> sysFieldList,
RelNode leftRel,
RelNode rightRel,
RexNode condition,
List<RexNode> leftJoinKeys,
List<RexNode> rightJoinKeys,
@Nullable List<Integer> filterNulls,
@Nullable List<SqlOperator> rangeOp)
Splits out the equi-join (and optionally, a single non-equi) components
of a join condition, and returns what's left.
|
static RexNode |
splitJoinCondition(RelNode left,
RelNode right,
RexNode condition,
List<Integer> leftKeys,
List<Integer> rightKeys,
@Nullable List<Boolean> filterNulls)
Splits out the equi-join components of a join condition, and returns
what's left.
|
static void |
splitJoinCondition(RelNode left,
RelNode right,
RexNode condition,
List<Integer> leftKeys,
List<Integer> rightKeys,
@Nullable List<Boolean> filterNulls,
List<RexNode> nonEquiList)
As
splitJoinCondition(RelNode, RelNode, RexNode, List, List, List),
but writes non-equi conditions to a conjunctive list. |
static String |
toString(RelNode rel)
Converts a relational expression to a string, showing just basic
attributes.
|
static @PolyNull String |
toString(@PolyNull RelNode rel,
SqlExplainLevel detailLevel)
Converts a relational expression to a string;
returns null if and only if
rel is null. |
static void |
validateValueAgainstConstraint(SqlNode sourceValue,
RexNode targetConstraint,
Supplier<CalciteContextException> errorSupplier)
Ensures that a source value does not violate the constraint of the target
column.
|
static void |
verifyTypeEquivalence(RelNode originalRel,
RelNode newRel,
Object equivalenceClass)
Verifies that a row type being added to an equivalence class matches the
existing type, raising an assertion if this is not the case.
|
public static final double EPSILON
@Deprecated public static final com.google.common.base.Predicate<Filter> FILTER_PREDICATE
@Deprecated public static final com.google.common.base.Predicate<Project> PROJECT_PREDICATE
@Deprecated public static final com.google.common.base.Predicate<Calc> CALC_PREDICATE
public static boolean isPureLimit(RelNode rel)
public static boolean isPureOrder(RelNode rel)
public static boolean isLimit(RelNode rel)
public static boolean isOrder(RelNode rel)
public static Set<RelOptTable> findTables(RelNode rel)
public static List<RelOptTable> findAllTables(RelNode rel)
public static List<String> findAllTableQualifiedNames(RelNode rel)
public static Set<CorrelationId> getVariablesSet(RelNode rel)
@Deprecated public static List<CorrelationId> getVariablesSetAndUsed(RelNode rel0, RelNode rel1)
public static Set<CorrelationId> getVariablesUsed(RelNode rel)
The set may contain "duplicates" (variables with different ids that, when resolved, will reference the same source relational expression).
The item type is the same as
RexCorrelVariable.id.
public static ImmutableBitSet correlationColumns(CorrelationId id, RelNode rel)
public static boolean notContainsCorrelation(RelNode r, CorrelationId correlationId, Litmus litmus)
Litmus.succeed() if a given relational
expression does not contain a given correlation.public static void go(RelVisitor visitor, RelNode p)
RelVisitor going on a given relational expression, and
returns the result.public static List<RelDataType> getFieldTypeList(RelDataType type)
type - Struct typeRelDataType.getFieldNames()public static boolean areRowTypesEqual(RelDataType rowType1, RelDataType rowType2, boolean compareNames)
public static void verifyTypeEquivalence(RelNode originalRel, RelNode newRel, Object equivalenceClass)
originalRel - canonical rel for equivalence classnewRel - rel being added to equivalence classequivalenceClass - object representing equivalence classpublic static RelNode propagateRelHints(RelNode originalRel, RelNode equiv)
RelHints from originalRel
to newRel if both of them are Hintable.
The two relational expressions are assumed as semantically equivalent, that means the hints should be attached to the relational expression that expects to have them.
Try to propagate the hints to the first relational expression that matches, this is needed because many planner rules would generate a sub-tree whose root rel type is different with the original matched rel.
For the worst case, there is no relational expression that can apply these hints, and the whole sub-tree would be visited. We add a protection here: if the visiting depth is over than 3, just returns, because there are rare cases the new created sub-tree has layers bigger than that.
This is a best effort, we do not know exactly how the nodes are transformed in all kinds of planner rules, so for some complex relational expressions, the hints would very probably lost.
This function is experimental and would change without any notes.
originalRel - Original relational expressionequiv - New equivalent relational expressionnewRel with attached qualified hints from originalRel,
or newRel directly if one of them are not Hintablepublic static RelNode propagateRelHints(RelNode rel, boolean reset)
rel - The relational expressionreset - Flag saying if to reset the existing hints before the propagationpublic static RelNode copyRelHints(RelNode originalRel, RelNode newRel)
RelHints from originalRel
to newRel if both of them are Hintable.
The hints would be attached directly(e.g. without any filtering).
originalRel - Original relational expressionnewRel - New relational expressionnewRel with attached hints from originalRel,
or newRel directly if one of them are not Hintablepublic static RelNode copyRelHints(RelNode originalRel, RelNode newRel, boolean filterHints)
RelHints from originalRel
to newRel if both of them are Hintable.
The hints would be filtered by the specified hint strategies
if filterHints is true.
originalRel - Original relational expressionnewRel - New relational expressionfilterHints - Flag saying if to filter out unqualified hints for newRelnewRel with attached hints from originalRel,
or newRel directly if one of them are not Hintablepublic static Mappings.TargetMapping permutationIgnoreCast(List<RexNode> nodes, RelDataType inputRowType)
map.getTargetOpt(i) is n if
field i projects input field n or applies a cast on
n, -1 if it is another expression.public static Mappings.TargetMapping permutation(List<RexNode> nodes, RelDataType inputRowType)
map.getTargetOpt(i) is n if
field i projects input field n, -1 if it is an
expression.public static Mappings.TargetMapping permutationPushDownProject(List<RexNode> nodes, RelDataType inputRowType, int sourceOffset, int targetOffset)
@Deprecated public static RelNode createExistsPlan(RelOptCluster cluster, RelNode seekRel, @Nullable List<RexNode> conditions, @Nullable RexLiteral extraExpr, @Nullable String extraName)
@Deprecated public static RelOptUtil.Exists createExistsPlan(RelNode seekRel, RelOptUtil.SubQueryType subQueryType, RelOptUtil.Logic logic, boolean notIn)
public static RelOptUtil.Exists createExistsPlan(RelNode seekRel, RelOptUtil.SubQueryType subQueryType, RelOptUtil.Logic logic, boolean notIn, RelBuilder relBuilder)
EXISTS or IN
statements.seekRel - A query rel, for example the resulting rel from 'select *
from emp' or 'values (1,2,3)' or '('Foo', 34)'.subQueryType - Sub-query typelogic - Whether to use 2- or 3-valued boolean logicnotIn - Whether the operator is NOT INrelBuilder - Builder for relational expressionsSqlToRelConverter#convertExists@Deprecated public static RelNode createRenameRel(RelDataType outputType, RelNode rel)
@Deprecated public static RelNode createFilter(RelNode child, RexNode condition)
@Deprecated public static RelNode createFilter(RelNode child, RexNode condition, RelFactories.FilterFactory filterFactory)
public static RelNode createFilter(RelNode child, Iterable<? extends RexNode> conditions)
public static RelNode createFilter(RelNode child, Iterable<? extends RexNode> conditions, RelFactories.FilterFactory filterFactory)
@Deprecated public static RelNode createNullFilter(RelNode rel, Integer[] fieldOrdinals)
public static RelNode createCastRel(RelNode rel, RelDataType castRowType, boolean rename)
No need to create new projection if rel is already a project,
instead, create a projection with the input of rel and the new
cast expressions.
The desired row type and the row type to be converted must have the same number of fields.
rel - producer of rows to be convertedcastRowType - row type after castrename - if true, use field names from castRowType; if false,
preserve field names from relpublic static RelNode createCastRel(RelNode rel, RelDataType castRowType, boolean rename, RelFactories.ProjectFactory projectFactory)
No need to create new projection if rel is already a project,
instead, create a projection with the input of rel and the new
cast expressions.
The desired row type and the row type to be converted must have the same number of fields.
rel - producer of rows to be convertedcastRowType - row type after castrename - if true, use field names from castRowType; if false,
preserve field names from relprojectFactory - Project Factorypublic static Set<Integer> getAllFields(Aggregate aggregate)
public static Set<Integer> getAllFields2(ImmutableBitSet groupSet, List<AggregateCall> aggCallList)
public static RelNode createSingleValueAggRel(RelOptCluster cluster, RelNode rel)
rel - underlying rel@Deprecated public static RelNode createDistinctRel(RelNode rel)
RelBuilder.distinct().@Deprecated public static boolean analyzeSimpleEquiJoin(LogicalJoin join, int[] joinFieldOrdinals)
public static RexNode splitJoinCondition(RelNode left, RelNode right, RexNode condition, List<Integer> leftKeys, List<Integer> rightKeys, @Nullable List<Boolean> filterNulls)
L.A = R.X AND L.B = L.C AND (L.D = 5 OR L.E =
R.Y)
returns
left - left input to joinright - right input to joincondition - join conditionleftKeys - The ordinals of the fields from the left input which are
equi-join keysrightKeys - The ordinals of the fields from the right input which
are equi-join keysfilterNulls - List of boolean values for each join key position
indicating whether the operator filters out nulls or not.
Value is true if the operator is EQUALS and false if the
operator is IS NOT DISTINCT FROM (or an expanded version).
If filterNulls is null, only join conditions
with EQUALS operators are considered equi-join components.
Rest (including IS NOT DISTINCT FROM) are returned in
remaining join condition.RexLiteral true, but never nullpublic static void splitJoinCondition(RelNode left, RelNode right, RexNode condition, List<Integer> leftKeys, List<Integer> rightKeys, @Nullable List<Boolean> filterNulls, List<RexNode> nonEquiList)
splitJoinCondition(RelNode, RelNode, RexNode, List, List, List),
but writes non-equi conditions to a conjunctive list.@Deprecated public static boolean isEqui(RelNode left, RelNode right, RexNode condition)
public static RexNode splitJoinCondition(List<RelDataTypeField> sysFieldList, RelNode leftRel, RelNode rightRel, RexNode condition, List<RexNode> leftJoinKeys, List<RexNode> rightJoinKeys, @Nullable List<Integer> filterNulls, @Nullable List<SqlOperator> rangeOp)
sysFieldList - list of system fieldsleftRel - left join inputrightRel - right join inputcondition - join conditionleftJoinKeys - The join keys from the left input which are equi-join
keysrightJoinKeys - The join keys from the right input which are
equi-join keysfilterNulls - The join key positions for which null values will not
match. null values only match for the "is not distinct
from" condition.rangeOp - if null, only locate equi-joins; otherwise, locate a
single non-equi join predicate and return its operator
in this list; join keys associated with the non-equi
join predicate are at the end of the key lists
returnedpublic static RexNode splitJoinCondition(List<RelDataTypeField> sysFieldList, List<RelNode> inputs, RexNode condition, List<List<RexNode>> joinKeys, @Nullable List<Integer> filterNulls, @Nullable List<SqlOperator> rangeOp)
sysFieldList - list of system fieldsinputs - join inputscondition - join conditionjoinKeys - The join keys from the inputs which are equi-join
keysfilterNulls - The join key positions for which null values will not
match. null values only match for the "is not distinct
from" condition.rangeOp - if null, only locate equi-joins; otherwise, locate a
single non-equi join predicate and return its operator
in this list; join keys associated with the non-equi
join predicate are at the end of the key lists
returned@Deprecated public static @Nullable RexNode splitCorrelatedFilterCondition(LogicalFilter filter, List<RexInputRef> joinKeys, List<RexNode> correlatedJoinKeys)
public static @Nullable RexNode splitCorrelatedFilterCondition(LogicalFilter filter, List<RexNode> joinKeys, List<RexNode> correlatedJoinKeys, boolean extractCorrelatedFieldAccess)
public static @Nullable RexNode splitCorrelatedFilterCondition(Filter filter, List<RexNode> joinKeys, List<RexNode> correlatedJoinKeys, boolean extractCorrelatedFieldAccess)
public static RexNode createEquiJoinCondition(RelNode left, List<Integer> leftKeys, RelNode right, List<Integer> rightKeys, RexBuilder rexBuilder)
public static SqlOperator op(SqlKind kind, SqlOperator operator)
kind - input kindoperator - default operator valueRexUtil.op(SqlKind)public static RexCall collapseExpandedIsNotDistinctFromExpr(RexCall call, RexBuilder rexBuilder)
IS NOT DISTINCT FROM expression.
Helper method for
splitJoinCondition(RexBuilder, int, RexNode, List, List, List, List)
and
splitJoinCondition(List, List, RexNode, List, List, List, List).
If the given expr call is an expanded version of
IS NOT DISTINCT FROM function call, collapses it and return a
IS NOT DISTINCT FROM function call.
For example: t1.key IS NOT DISTINCT FROM t2.key
can rewritten in expanded form as
t1.key = t2.key OR (t1.key IS NULL AND t2.key IS NULL).
call - Function expression to try collapsingrexBuilder - RexBuilder instance to create new RexCall instances.@Deprecated public static void projectJoinInputs(RelNode[] inputRels, List<RexNode> leftJoinKeys, List<RexNode> rightJoinKeys, int systemColCount, List<Integer> leftKeys, List<Integer> rightKeys, List<Integer> outputProj)
@Deprecated public static RelNode createProjectJoinRel(List<Integer> outputProj, RelNode joinRel)
@Deprecated public static void registerAbstractRels(RelOptPlanner planner)
public static void registerAbstractRules(RelOptPlanner planner)
public static void registerAbstractRelationalRules(RelOptPlanner planner)
public static void registerDefaultRules(RelOptPlanner planner, boolean enableMaterializations, boolean enableBindable)
public static String dumpPlan(String header, RelNode rel, SqlExplainFormat format, SqlExplainLevel detailLevel)
header - Header to print before the plan. Ignored if the format
is XMLrel - Relational expression to explainformat - Output formatdetailLevel - Detail level@Deprecated public static String dumpPlan(String header, RelNode rel, boolean asXml, SqlExplainLevel detailLevel)
public static RelDataType createDmlRowType(SqlKind kind, RelDataTypeFactory typeFactory)
kind - Kind of nodetypeFactory - factory to use for creating type descriptorpublic static boolean eq(String desc1, RelDataType type1, String desc2, RelDataType type2, Litmus litmus)
desc1 - Description of first typetype1 - First typedesc2 - Description of second typetype2 - Second typelitmus - What to do if an error is detected (types are not equal)public static boolean equal(String desc1, RelDataType type1, String desc2, RelDataType type2, Litmus litmus)
areRowTypesEqual(RelDataType, RelDataType, boolean). Both types
must not be null.desc1 - Description of role of first typetype1 - First typedesc2 - Description of role of second typetype2 - Second typelitmus - Whether to assert if they are not equalpublic static String getFullTypeDifferenceString(String sourceDesc, RelDataType sourceType, String targetDesc, RelDataType targetType)
sourceDesc - description of role of source typesourceType - source typetargetDesc - description of role of target typetargetType - target typepublic static boolean equalType(String desc0, RelNode rel0, String desc1, RelNode rel1, Litmus litmus)
public static RexNode isDistinctFrom(RexBuilder rexBuilder, RexNode x, RexNode y, boolean neg)
IS DISTINCT FROM (or IS
NOT DISTINCT FROM) sql operator.neg - if false, returns a translation of IS NOT DISTINCT FROMpublic static String toString(RelNode rel)
public static @PolyNull String toString(@PolyNull RelNode rel, SqlExplainLevel detailLevel)
rel is null.@Deprecated public static RelNode renameIfNecessary(RelNode rel, RelDataType desiredRowType)
public static String dumpType(RelDataType type)
public static List<RelDataTypeField> deduplicateColumns(List<RelDataTypeField> baseColumns, List<RelDataTypeField> extendedColumns)
public static void decomposeConjunction(@Nullable RexNode rexPredicate, List<RexNode> rexList)
rexPredicate - predicate to be analyzedrexList - list of decomposed RexNodespublic static void decomposeConjunction(@Nullable RexNode rexPredicate, List<RexNode> rexList, List<RexNode> notList)
For example, a AND NOT b AND NOT (c and d) AND TRUE AND NOT
FALSE returns rexList = [a], notList = [b, c AND d].
TRUE and NOT FALSE expressions are ignored. FALSE and NOT TRUE
expressions are placed on rexList and notList as other
expressions.
For example, a AND TRUE AND NOT TRUE returns
rexList = [a], notList = [TRUE].
rexPredicate - predicate to be analyzedrexList - list of decomposed RexNodes (except those with NOT)notList - list of decomposed RexNodes that were prefixed NOTpublic static void decomposeDisjunction(@Nullable RexNode rexPredicate, List<RexNode> rexList)
rexPredicate - predicate to be analyzedrexList - list of decomposed RexNodespublic static List<RexNode> conjunctions(@Nullable RexNode rexPredicate)
For example, conjunctions(TRUE) returns the empty list;
conjunctions(FALSE) returns list {FALSE}.
public static List<RexNode> disjunctions(RexNode rexPredicate)
For example, disjunctions(FALSE) returns the empty list.
public static RexNode andJoinFilters(RexBuilder rexBuilder, @Nullable RexNode left, @Nullable RexNode right)
rexBuilder - rexBuilder to create AND expressionleft - filter on the left that the right will be AND'd toright - filter on the rightRexUtil.composeConjunction(org.apache.calcite.rex.RexBuilder, java.lang.Iterable<? extends org.apache.calcite.rex.RexNode>)public static void inferViewPredicates(Map<Integer,RexNode> projectMap, List<RexNode> filters, RexNode constraint)
This method is key to the validation of a modifiable view. Columns that are constrained to a single value can be omitted from the SELECT clause of a modifiable view.
projectMap - Mapping from column ordinal to the expression that
populate that column, to be populated by this methodfilters - List of remaining filters, to be populated by this methodconstraint - Constraint to be analyzedpublic static Map<Integer,RexNode> getColumnConstraints(ModifiableView modifiableViewTable, RelDataType targetRowType, RelDataTypeFactory typeFactory)
modifiableViewTable - The modifiable view which has a constrainttargetRowType - The target typepublic static void validateValueAgainstConstraint(SqlNode sourceValue, RexNode targetConstraint, Supplier<CalciteContextException> errorSupplier)
sourceValue - The insert value being validatedtargetConstraint - The constraint applied to sourceValue for validationerrorSupplier - The function to apply when validation failspublic static List<Integer> adjustKeys(List<Integer> keys, int adjustment)
keys - list of key valuesadjustment - the amount to adjust the key values bypublic static JoinRelType simplifyJoin(RelNode joinRel, com.google.common.collect.ImmutableList<RexNode> aboveFilters, JoinRelType joinType)
joinRel - JoinaboveFilters - Filters from abovejoinType - Join type, can not be inner joinpublic static boolean classifyFilters(RelNode joinRel, List<RexNode> filters, boolean pushInto, boolean pushLeft, boolean pushRight, List<RexNode> joinFilters, List<RexNode> leftFilters, List<RexNode> rightFilters)
joinRel - join nodefilters - filters to be classifiedpushInto - whether filters can be pushed into the joinpushLeft - true if filters can be pushed to the leftpushRight - true if filters can be pushed to the rightjoinFilters - list of filters to push to the joinleftFilters - list of filters to push to the left childrightFilters - list of filters to push to the right child@Deprecated public static boolean classifyFilters(RelNode joinRel, List<RexNode> filters, JoinRelType joinType, boolean pushInto, boolean pushLeft, boolean pushRight, List<RexNode> joinFilters, List<RexNode> leftFilters, List<RexNode> rightFilters)
joinRel - join nodefilters - filters to be classifiedjoinType - join typepushInto - whether filters can be pushed into the ON clausepushLeft - true if filters can be pushed to the leftpushRight - true if filters can be pushed to the rightjoinFilters - list of filters to push to the joinleftFilters - list of filters to push to the left childrightFilters - list of filters to push to the right childpublic static void splitFilters(ImmutableBitSet childBitmap, @Nullable RexNode predicate, List<RexNode> pushable, List<RexNode> notPushable)
childBitmap - Fields in the childpredicate - filters that will be splitpushable - returns the list of filters that can be pushed to the
child inputnotPushable - returns the list of filters that cannot be pushed to
the child input@Deprecated public static boolean checkProjAndChildInputs(Project project, boolean checkNames)
public static List<RexNode> createSwappedJoinExprs(RelNode newJoin, Join origJoin, boolean origOrder)
newJoin - the RelNode corresponding to the join with its inputs
swappedorigJoin - original LogicalJoinorigOrder - if true, create the projection expressions to reflect
the original (pre-swapped) join projection; otherwise,
create the projection to reflect the order of the swapped
projection@Deprecated public static RexNode pushFilterPastProject(RexNode filter, Project projRel)
public static RexNode pushPastProject(RexNode node, Project project)
Project to an equivalent expression on the Project's
input fields.node - The expression to be convertedproject - Project underneath the expressionpublic static List<RexNode> pushPastProject(List<? extends RexNode> nodes, Project project)
Project to equivalent expressions on the Project's
input fields.nodes - The expressions to be convertedproject - Project underneath the expressionpublic static @Nullable List<RexNode> pushPastProjectUnlessBloat(List<? extends RexNode> nodes, Project project, int bloat)
pushPastProject(org.apache.calcite.rex.RexNode, org.apache.calcite.rel.core.Project), but returns null if the resulting expressions
are significantly more complex.bloat - Maximum allowable increase in complexitypublic static RexNode pushPastCalc(RexNode node, Calc calc)
Calc to an equivalent expression on the Calc's input fields.node - The expression to be convertedcalc - Calc underneath the expressionpublic static MultiJoin projectMultiJoin(MultiJoin multiJoin, Project project)
MultiJoin to reflect
projection references from a
Project that is on top of the
MultiJoin.multiJoin - the original MultiJoinproject - the Project on top of the MultiJoinpublic static RelNode replaceInput(RelNode parent, int ordinal, RelNode newInput)
public static RelNode createProject(RelNode child, Mappings.TargetMapping mapping)
LogicalProject that
projects particular fields of its input, according to a mapping.public static RelNode createProject(RelNode child, Mappings.TargetMapping mapping, RelFactories.ProjectFactory projectFactory)
public static boolean contains(RelNode ancestor, RelNode target)
target occurs within a
relational expression ancestor.public static RelNode replace(RelNode query, RelNode find, RelNode replace)
query, replaces occurrences of
find with replace.@Deprecated public static RelOptTable.ToRelContext getContext(RelOptCluster cluster)
public static int countJoins(RelNode rootRel)
Join nodes in a
tree.public static RelDataType permute(RelDataTypeFactory typeFactory, RelDataType rowType, Mapping mapping)
@Deprecated public static RelNode createProject(RelNode child, List<? extends RexNode> exprList, List<String> fieldNameList)
@Deprecated public static RelNode createProject(RelNode child, List<Pair<RexNode,? extends String>> projectList, boolean optimize)
public static RelNode createProject(RelNode child, List<Integer> posList)
Optimizes if the fields are the identity projection.
child - Input relational expressionposList - Source of each projected field@Deprecated public static RelNode createProject(RelNode child, List<? extends RexNode> exprs, List<? extends String> fieldNames, boolean optimize)
@Deprecated public static RelNode createProject(RelNode child, List<? extends RexNode> exprs, List<? extends String> fieldNames, boolean optimize, RelBuilder relBuilder)
RelBuilder.projectNamed(Iterable, Iterable, boolean)@Deprecated public static RelNode createRename(RelNode rel, List<? extends String> fieldNames)
public static RelNode permute(RelNode rel, Permutation permutation, @Nullable List<String> fieldNames)
Optimizations:
LogicalCalc or
LogicalProject that is already
acting as a permutation, combines the new permutation with the old;If a permutation is combined with its inverse, these optimizations would combine to remove them both.
rel - Relational expressionpermutation - Permutation to apply to fieldsfieldNames - Field names; if null, or if a particular entry is null,
the name of the permuted field is usedpublic static RelNode createProject(RelFactories.ProjectFactory factory, RelNode child, List<Integer> posList)
Optimizes if the fields are the identity projection.
factory - ProjectFactorychild - Input relational expressionposList - Source of each projected field@Deprecated public static RelNode projectMapping(RelNode rel, Mapping mapping, @Nullable List<String> fieldNames, RelFactories.ProjectFactory projectFactory)
public static boolean notContainsWindowedAgg(Calc calc)
Calc does not contain windowed aggregates.public static boolean notContainsWindowedAgg(Filter filter)
Filter does not windowed aggregates.public static boolean notContainsWindowedAgg(Project project)
Project does not contain windowed aggregates.public static RelNode pushDownJoinConditions(Join originalJoin, RelBuilder relBuilder)
For example, given "emp JOIN dept ON emp.deptno + 1 = dept.deptno", adds a project above "emp" that computes the expression "emp.deptno + 1". The resulting join condition is a simple combination of AND, equals, and input fields, plus the remaining non-equal conditions.
originalJoin - Join whose condition is to be pushed downrelBuilder - Factory to create project operator@Deprecated public static RelNode pushDownJoinConditions(Join originalJoin)
@Deprecated public static RelNode pushDownJoinConditions(Join originalJoin, RelFactories.ProjectFactory projectFactory)
Copyright © 2012-2022 Apache Software Foundation. All Rights Reserved.