This is an automated email from the ASF dual-hosted git repository. jark pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink.git
commit 07dec981ccb368f64a86181ffba7b48b6409621c Author: yuzhao.cyz <[email protected]> AuthorDate: Tue Mar 17 19:09:48 2020 +0800 [FLINK-14338][table-planner][table-planner-blink] Implements new RelMetadataQuery extension * This feature is introduced in CALCITE-3446 --- .../org/apache/calcite/plan/RelOptCluster.java | 203 -------------------- .../plan/metadata/FlinkRelMetadataQuery.java | 64 +++---- .../calcite/FlinkRelOptClusterFactory.scala | 15 +- .../metadata/AggCallSelectivityEstimatorTest.scala | 4 +- .../plan/metadata/FlinkRelMdHandlerTestBase.scala | 4 +- .../plan/metadata/SelectivityEstimatorTest.scala | 4 +- .../org/apache/calcite/plan/RelOptCluster.java | 204 --------------------- .../table/calcite/FlinkRelOptClusterFactory.scala | 6 +- 8 files changed, 43 insertions(+), 461 deletions(-) diff --git a/flink-table/flink-table-planner-blink/src/main/java/org/apache/calcite/plan/RelOptCluster.java b/flink-table/flink-table-planner-blink/src/main/java/org/apache/calcite/plan/RelOptCluster.java deleted file mode 100644 index e32a597..0000000 --- a/flink-table/flink-table-planner-blink/src/main/java/org/apache/calcite/plan/RelOptCluster.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to you under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.calcite.plan; - -import org.apache.calcite.rel.RelNode; -import org.apache.calcite.rel.core.CorrelationId; -import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider; -import org.apache.calcite.rel.metadata.MetadataFactory; -import org.apache.calcite.rel.metadata.MetadataFactoryImpl; -import org.apache.calcite.rel.metadata.RelMetadataProvider; -import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.apache.calcite.rel.type.RelDataTypeFactory; -import org.apache.calcite.rex.RexBuilder; -import org.apache.calcite.rex.RexNode; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * This class is copied from Calcite's {@link org.apache.calcite.plan.RelOptCluster}, - * can be removed after https://issues.apache.org/jira/browse/CALCITE-2855 is accepted. - * NOTES: please make sure to synchronize with RelDecorrelator in flink planner when changing this class. - * - * Modification: - * - Make non-deprecated constructor public - */ - -/** - * An environment for related relational expressions during the - * optimization of a query. - */ -public class RelOptCluster { - //~ Instance fields -------------------------------------------------------- - - private final RelDataTypeFactory typeFactory; - private final RelOptPlanner planner; - private final AtomicInteger nextCorrel; - private final Map<String, RelNode> mapCorrelToRel; - private RexNode originalExpression; - private final RexBuilder rexBuilder; - private RelMetadataProvider metadataProvider; - private MetadataFactory metadataFactory; - private final RelTraitSet emptyTraitSet; - private RelMetadataQuery mq; - - //~ Constructors ----------------------------------------------------------- - - /** - * Creates a cluster. - */ - @Deprecated // to be removed before 2.0 - RelOptCluster( - RelOptQuery query, - RelOptPlanner planner, - RelDataTypeFactory typeFactory, - RexBuilder rexBuilder) { - this(planner, typeFactory, rexBuilder, query.nextCorrel, - query.mapCorrelToRel); - } - - /** - * Creates a cluster. - * - * <p>For use only from {@link #create} and {@link RelOptQuery}. - */ - public RelOptCluster(RelOptPlanner planner, RelDataTypeFactory typeFactory, - RexBuilder rexBuilder, AtomicInteger nextCorrel, - Map<String, RelNode> mapCorrelToRel) { - this.nextCorrel = nextCorrel; - this.mapCorrelToRel = mapCorrelToRel; - this.planner = Objects.requireNonNull(planner); - this.typeFactory = Objects.requireNonNull(typeFactory); - this.rexBuilder = rexBuilder; - this.originalExpression = rexBuilder.makeLiteral("?"); - - // set up a default rel metadata provider, - // giving the planner first crack at everything - setMetadataProvider(DefaultRelMetadataProvider.INSTANCE); - this.emptyTraitSet = planner.emptyTraitSet(); - assert emptyTraitSet.size() == planner.getRelTraitDefs().size(); - } - - /** Creates a cluster. */ - public static RelOptCluster create(RelOptPlanner planner, - RexBuilder rexBuilder) { - return new RelOptCluster(planner, rexBuilder.getTypeFactory(), - rexBuilder, new AtomicInteger(0), new HashMap<String, RelNode>()); - } - - //~ Methods ---------------------------------------------------------------- - - @Deprecated // to be removed before 2.0 - public RelOptQuery getQuery() { - return new RelOptQuery(planner, nextCorrel, mapCorrelToRel); - } - - @Deprecated // to be removed before 2.0 - public RexNode getOriginalExpression() { - return originalExpression; - } - - @Deprecated // to be removed before 2.0 - public void setOriginalExpression(RexNode originalExpression) { - this.originalExpression = originalExpression; - } - - public RelOptPlanner getPlanner() { - return planner; - } - - public RelDataTypeFactory getTypeFactory() { - return typeFactory; - } - - public RexBuilder getRexBuilder() { - return rexBuilder; - } - - public RelMetadataProvider getMetadataProvider() { - return metadataProvider; - } - - /** - * Overrides the default metadata provider for this cluster. - * - * @param metadataProvider custom provider - */ - public void setMetadataProvider(RelMetadataProvider metadataProvider) { - this.metadataProvider = metadataProvider; - this.metadataFactory = new MetadataFactoryImpl(metadataProvider); - } - - public MetadataFactory getMetadataFactory() { - return metadataFactory; - } - - /** Returns the current RelMetadataQuery. - * - * <p>This method might be changed or moved in future. - * If you have a {@link RelOptRuleCall} available, - * for example if you are in a {@link RelOptRule#onMatch(RelOptRuleCall)} - * method, then use {@link RelOptRuleCall#getMetadataQuery()} instead. */ - public RelMetadataQuery getMetadataQuery() { - if (mq == null) { - mq = RelMetadataQuery.instance(); - } - return mq; - } - - /** - * Should be called whenever the current {@link RelMetadataQuery} becomes - * invalid. Typically invoked from {@link RelOptRuleCall#transformTo}. - */ - public void invalidateMetadataQuery() { - mq = null; - } - - /** - * Constructs a new id for a correlating variable. It is unique within the - * whole query. - */ - public CorrelationId createCorrel() { - return new CorrelationId(nextCorrel.getAndIncrement()); - } - - /** Returns the default trait set for this cluster. */ - public RelTraitSet traitSet() { - return emptyTraitSet; - } - - /** @deprecated For {@code traitSetOf(t1, t2)}, - * use {@link #traitSet}().replace(t1).replace(t2). */ - @Deprecated // to be removed before 2.0 - public RelTraitSet traitSetOf(RelTrait... traits) { - RelTraitSet traitSet = emptyTraitSet; - for (RelTrait trait : traits) { - traitSet = traitSet.replace(trait); - } - return traitSet; - } - - public RelTraitSet traitSetOf(RelTrait trait) { - return emptyTraitSet.replace(trait); - } -} - -// End RelOptCluster.java diff --git a/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/plan/metadata/FlinkRelMetadataQuery.java b/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/plan/metadata/FlinkRelMetadataQuery.java index 7d70678..f41954e 100644 --- a/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/plan/metadata/FlinkRelMetadataQuery.java +++ b/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/plan/metadata/FlinkRelMetadataQuery.java @@ -33,8 +33,8 @@ import org.apache.calcite.util.ImmutableBitSet; * e.g ColumnInterval, ColumnNullCount. */ public class FlinkRelMetadataQuery extends RelMetadataQuery { - - protected static final FlinkRelMetadataQuery PROTOTYPE = new FlinkRelMetadataQuery(false); + // Serves as the handlers prototype of all the FlinkRelMetadataQuery instances. + private static final Handlers HANDLERS = new Handlers(); private FlinkMetadata.ColumnInterval.Handler columnIntervalHandler; private FlinkMetadata.FilteredColumnInterval.Handler filteredColumnInterval; @@ -67,43 +67,35 @@ public class FlinkRelMetadataQuery extends RelMetadataQuery { } } - private FlinkRelMetadataQuery( - JaninoRelMetadataProvider metadataProvider, - RelMetadataQuery prototype) { - super(metadataProvider, prototype); - } - + /** + * Creates a FlinkRelMetadataQuery instance. + */ private FlinkRelMetadataQuery() { - super(RelMetadataQuery.THREAD_PROVIDERS.get(), RelMetadataQuery.EMPTY); - this.columnIntervalHandler = PROTOTYPE.columnIntervalHandler; - this.filteredColumnInterval = PROTOTYPE.filteredColumnInterval; - this.columnNullCountHandler = PROTOTYPE.columnNullCountHandler; - this.columnOriginNullCountHandler = PROTOTYPE.columnOriginNullCountHandler; - this.uniqueGroupsHandler = PROTOTYPE.uniqueGroupsHandler; - this.distributionHandler = PROTOTYPE.distributionHandler; - this.modifiedMonotonicityHandler = PROTOTYPE.modifiedMonotonicityHandler; + this.columnIntervalHandler = HANDLERS.columnIntervalHandler; + this.filteredColumnInterval = HANDLERS.filteredColumnInterval; + this.columnNullCountHandler = HANDLERS.columnNullCountHandler; + this.columnOriginNullCountHandler = HANDLERS.columnOriginNullCountHandler; + this.uniqueGroupsHandler = HANDLERS.uniqueGroupsHandler; + this.distributionHandler = HANDLERS.distributionHandler; + this.modifiedMonotonicityHandler = HANDLERS.modifiedMonotonicityHandler; } - /** - * Creates and initializes the instance that will serve as a prototype for - * all other instances. - */ - private FlinkRelMetadataQuery(boolean dummy) { - super(RelMetadataQuery.THREAD_PROVIDERS.get(), RelMetadataQuery.EMPTY); - this.columnIntervalHandler = - RelMetadataQuery.initialHandler(FlinkMetadata.ColumnInterval.Handler.class); - this.filteredColumnInterval = - RelMetadataQuery.initialHandler(FlinkMetadata.FilteredColumnInterval.Handler.class); - this.columnNullCountHandler = - RelMetadataQuery.initialHandler(FlinkMetadata.ColumnNullCount.Handler.class); - this.columnOriginNullCountHandler = - RelMetadataQuery.initialHandler(FlinkMetadata.ColumnOriginNullCount.Handler.class); - this.uniqueGroupsHandler = - RelMetadataQuery.initialHandler(FlinkMetadata.UniqueGroups.Handler.class); - this.distributionHandler = - RelMetadataQuery.initialHandler(FlinkMetadata.FlinkDistribution.Handler.class); - this.modifiedMonotonicityHandler = - RelMetadataQuery.initialHandler(FlinkMetadata.ModifiedMonotonicity.Handler.class); + /** Extended handlers. */ + private static class Handlers { + private FlinkMetadata.ColumnInterval.Handler columnIntervalHandler = + initialHandler(FlinkMetadata.ColumnInterval.Handler.class); + private FlinkMetadata.FilteredColumnInterval.Handler filteredColumnInterval = + initialHandler(FlinkMetadata.FilteredColumnInterval.Handler.class); + private FlinkMetadata.ColumnNullCount.Handler columnNullCountHandler = + initialHandler(FlinkMetadata.ColumnNullCount.Handler.class); + private FlinkMetadata.ColumnOriginNullCount.Handler columnOriginNullCountHandler = + initialHandler(FlinkMetadata.ColumnOriginNullCount.Handler.class); + private FlinkMetadata.UniqueGroups.Handler uniqueGroupsHandler = + initialHandler(FlinkMetadata.UniqueGroups.Handler.class); + private FlinkMetadata.FlinkDistribution.Handler distributionHandler = + initialHandler(FlinkMetadata.FlinkDistribution.Handler.class); + private FlinkMetadata.ModifiedMonotonicity.Handler modifiedMonotonicityHandler = + initialHandler(FlinkMetadata.ModifiedMonotonicity.Handler.class); } /** diff --git a/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/calcite/FlinkRelOptClusterFactory.scala b/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/calcite/FlinkRelOptClusterFactory.scala index 629361d..93e16c2 100644 --- a/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/calcite/FlinkRelOptClusterFactory.scala +++ b/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/calcite/FlinkRelOptClusterFactory.scala @@ -18,12 +18,14 @@ package org.apache.flink.table.planner.calcite -import org.apache.flink.table.planner.plan.metadata.FlinkDefaultRelMetadataProvider +import org.apache.flink.table.planner.plan.metadata.{FlinkDefaultRelMetadataProvider, FlinkRelMetadataQuery} import org.apache.calcite.plan.{RelOptCluster, RelOptPlanner} -import org.apache.calcite.rel.metadata.{DefaultRelMetadataProvider, JaninoRelMetadataProvider, RelMetadataQuery} +import org.apache.calcite.rel.metadata.{DefaultRelMetadataProvider, RelMetadataQuery} import org.apache.calcite.rex.RexBuilder +import java.util.function.Supplier + /** * The utility class is to create special [[RelOptCluster]] instance which use * [[FlinkDefaultRelMetadataProvider]] instead of [[DefaultRelMetadataProvider]]. @@ -31,12 +33,11 @@ import org.apache.calcite.rex.RexBuilder object FlinkRelOptClusterFactory { def create(planner: RelOptPlanner, rexBuilder: RexBuilder): RelOptCluster = { - val cluster = FlinkRelOptCluster.create(planner, rexBuilder) + val cluster = RelOptCluster.create(planner, rexBuilder) cluster.setMetadataProvider(FlinkDefaultRelMetadataProvider.INSTANCE) - // just set metadataProvider is not enough, see - // https://www.mail-archive.com/[email protected]/msg00930.html - RelMetadataQuery.THREAD_PROVIDERS.set( - JaninoRelMetadataProvider.of(cluster.getMetadataProvider)) + cluster.setMetadataQuerySupplier(new Supplier[RelMetadataQuery]() { + def get: FlinkRelMetadataQuery = FlinkRelMetadataQuery.instance() + }) cluster } diff --git a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/AggCallSelectivityEstimatorTest.scala b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/AggCallSelectivityEstimatorTest.scala index da81b36..0fa3485 100644 --- a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/AggCallSelectivityEstimatorTest.scala +++ b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/AggCallSelectivityEstimatorTest.scala @@ -31,7 +31,7 @@ import org.apache.calcite.plan.{AbstractRelOptPlanner, RelOptCluster} import org.apache.calcite.rel.`type`.RelDataType import org.apache.calcite.rel.core.{Aggregate, AggregateCall, TableScan} import org.apache.calcite.rel.logical.LogicalAggregate -import org.apache.calcite.rel.metadata.{JaninoRelMetadataProvider, RelMetadataQuery} +import org.apache.calcite.rel.metadata.{JaninoRelMetadataProvider, RelMetadataQueryBase} import org.apache.calcite.rex.{RexBuilder, RexInputRef, RexLiteral, RexNode} import org.apache.calcite.sql.`type`.SqlTypeName import org.apache.calcite.sql.`type`.SqlTypeName._ @@ -628,7 +628,7 @@ object AggCallSelectivityEstimatorTest { @BeforeClass def beforeAll(): Unit = { - RelMetadataQuery + RelMetadataQueryBase .THREAD_PROVIDERS .set(JaninoRelMetadataProvider.of(FlinkDefaultRelMetadataProvider.INSTANCE)) } diff --git a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/FlinkRelMdHandlerTestBase.scala b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/FlinkRelMdHandlerTestBase.scala index 6ac2d68..20d91fc 100644 --- a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/FlinkRelMdHandlerTestBase.scala +++ b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/FlinkRelMdHandlerTestBase.scala @@ -57,7 +57,7 @@ import org.apache.calcite.rel._ import org.apache.calcite.rel.`type`.{RelDataType, RelDataTypeFieldImpl} import org.apache.calcite.rel.core.{AggregateCall, Calc, JoinInfo, JoinRelType, Project, Window} import org.apache.calcite.rel.logical.{LogicalAggregate, LogicalProject, LogicalSort, LogicalTableScan, LogicalValues} -import org.apache.calcite.rel.metadata.{JaninoRelMetadataProvider, RelMetadataQuery} +import org.apache.calcite.rel.metadata.{JaninoRelMetadataProvider, RelMetadataQuery, RelMetadataQueryBase} import org.apache.calcite.rex._ import org.apache.calcite.schema.SchemaPlus import org.apache.calcite.sql.SqlWindow @@ -2446,7 +2446,7 @@ class TestRel( object FlinkRelMdHandlerTestBase { @BeforeClass def beforeAll(): Unit = { - RelMetadataQuery + RelMetadataQueryBase .THREAD_PROVIDERS .set(JaninoRelMetadataProvider.of(FlinkDefaultRelMetadataProvider.INSTANCE)) } diff --git a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/SelectivityEstimatorTest.scala b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/SelectivityEstimatorTest.scala index 7a7e034..911d732 100644 --- a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/SelectivityEstimatorTest.scala +++ b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/plan/metadata/SelectivityEstimatorTest.scala @@ -30,7 +30,7 @@ import org.apache.flink.util.Preconditions import org.apache.calcite.plan.{AbstractRelOptPlanner, RelOptCluster} import org.apache.calcite.rel.`type`.RelDataType import org.apache.calcite.rel.core.TableScan -import org.apache.calcite.rel.metadata.{JaninoRelMetadataProvider, RelMetadataQuery} +import org.apache.calcite.rel.metadata.{JaninoRelMetadataProvider, RelMetadataQueryBase} import org.apache.calcite.rex.{RexBuilder, RexInputRef, RexLiteral, RexNode} import org.apache.calcite.sql.SqlOperator import org.apache.calcite.sql.`type`.SqlTypeName._ @@ -1107,7 +1107,7 @@ object SelectivityEstimatorTest { @BeforeClass def beforeAll(): Unit = { - RelMetadataQuery + RelMetadataQueryBase .THREAD_PROVIDERS .set(JaninoRelMetadataProvider.of(FlinkDefaultRelMetadataProvider.INSTANCE)) } diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/calcite/plan/RelOptCluster.java b/flink-table/flink-table-planner/src/main/java/org/apache/calcite/plan/RelOptCluster.java deleted file mode 100644 index 82a2bd6d..0000000 --- a/flink-table/flink-table-planner/src/main/java/org/apache/calcite/plan/RelOptCluster.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.calcite.plan; - -import org.apache.calcite.rel.RelNode; -import org.apache.calcite.rel.core.CorrelationId; -import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider; -import org.apache.calcite.rel.metadata.MetadataFactory; -import org.apache.calcite.rel.metadata.MetadataFactoryImpl; -import org.apache.calcite.rel.metadata.RelMetadataProvider; -import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.apache.calcite.rel.type.RelDataTypeFactory; -import org.apache.calcite.rex.RexBuilder; -import org.apache.calcite.rex.RexNode; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * This class is copied from Calcite's {@link org.apache.calcite.plan.RelOptCluster}, - * can be removed after https://issues.apache.org/jira/browse/CALCITE-2855 is accepted. - * NOTES: please make sure to synchronize with RelDecorrelator in blink planner when changing this class. - * - * Modification: - * - Make non-deprecated constructor public - */ - -/** - * An environment for related relational expressions during the - * optimization of a query. - */ -public class RelOptCluster { - //~ Instance fields -------------------------------------------------------- - - private final RelDataTypeFactory typeFactory; - private final RelOptPlanner planner; - private final AtomicInteger nextCorrel; - private final Map<String, RelNode> mapCorrelToRel; - private RexNode originalExpression; - private final RexBuilder rexBuilder; - private RelMetadataProvider metadataProvider; - private MetadataFactory metadataFactory; - private final RelTraitSet emptyTraitSet; - private RelMetadataQuery mq; - - //~ Constructors ----------------------------------------------------------- - - /** - * Creates a cluster. - */ - @Deprecated // to be removed before 2.0 - RelOptCluster( - RelOptQuery query, - RelOptPlanner planner, - RelDataTypeFactory typeFactory, - RexBuilder rexBuilder) { - this(planner, typeFactory, rexBuilder, query.nextCorrel, - query.mapCorrelToRel); - } - - /** - * Creates a cluster. - * - * <p>For use only from {@link #create} and {@link RelOptQuery}. - */ - public RelOptCluster(RelOptPlanner planner, RelDataTypeFactory typeFactory, - RexBuilder rexBuilder, AtomicInteger nextCorrel, - Map<String, RelNode> mapCorrelToRel) { - this.nextCorrel = nextCorrel; - this.mapCorrelToRel = mapCorrelToRel; - this.planner = Objects.requireNonNull(planner); - this.typeFactory = Objects.requireNonNull(typeFactory); - this.rexBuilder = rexBuilder; - this.originalExpression = rexBuilder.makeLiteral("?"); - - // set up a default rel metadata provider, - // giving the planner first crack at everything - setMetadataProvider(DefaultRelMetadataProvider.INSTANCE); - this.emptyTraitSet = planner.emptyTraitSet(); - assert emptyTraitSet.size() == planner.getRelTraitDefs().size(); - } - - /** Creates a cluster. */ - public static RelOptCluster create(RelOptPlanner planner, - RexBuilder rexBuilder) { - return new RelOptCluster(planner, rexBuilder.getTypeFactory(), - rexBuilder, new AtomicInteger(0), new HashMap<String, RelNode>()); - } - - //~ Methods ---------------------------------------------------------------- - - @Deprecated // to be removed before 2.0 - public RelOptQuery getQuery() { - return new RelOptQuery(planner, nextCorrel, mapCorrelToRel); - } - - @Deprecated // to be removed before 2.0 - public RexNode getOriginalExpression() { - return originalExpression; - } - - @Deprecated // to be removed before 2.0 - public void setOriginalExpression(RexNode originalExpression) { - this.originalExpression = originalExpression; - } - - public RelOptPlanner getPlanner() { - return planner; - } - - public RelDataTypeFactory getTypeFactory() { - return typeFactory; - } - - public RexBuilder getRexBuilder() { - return rexBuilder; - } - - public RelMetadataProvider getMetadataProvider() { - return metadataProvider; - } - - /** - * Overrides the default metadata provider for this cluster. - * - * @param metadataProvider custom provider - */ - public void setMetadataProvider(RelMetadataProvider metadataProvider) { - this.metadataProvider = metadataProvider; - this.metadataFactory = new MetadataFactoryImpl(metadataProvider); - } - - public MetadataFactory getMetadataFactory() { - return metadataFactory; - } - - /** Returns the current RelMetadataQuery. - * - * <p>This method might be changed or moved in future. - * If you have a {@link RelOptRuleCall} available, - * for example if you are in a {@link RelOptRule#onMatch(RelOptRuleCall)} - * method, then use {@link RelOptRuleCall#getMetadataQuery()} instead. */ - public RelMetadataQuery getMetadataQuery() { - if (mq == null) { - mq = RelMetadataQuery.instance(); - } - return mq; - } - - /** - * Should be called whenever the current {@link RelMetadataQuery} becomes - * invalid. Typically invoked from {@link RelOptRuleCall#transformTo}. - */ - public void invalidateMetadataQuery() { - mq = null; - } - - /** - * Constructs a new id for a correlating variable. It is unique within the - * whole query. - */ - public CorrelationId createCorrel() { - return new CorrelationId(nextCorrel.getAndIncrement()); - } - - /** Returns the default trait set for this cluster. */ - public RelTraitSet traitSet() { - return emptyTraitSet; - } - - /** @deprecated For {@code traitSetOf(t1, t2)}, - * use {@link #traitSet}().replace(t1).replace(t2). */ - @Deprecated // to be removed before 2.0 - public RelTraitSet traitSetOf(RelTrait... traits) { - RelTraitSet traitSet = emptyTraitSet; - for (RelTrait trait : traits) { - traitSet = traitSet.replace(trait); - } - return traitSet; - } - - public RelTraitSet traitSetOf(RelTrait trait) { - return emptyTraitSet.replace(trait); - } -} - -// End RelOptCluster.java diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/calcite/FlinkRelOptClusterFactory.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/calcite/FlinkRelOptClusterFactory.scala index 24fdb9e..c8cfd59 100644 --- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/calcite/FlinkRelOptClusterFactory.scala +++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/calcite/FlinkRelOptClusterFactory.scala @@ -19,7 +19,7 @@ package org.apache.flink.table.calcite import org.apache.calcite.plan.{RelOptCluster, RelOptPlanner} -import org.apache.calcite.rel.metadata.{DefaultRelMetadataProvider, JaninoRelMetadataProvider, RelMetadataQuery} +import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider import org.apache.calcite.rex.RexBuilder import org.apache.flink.table.plan.cost.FlinkDefaultRelMetadataProvider @@ -32,10 +32,6 @@ object FlinkRelOptClusterFactory { def create(planner: RelOptPlanner, rexBuilder: RexBuilder): RelOptCluster = { val cluster = RelOptCluster.create(planner, rexBuilder) cluster.setMetadataProvider(FlinkDefaultRelMetadataProvider.INSTANCE) - // just set metadataProvider is not enough, see - // https://www.mail-archive.com/[email protected]/msg00930.html - RelMetadataQuery.THREAD_PROVIDERS.set( - JaninoRelMetadataProvider.of(cluster.getMetadataProvider)) cluster }
