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;
}
}