Package org.apache.calcite.rel.metadata
Class RelMdPredicates
java.lang.Object
org.apache.calcite.rel.metadata.RelMdPredicates
- All Implemented Interfaces:
org.apache.calcite.rel.metadata.MetadataHandler<org.apache.calcite.rel.metadata.BuiltInMetadata.Predicates>
public class RelMdPredicates
extends Object
implements org.apache.calcite.rel.metadata.MetadataHandler<org.apache.calcite.rel.metadata.BuiltInMetadata.Predicates>
Utility to infer Predicates that are applicable above a RelNode.
The class was copied over because of * CALCITE-6317 * and should be removed after upgraded to calcite-1.37.0.
FLINK modifications are at lines
- Port fix of CALCITE-6317 (Calcite 1.37.0): Lines 333~357, 402~404
This is currently used by JoinPushTransitivePredicatesRule to infer Predicates that
can be inferred from one side of a Join to the other.
The PullUp Strategy is sound but not complete. Here are some of the limitations:
- For Aggregations we only PullUp predicates that only contain Grouping Keys. This can be
extended to infer predicates on Aggregation expressions from expressions on the aggregated
columns. For e.g.
select a, max(b) from R1 where b > 7 → max(b) > 7 or max(b) is null
- For Projections we only look at columns that are projected without any function applied.
So:
select a from R1 where a > 7 → "a > 7" is pulled up from the Projection. select a + 1 from R1 where a + 1 > 7 → "a + 1 gt; 7" is not pulled up
- There are several restrictions on Joins:
- We only pullUp inferred predicates for now. Pulling up existing predicates causes an explosion of duplicates. The existing predicates are pushed back down as new predicates. Once we have rules to eliminate duplicate Filter conditions, we should pullUp all predicates.
- For Left Outer: we infer new predicates from the left and set them as applicable on the Right side. No predicates are pulledUp.
- Right Outer Joins are handled in an analogous manner.
- For Full Outer Joins no predicates are pulledUp or inferred.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final org.apache.calcite.rel.metadata.RelMetadataProvider -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionorg.apache.calcite.rel.metadata.MetadataDef<org.apache.calcite.rel.metadata.BuiltInMetadata.Predicates>getDef()org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.plan.volcano.RelSubset r, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Returns theBuiltInMetadata.Predicates.getPredicates()statistic.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Aggregate agg, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for an Aggregate.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Correlate correlate, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a correlate node.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Exchange exchange, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for an Exchange.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Filter filter, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Add the Filter condition to the pulledPredicates list from the input.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Intersect intersect, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Intersect.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Join join, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for aJoin(includingSemiJoin).org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Minus minus, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Minus.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Project project, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a project.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Sort sort, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Sort.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.TableModify tableModify, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a TableModify.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.TableScan scan, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a table scan.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.core.Union union, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Union.org.apache.calcite.plan.RelOptPredicateListgetPredicates(org.apache.calcite.rel.RelNode rel, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Catch-all implementation forBuiltInMetadata.Predicates.getPredicates(), invoked using reflection.
-
Field Details
-
SOURCE
public static final org.apache.calcite.rel.metadata.RelMetadataProvider SOURCE
-
-
Constructor Details
-
RelMdPredicates
public RelMdPredicates()
-
-
Method Details
-
getDef
public org.apache.calcite.rel.metadata.MetadataDef<org.apache.calcite.rel.metadata.BuiltInMetadata.Predicates> getDef()- Specified by:
getDefin interfaceorg.apache.calcite.rel.metadata.MetadataHandler<org.apache.calcite.rel.metadata.BuiltInMetadata.Predicates>
-
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.RelNode rel, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Catch-all implementation forBuiltInMetadata.Predicates.getPredicates(), invoked using reflection.- See Also:
-
RelMetadataQuery.getPulledUpPredicates(RelNode)
-
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.TableScan scan, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a table scan. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Project project, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a project.- create a mapping from input to projection. Map only positions that directly reference an input column.
- Expressions that only contain above columns are retained in the Project's pullExpressions list.
- For e.g. expression 'a + e = 9' below will not be pulled up because 'e' is not in the
projection list.
inputPullUpExprs: {a > 7, b + c < 10, a + e = 9} projectionExprs: {a, b, c, e / 2} projectionPullupExprs: {a > 7, b + c < 10}
-
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Correlate correlate, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a correlate node. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Filter filter, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Add the Filter condition to the pulledPredicates list from the input. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Join join, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for aJoin(includingSemiJoin). -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Aggregate agg, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for an Aggregate.Pulls up predicates that only contains references to columns in the GroupSet. For e.g.
inputPullUpExprs : { a > 7, b + c < 10, a + e = 9} groupSet : { a, b} pulledUpExprs : { a > 7} -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Union union, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Union. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Intersect intersect, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Intersect. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Minus minus, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Minus. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Sort sort, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a Sort. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.TableModify tableModify, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for a TableModify. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.rel.core.Exchange exchange, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Infers predicates for an Exchange. -
getPredicates
public org.apache.calcite.plan.RelOptPredicateList getPredicates(org.apache.calcite.plan.volcano.RelSubset r, org.apache.calcite.rel.metadata.RelMetadataQuery mq) Returns theBuiltInMetadata.Predicates.getPredicates()statistic.- See Also:
-
RelMetadataQuery.getPulledUpPredicates(RelNode)
-