You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ja...@apache.org on 2020/03/31 02:15:17 UTC
[flink] 03/13: [FLINK-14338][table-planner][table-planner-blink]
Implements new RelMetadataQuery extension
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 <yu...@gmail.com>
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/dev@calcite.apache.org/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/dev@calcite.apache.org/msg00930.html
- RelMetadataQuery.THREAD_PROVIDERS.set(
- JaninoRelMetadataProvider.of(cluster.getMetadataProvider))
cluster
}