You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by hy...@apache.org on 2019/11/08 23:22:11 UTC

[calcite] branch master updated: [CALCITE-3487] Should not hard code RelMetadataQuery class in VolcanoPlanner.isValid() (Xiening Dai)

This is an automated email from the ASF dual-hosted git repository.

hyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new f90e5d7  [CALCITE-3487] Should not hard code RelMetadataQuery class in VolcanoPlanner.isValid() (Xiening Dai)
f90e5d7 is described below

commit f90e5d7b48848191c1a70e6c0f78eece93433806
Author: Xiening Dai <xn...@live.com>
AuthorDate: Fri Nov 8 10:05:49 2019 -0800

    [CALCITE-3487] Should not hard code RelMetadataQuery class in VolcanoPlanner.isValid() (Xiening Dai)
    
    Add a new method to get RelMetadataQuery supplier from RelOptCluster. And use
    the supplier to create corresponding RelMetadataQuery object in isValid() call.
    
    Also rename setMetadataQuery() to setMetadataQuerySupplier().
    
    Close #1569
---
 .../main/java/org/apache/calcite/plan/RelOptCluster.java  | 15 ++++++++++++---
 .../org/apache/calcite/plan/volcano/VolcanoPlanner.java   |  2 +-
 .../apache/calcite/rel/metadata/RelMetadataQueryBase.java |  2 +-
 .../java/org/apache/calcite/test/RelMetadataTest.java     |  4 ++--
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java b/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java
index 88d0911..79dcc5c 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java
@@ -87,7 +87,7 @@ public class RelOptCluster {
     // set up a default rel metadata provider,
     // giving the planner first crack at everything
     setMetadataProvider(DefaultRelMetadataProvider.INSTANCE);
-    setMetadataQuery(RelMetadataQuery::instance);
+    setMetadataQuerySupplier(RelMetadataQuery::instance);
     this.emptyTraitSet = planner.emptyTraitSet();
     assert emptyTraitSet.size() == planner.getRelTraitDefs().size();
   }
@@ -152,14 +152,15 @@ public class RelOptCluster {
   }
 
   /**
-   * Set up the customized {@link RelMetadataQuery} instance that to use during rule planning.
+   * Set up the customized {@link RelMetadataQuery} instance supplier that to
+   * use during rule planning.
    *
    * <p>Note that the {@code mqSupplier} should return
    * a fresh new {@link RelMetadataQuery} instance because the instance would be
    * cached in this cluster, and we may invalidate and re-generate it
    * for each {@link RelOptRuleCall} cycle.
    */
-  public void setMetadataQuery(Supplier<RelMetadataQuery> mqSupplier) {
+  public void setMetadataQuerySupplier(Supplier<RelMetadataQuery> mqSupplier) {
     this.mqSupplier = mqSupplier;
   }
 
@@ -178,6 +179,14 @@ public class RelOptCluster {
   }
 
   /**
+   * Returns the RelMetadataQuery supplier
+   * @return The supplier of RelMetadataQuery
+   */
+  public Supplier<RelMetadataQuery> getMetadataQuerySupplier() {
+    return this.mqSupplier;
+  }
+
+  /**
    * Should be called whenever the current {@link RelMetadataQuery} becomes
    * invalid. Typically invoked from {@link RelOptRuleCall#transformTo}.
    */
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
index d28b5ce..9901ff3 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
@@ -877,7 +877,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
    * Checks internal consistency.
    */
   protected boolean isValid(Litmus litmus) {
-    RelMetadataQuery metaQuery = RelMetadataQuery.instance();
+    RelMetadataQuery metaQuery = this.getRoot().getCluster().getMetadataQuerySupplier().get();
     for (RelSet set : allSets) {
       if (set.equivalentSet != null) {
         return litmus.fail("set [{}] has been merged: it should not be in the list", set);
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java
index aff4fef..3fbd935 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java
@@ -48,7 +48,7 @@ import java.util.function.Supplier;
  * "SOURCE"s with default ones also works).
  * <li>Set {@code MyRelMetadataProvider} into the cluster instance.
  * <li>Use
- * {@link org.apache.calcite.plan.RelOptCluster#setMetadataQuery(Supplier)}
+ * {@link org.apache.calcite.plan.RelOptCluster#setMetadataQuerySupplier(Supplier)}
  * to set the metadata query {@link Supplier} into the cluster instance. This {@link Supplier}
  * should return a <strong>fresh new</strong> instance.
  * <li>Use the cluster instance to create
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index 8197543..39b5ea6 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -1172,7 +1172,7 @@ public class RelMetadataTest extends SqlToRelTestBase {
               ChainedRelMetadataProvider.of(
                   ImmutableList.of(BrokenColTypeImpl.SOURCE,
                       cluster.getMetadataProvider())));
-          cluster.setMetadataQuery(MyRelMetadataQuery::new);
+          cluster.setMetadataQuerySupplier(MyRelMetadataQuery::new);
           return cluster;
         })
         .convertSqlToRel(sql);
@@ -1282,7 +1282,7 @@ public class RelMetadataTest extends SqlToRelTestBase {
                   cluster.getMetadataProvider());
           cluster.setMetadataProvider(
               ChainedRelMetadataProvider.of(list));
-          cluster.setMetadataQuery(MyRelMetadataQuery::new);
+          cluster.setMetadataQuerySupplier(MyRelMetadataQuery::new);
           return cluster;
         })
         .convertSqlToRel(sql);