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
   }
 

Reply via email to