You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ch...@apache.org on 2020/02/16 12:11:49 UTC

[calcite] branch master updated: [CALCITE-3791] HepPlanner does not clear metadata cache for the ancestors of discarded node when a transformation happens

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

chunwei 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 6687925  [CALCITE-3791] HepPlanner does not clear metadata cache for the ancestors of discarded node when a transformation happens
6687925 is described below

commit 668792554cf7097d668bf794ef2ba5b1fd4956ee
Author: Chunwei Lei <ch...@gmail.com>
AuthorDate: Thu Feb 13 14:39:39 2020 +0800

    [CALCITE-3791] HepPlanner does not clear metadata cache for the ancestors of discarded node when a transformation happens
---
 .../org/apache/calcite/plan/hep/HepPlanner.java    | 26 +++++++++++++++++++++-
 .../org/apache/calcite/rel/metadata/RelMdUtil.java |  6 ++---
 .../calcite/rel/metadata/RelMetadataQueryBase.java | 12 ++++++++--
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
index 3f9dd35..0ffebf2 100644
--- a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
@@ -59,8 +59,10 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
 import java.util.Set;
 
 /**
@@ -874,7 +876,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
         }
         parentRel.replaceInput(i, preservedVertex);
       }
-      RelMdUtil.clearCache(parentRel);
+      clearCache(parent);
       graph.removeEdge(parent, discardedVertex);
       graph.addEdge(parent, preservedVertex);
       updateVertex(parent, parentRel);
@@ -889,6 +891,28 @@ public class HepPlanner extends AbstractRelOptPlanner {
     }
   }
 
+  /**
+   * Clears metadata cache for the RelNode and its ancestors.
+   *
+   * @param vertex relnode
+   */
+  private void clearCache(HepRelVertex vertex) {
+    RelMdUtil.clearCache(vertex.getCurrentRel());
+    if (!RelMdUtil.clearCache(vertex)) {
+      return;
+    }
+    Queue<DefaultEdge> queue =
+        new LinkedList<>(graph.getInwardEdges(vertex));
+    while (!queue.isEmpty()) {
+      DefaultEdge edge = queue.remove();
+      HepRelVertex source = (HepRelVertex) edge.source;
+      RelMdUtil.clearCache(source.getCurrentRel());
+      if (RelMdUtil.clearCache(source)) {
+        queue.addAll(graph.getInwardEdges(source));
+      }
+    }
+  }
+
   private void updateVertex(HepRelVertex vertex, RelNode rel) {
     if (rel != vertex.getCurrentRel()) {
       // REVIEW jvs 5-Apr-2006:  We'll do this again later
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
index e7f9484..2a28588 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
@@ -943,9 +943,9 @@ public class RelMdUtil {
    * Removes cached metadata values for specified RelNode.
    *
    * @param rel RelNode whose cached metadata should be removed
+   * @return true if cache for the provided RelNode was not empty
    */
-  public static void clearCache(RelNode rel) {
-    rel.getCluster().getMetadataQuery().clearCache(rel);
+  public static boolean clearCache(RelNode rel) {
+    return rel.getCluster().getMetadataQuery().clearCache(rel);
   }
-
 }
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 6bceb26..0de898c 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
@@ -23,6 +23,7 @@ import com.google.common.collect.Table;
 
 import java.lang.reflect.Proxy;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Supplier;
 
 /**
@@ -98,8 +99,15 @@ public class RelMetadataQueryBase {
    * Removes cached metadata values for specified RelNode.
    *
    * @param rel RelNode whose cached metadata should be removed
+   * @return true if cache for the provided RelNode was not empty
    */
-  public void clearCache(RelNode rel) {
-    map.row(rel).clear();
+  public boolean clearCache(RelNode rel) {
+    Map<List, Object> row = map.row(rel);
+    if (row.isEmpty()) {
+      return false;
+    }
+
+    row.clear();
+    return true;
   }
 }