Class RelMdUtil
-
Field Summary
Fields -
Method Summary
Modifier and TypeMethodDescriptionstatic doubleaddEpsilon(double d) Add an epsilon to the value passed in.static booleanareColumnsDefinitelyUnique(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) static booleanareColumnsDefinitelyUnique(RelMetadataQuery mq, RelNode rel, ImmutableBitSet colMask) Returns true if the columns represented in a bit mask are definitely known to form a unique column set.static booleanareColumnsDefinitelyUniqueWhenNullsFiltered(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) static booleanareColumnsDefinitelyUniqueWhenNullsFiltered(RelMetadataQuery mq, RelNode rel, ImmutableBitSet colMask) Returns true if the columns represented in a bit mask are definitely known to form a unique column set, when nulls have been filtered from the columns.static @Nullable BooleanareColumnsUnique(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) static @Nullable BooleanareColumnsUniqueWhenNullsFiltered(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) static doubleCaps a double value at Double.MAX_VALUE if it's currently infinitystatic @Nullable DoublecardOfProjExpr(RelMetadataQuery mq, Project rel, RexNode expr) Computes the cardinality of a particular expression from the projection list.static booleancheckInputForCollationAndLimit(RelMetadataQuery mq, RelNode input, RelCollation collation, @Nullable RexNode offset, @Nullable RexNode fetch) Returns whether a relational expression is already sorted and has fewer rows than the sum of offset and limit.static booleanclearCache(RelNode rel) Removes cached metadata values for specified RelNode.static doublecomputeSemiJoinSelectivity(RelMetadataQuery mq, RelNode factRel, RelNode dimRel, List<Integer> factKeyList, List<Integer> dimKeyList) Computes the selectivity of a semijoin filter if it is applied on a fact table.static doublecomputeSemiJoinSelectivity(RelMetadataQuery mq, RelNode factRel, RelNode dimRel, Join rel) Computes the selectivity of a semijoin filter if it is applied on a fact table.static doubleestimateFilteredRows(RelNode child, @Nullable RexNode condition, RelMetadataQuery mq) static doubleestimateFilteredRows(RelNode child, RexProgram program, RelMetadataQuery mq) static @Nullable DoublegetJoinDistinctRowCount(RelMetadataQuery mq, RelNode joinRel, JoinRelType joinType, ImmutableBitSet groupKey, @Nullable RexNode predicate, boolean useMaxNdv) Computes the number of distinct rows for a set of keys returned from a join.static @Nullable DoublegetJoinPopulationSize(RelMetadataQuery mq, RelNode join_, ImmutableBitSet groupKey) Computes the population size for a set of keys returned from a join.static @Nullable DoublegetJoinRowCount(RelMetadataQuery mq, Join join, RexNode condition) Returns an estimate of the number of rows returned by aJoin.static doublegetMinusRowCount(RelMetadataQuery mq, Minus minus) Returns an estimate of the number of rows returned by aMinus.static doublegetSelectivityValue(RexNode artificialSelectivityFuncNode) Returns the selectivity value stored in a call.static @Nullable DoublegetSemiJoinDistinctRowCount(Join semiJoinRel, RelMetadataQuery mq, ImmutableBitSet groupKey, @Nullable RexNode predicate) Computes the number of distinct rows for a set of keys returned from a semi-join.static doublegetUnionAllRowCount(RelMetadataQuery mq, Union rel) Returns an estimate of the number of rows returned by aUnion(before duplicates are eliminated).static doubleguessSelectivity(@Nullable RexNode predicate) Returns default estimates for selectivities, in the absence of stats.static doubleguessSelectivity(@Nullable RexNode predicate, boolean artificialOnly) Returns default estimates for selectivities, in the absence of stats.static booleanisRelDefinitelyEmpty(RelMetadataQuery mq, RelNode rel) static booleanstatic doublelinear(int x, int minX, int maxX, double minY, double maxY) Returns a point on a line.static RexNodeCreates a RexNode that stores a selectivity value corresponding to the selectivity of a semijoin.static @Nullable RexNodeminusPreds(RexBuilder rexBuilder, @Nullable RexNode pred1, @Nullable RexNode pred2) Takes the difference between two predicates, removing from the first any predicates also in the second.static @PolyNull DoublenumDistinctVals(@PolyNull Double domainSize, @PolyNull Double numSelected) Returns the number of distinct values provided numSelected are selected where there are domainSize distinct values.static voidsetAggChildKeys(ImmutableBitSet groupKey, Aggregate aggRel, ImmutableBitSet.Builder childKey) Takes a bitmap representing a set of input references and extracts the ones that reference the group by columns in an aggregate.static voidsetLeftRightBitmaps(ImmutableBitSet groupKey, ImmutableBitSet.Builder leftMask, ImmutableBitSet.Builder rightMask, int nFieldsOnLeft) Separates a bit-mask representing a join into masks representing the left and right inputs into the join.static voidsplitCols(List<RexNode> projExprs, ImmutableBitSet groupKey, ImmutableBitSet.Builder baseCols, ImmutableBitSet.Builder projCols) Forms two bitmaps by splitting the columns in a bitmap according to whether or not the column references the child input or is an expression.static @Nullable RexNodeunionPreds(RexBuilder rexBuilder, @Nullable RexNode pred1, @Nullable RexNode pred2) AND's two predicates together, either of which may be null, removing redundant filters.static @PolyNull DoublevalidatePercentage(@PolyNull Double result) Validates whether a value represents a percentage number (that is, a value in the interval [0.0, 1.0]) and returns the value.static @PolyNull DoublevalidateResult(@PolyNull Double result) Validates theresultis valid.
-
Field Details
-
ARTIFICIAL_SELECTIVITY_FUNC
-
-
Method Details
-
makeSemiJoinSelectivityRexNode
Creates a RexNode that stores a selectivity value corresponding to the selectivity of a semijoin. This can be added to a filter to simulate the effect of the semijoin during costing, but should never appear in a real plan since it has no physical implementation.- Parameters:
rel- the semijoin of interest- Returns:
- constructed rexnode
-
getSelectivityValue
Returns the selectivity value stored in a call.- Parameters:
artificialSelectivityFuncNode- Call containing the selectivity value- Returns:
- selectivity value
-
computeSemiJoinSelectivity
public static double computeSemiJoinSelectivity(RelMetadataQuery mq, RelNode factRel, RelNode dimRel, Join rel) Computes the selectivity of a semijoin filter if it is applied on a fact table. The computation is based on the selectivity of the dimension table/columns and the number of distinct values in the fact table columns.- Parameters:
factRel- fact table participating in the semijoindimRel- dimension table participating in the semijoinrel- semijoin rel- Returns:
- calculated selectivity
-
computeSemiJoinSelectivity
public static double computeSemiJoinSelectivity(RelMetadataQuery mq, RelNode factRel, RelNode dimRel, List<Integer> factKeyList, List<Integer> dimKeyList) Computes the selectivity of a semijoin filter if it is applied on a fact table. The computation is based on the selectivity of the dimension table/columns and the number of distinct values in the fact table columns.- Parameters:
factRel- fact table participating in the semijoindimRel- dimension table participating in the semijoinfactKeyList- LHS keys used in the filterdimKeyList- RHS keys used in the filter- Returns:
- calculated selectivity
-
areColumnsDefinitelyUnique
public static boolean areColumnsDefinitelyUnique(RelMetadataQuery mq, RelNode rel, ImmutableBitSet colMask) Returns true if the columns represented in a bit mask are definitely known to form a unique column set.- Parameters:
rel- the relational expression that the column mask corresponds tocolMask- bit mask containing columns that will be tested for uniqueness- Returns:
- true if bit mask represents a unique column set; false if not (or if no metadata is available)
-
isRelDefinitelyEmpty
-
isRelDefinitelyNotEmpty
-
areColumnsUnique
public static @Nullable Boolean areColumnsUnique(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) -
areColumnsDefinitelyUnique
public static boolean areColumnsDefinitelyUnique(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) -
areColumnsDefinitelyUniqueWhenNullsFiltered
public static boolean areColumnsDefinitelyUniqueWhenNullsFiltered(RelMetadataQuery mq, RelNode rel, ImmutableBitSet colMask) Returns true if the columns represented in a bit mask are definitely known to form a unique column set, when nulls have been filtered from the columns.- Parameters:
rel- the relational expression that the column mask corresponds tocolMask- bit mask containing columns that will be tested for uniqueness- Returns:
- true if bit mask represents a unique column set; false if not (or if no metadata is available)
-
areColumnsUniqueWhenNullsFiltered
public static @Nullable Boolean areColumnsUniqueWhenNullsFiltered(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) -
areColumnsDefinitelyUniqueWhenNullsFiltered
public static boolean areColumnsDefinitelyUniqueWhenNullsFiltered(RelMetadataQuery mq, RelNode rel, List<RexInputRef> columnRefs) -
setLeftRightBitmaps
public static void setLeftRightBitmaps(ImmutableBitSet groupKey, ImmutableBitSet.Builder leftMask, ImmutableBitSet.Builder rightMask, int nFieldsOnLeft) Separates a bit-mask representing a join into masks representing the left and right inputs into the join.- Parameters:
groupKey- original bit-maskleftMask- left bit-mask to be setrightMask- right bit-mask to be setnFieldsOnLeft- number of fields in the left input
-
numDistinctVals
public static @PolyNull Double numDistinctVals(@PolyNull Double domainSize, @PolyNull Double numSelected) Returns the number of distinct values provided numSelected are selected where there are domainSize distinct values.Note that in the case where domainSize == numSelected, it's not true that the return value should be domainSize. If you pick 100 random values between 1 and 100, you'll most likely end up with fewer than 100 distinct values, because you'll pick some values more than once.
The implementation is an unbiased estimation of the number of distinct values by performing a number of selections (with replacement) from a universe set.
- Parameters:
domainSize- Size of the universe setnumSelected- The number of selections- Returns:
- the expected number of distinct values, or null if either argument is null
-
capInfinity
Caps a double value at Double.MAX_VALUE if it's currently infinity- Parameters:
d- the Double object- Returns:
- the double value if it's not infinity; else Double.MAX_VALUE
-
guessSelectivity
Returns default estimates for selectivities, in the absence of stats.- Parameters:
predicate- predicate for which selectivity will be computed; null means true, so gives selectity of 1.0- Returns:
- estimated selectivity
-
guessSelectivity
Returns default estimates for selectivities, in the absence of stats.- Parameters:
predicate- predicate for which selectivity will be computed; null means true, so gives selectity of 1.0artificialOnly- return only the selectivity contribution from artificial nodes- Returns:
- estimated selectivity
-
unionPreds
public static @Nullable RexNode unionPreds(RexBuilder rexBuilder, @Nullable RexNode pred1, @Nullable RexNode pred2) AND's two predicates together, either of which may be null, removing redundant filters.- Parameters:
rexBuilder- rexBuilder used to construct AND'd RexNodepred1- first predicatepred2- second predicate- Returns:
- AND'd predicate or individual predicates if one is null
-
minusPreds
public static @Nullable RexNode minusPreds(RexBuilder rexBuilder, @Nullable RexNode pred1, @Nullable RexNode pred2) Takes the difference between two predicates, removing from the first any predicates also in the second.- Parameters:
rexBuilder- rexBuilder used to construct AND'd RexNodepred1- first predicatepred2- second predicate- Returns:
- MINUS'd predicate list
-
setAggChildKeys
public static void setAggChildKeys(ImmutableBitSet groupKey, Aggregate aggRel, ImmutableBitSet.Builder childKey) Takes a bitmap representing a set of input references and extracts the ones that reference the group by columns in an aggregate.- Parameters:
groupKey- the original bitmapaggRel- the aggregatechildKey- sets bits from groupKey corresponding to group by columns
-
splitCols
public static void splitCols(List<RexNode> projExprs, ImmutableBitSet groupKey, ImmutableBitSet.Builder baseCols, ImmutableBitSet.Builder projCols) Forms two bitmaps by splitting the columns in a bitmap according to whether or not the column references the child input or is an expression.- Parameters:
projExprs- Project expressionsgroupKey- Bitmap whose columns will be splitbaseCols- Bitmap representing columns from the child inputprojCols- Bitmap representing non-child columns
-
cardOfProjExpr
Computes the cardinality of a particular expression from the projection list.- Parameters:
rel- RelNode corresponding to the projectexpr- projection expression- Returns:
- cardinality
-
getJoinPopulationSize
public static @Nullable Double getJoinPopulationSize(RelMetadataQuery mq, RelNode join_, ImmutableBitSet groupKey) Computes the population size for a set of keys returned from a join.- Parameters:
join_- Join relational operatorgroupKey- Keys to compute the population for- Returns:
- computed population size
-
addEpsilon
public static double addEpsilon(double d) Add an epsilon to the value passed in. -
getSemiJoinDistinctRowCount
public static @Nullable Double getSemiJoinDistinctRowCount(Join semiJoinRel, RelMetadataQuery mq, ImmutableBitSet groupKey, @Nullable RexNode predicate) Computes the number of distinct rows for a set of keys returned from a semi-join.- Parameters:
semiJoinRel- RelNode representing the semi-joinmq- metadata querygroupKey- keys that the distinct row count will be computed forpredicate- join predicate- Returns:
- number of distinct rows
-
getJoinDistinctRowCount
public static @Nullable Double getJoinDistinctRowCount(RelMetadataQuery mq, RelNode joinRel, JoinRelType joinType, ImmutableBitSet groupKey, @Nullable RexNode predicate, boolean useMaxNdv) Computes the number of distinct rows for a set of keys returned from a join. Also known as NDV (number of distinct values).- Parameters:
joinRel- RelNode representing the joinjoinType- type of joingroupKey- keys that the distinct row count will be computed forpredicate- join predicateuseMaxNdv- If true use formulamax(left NDV, right NDV), otherwise useleft NDV * right NDV.- Returns:
- number of distinct rows
-
getUnionAllRowCount
Returns an estimate of the number of rows returned by aUnion(before duplicates are eliminated). -
getMinusRowCount
Returns an estimate of the number of rows returned by aMinus. -
getJoinRowCount
Returns an estimate of the number of rows returned by aJoin. -
estimateFilteredRows
-
estimateFilteredRows
public static double estimateFilteredRows(RelNode child, @Nullable RexNode condition, RelMetadataQuery mq) -
linear
public static double linear(int x, int minX, int maxX, double minY, double maxY) Returns a point on a line.The result is always a value between
minYandmaxY, even ifxis not betweenminXandmaxX.Examples:
linear(0, 0, 10, 100, 200} returns 100 because 0 is minXlinear(5, 0, 10, 100, 200} returns 150 because 5 is mid-way between minX and maxXlinear(5, 0, 10, 100, 200} returns 160linear(10, 0, 10, 100, 200} returns 200 because 10 is maxXlinear(-2, 0, 10, 100, 200} returns 100 because -2 is less than minX and is therefore treated as minXlinear(12, 0, 10, 100, 200} returns 100 because 12 is greater than maxX and is therefore treated as maxX
-
checkInputForCollationAndLimit
public static boolean checkInputForCollationAndLimit(RelMetadataQuery mq, RelNode input, RelCollation collation, @Nullable RexNode offset, @Nullable RexNode fetch) Returns whether a relational expression is already sorted and has fewer rows than the sum of offset and limit.If this is the case, it is safe to push down a
Sortwith limit and optional offset. -
validatePercentage
Validates whether a value represents a percentage number (that is, a value in the interval [0.0, 1.0]) and returns the value.Returns null if and only if
resultis null.Throws if
resultis not null, not in range 0 to 1, and assertions are enabled. -
validateResult
Validates theresultis valid.Never let the result go below 1, as it will result in incorrect calculations if the row-count is used as the denominator in a division expression. Also, cap the value at the max double value to avoid calculations using infinity.
Returns null if and only if
resultis null.Throws if
resultis not null, is negative, and assertions are enabled.- Returns:
- the corrected value from the
result - Throws:
AssertionError- if theresultis negative
-
clearCache
Removes cached metadata values for specified RelNode.- Parameters:
rel- RelNode whose cached metadata should be removed- Returns:
- true if cache for the provided RelNode was not empty
-