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
   }