You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2020/06/22 07:47:31 UTC

[calcite] branch master updated: [CALCITE-3786] Add Digest interface to enable efficient hashCode(equals) for RexNode and RelNode (part2)

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

danny0405 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 b184707  [CALCITE-3786] Add Digest interface to enable efficient hashCode(equals) for RexNode and RelNode (part2)
b184707 is described below

commit b18470797eaec8c4e64382c0b742ae83f758275f
Author: yuzhao.cyz <yu...@gmail.com>
AuthorDate: Fri Jun 19 12:16:36 2020 +0800

    [CALCITE-3786] Add Digest interface to enable efficient hashCode(equals) for RexNode and RelNode (part2)
    
    Tweak based on the review concerns.
---
 .../main/java/org/apache/calcite/plan/Digest.java  | 42 +++++-----------------
 .../org/apache/calcite/plan/hep/HepRelVertex.java  |  2 +-
 .../org/apache/calcite/plan/volcano/RelSubset.java |  2 +-
 .../org/apache/calcite/rel/AbstractRelNode.java    |  2 +-
 .../test/enumerable/EnumerableCorrelateTest.java   |  4 +--
 5 files changed, 14 insertions(+), 38 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/Digest.java b/core/src/main/java/org/apache/calcite/plan/Digest.java
index 494cb14..e7375bf 100644
--- a/core/src/main/java/org/apache/calcite/plan/Digest.java
+++ b/core/src/main/java/org/apache/calcite/plan/Digest.java
@@ -24,7 +24,6 @@ import org.apache.calcite.util.Pair;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Objects;
 import javax.annotation.Nonnull;
 
 /**
@@ -61,7 +60,7 @@ public class Digest implements Comparable<Digest> {
    * Creates a digest with given rel and properties.
    *
    * @param rel   The rel
-   * @param items The properties, e.g. the inputs, the type, the traits and so on
+   * @param items The properties, e.g. the inputs, the operands and so on
    */
   private Digest(RelNode rel, List<Pair<String, Object>> items) {
     this.rel = rel;
@@ -69,14 +68,6 @@ public class Digest implements Comparable<Digest> {
     this.hashCode = computeIdentity(rel, this.items);
   }
 
-  /**
-   * Creates a digest with given rel, the digest is computed as simple,
-   * see {@link #simpleRelDigest(RelNode)}.
-   */
-  private Digest(RelNode rel) {
-    this(rel, simpleRelDigest(rel));
-  }
-
   /** Creates a digest with given rel and string format digest. */
   private Digest(RelNode rel, String digest) {
     this.rel = rel;
@@ -87,7 +78,7 @@ public class Digest implements Comparable<Digest> {
 
   /** Returns the identity of this digest which is used to speedup hashCode and equals. */
   private static int computeIdentity(RelNode rel, List<Pair<String, Object>> contents) {
-    return Objects.hash(collect(rel, contents, false));
+    return collect(rel, contents, false).hashCode();
   }
 
   /**
@@ -104,7 +95,7 @@ public class Digest implements Comparable<Digest> {
    * @param contents The rel properties should be considered in digest
    * @param withType Whether to involve the row type
    */
-  private static Object[] collect(
+  private static List<Object> collect(
       RelNode rel,
       List<Pair<String, Object>> contents,
       boolean withType) {
@@ -130,14 +121,14 @@ public class Digest implements Comparable<Digest> {
     }
     // The rel node contents(e.g. the inputs or exprs).
     hashCodeItems.addAll(contents);
-    return hashCodeItems.toArray();
+    return hashCodeItems;
   }
 
   /** Normalizes the rel node properties, currently, just to replace the
    * {@link RelNode} with a simple string format digest. **/
   private static List<Pair<String, Object>> normalizeContents(
       List<Pair<String, Object>> items) {
-    List<Pair<String, Object>> normalized = new ArrayList<>();
+    List<Pair<String, Object>> normalized = new ArrayList<>(items.size());
     for (Pair<String, Object> item : items) {
       if (item.right instanceof RelNode) {
         RelNode input = (RelNode) item.right;
@@ -208,17 +199,9 @@ public class Digest implements Comparable<Digest> {
    * reduce mem consumption.
    */
   private boolean deepEquals(Digest other) {
-    Object[] thisItems = collect(this.rel, this.items, true);
-    Object[] thatItems = collect(other.rel, other.items, true);
-    if (thisItems.length != thatItems.length) {
-      return false;
-    }
-    for (int i = 0; i < thisItems.length; i++) {
-      if (!Objects.equals(thisItems[i], thatItems[i])) {
-        return false;
-      }
-    }
-    return true;
+    List<Object> thisItems = collect(this.rel, this.items, true);
+    List<Object> thatItems = collect(other.rel, other.items, true);
+    return thisItems.equals(thatItems);
   }
 
   @Override public int hashCode() {
@@ -233,13 +216,6 @@ public class Digest implements Comparable<Digest> {
   }
 
   /**
-   * Creates a digest with given rel.
-   */
-  public static Digest create(RelNode rel) {
-    return new Digest(rel);
-  }
-
-  /**
    * Creates a digest with given rel and string format digest
    */
   public static Digest create(RelNode rel, String digest) {
@@ -250,7 +226,7 @@ public class Digest implements Comparable<Digest> {
    * Instantiates a digest with solid string format digest, this digest should only
    * be used as a initial.
    */
-  public static Digest initial(RelNode rel) {
+  public static Digest create(RelNode rel) {
     return new Digest(rel, simpleRelDigest(rel));
   }
 }
diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java b/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java
index 92394b1..43e95c1 100644
--- a/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java
+++ b/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java
@@ -77,7 +77,7 @@ public class HepRelVertex extends AbstractRelNode {
   }
 
   @Override protected Digest computeDigest() {
-    return Digest.create(this, getRelTypeName() + '#' + getCurrentRel().getId());
+    return Digest.create(this, "HepRelVertex#" + getCurrentRel().getId());
   }
 
   /**
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
index e821496..8b42c08 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
@@ -226,7 +226,7 @@ public class RelSubset extends AbstractRelNode {
   }
 
   @Override protected Digest computeDigest() {
-    StringBuilder digest = new StringBuilder(getRelTypeName());
+    StringBuilder digest = new StringBuilder("RelSubset");
     digest.append('#');
     digest.append(set.id);
     for (RelTrait trait : getTraitSet()) {
diff --git a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
index c5ec873..cad9de6 100644
--- a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
+++ b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
@@ -97,7 +97,7 @@ public abstract class AbstractRelNode implements RelNode {
     this.cluster = cluster;
     this.traitSet = traitSet;
     this.id = NEXT_ID.getAndIncrement();
-    this.digest = Digest.initial(this);
+    this.digest = Digest.create(this);
     LOGGER.trace("new {}", digest);
   }
 
diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
index d0a65e9..589589f 100644
--- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
+++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
@@ -96,7 +96,7 @@ class EnumerableCorrelateTest {
           planner.removeRule(EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE);
         })
         .explainContains(""
-            + "PLAN=EnumerableCalc(expr#0..3=[{inputs}], empid=[$t1], name=[$t3])\n"
+            + "EnumerableCalc(expr#0..3=[{inputs}], empid=[$t1], name=[$t3])\n"
             + "  EnumerableCorrelate(correlation=[$cor1], joinType=[inner], requiredColumns=[{0}])\n"
             + "    EnumerableAggregate(group=[{0}])\n"
             + "      EnumerableTableScan(table=[[s, depts]])\n"
@@ -126,7 +126,7 @@ class EnumerableCorrelateTest {
           planner.removeRule(EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE);
         })
         .explainContains(""
-            + "PLAN=EnumerableCalc(expr#0..3=[{inputs}], empid=[$t1], name=[$t3])\n"
+            + "EnumerableCalc(expr#0..3=[{inputs}], empid=[$t1], name=[$t3])\n"
             + "  EnumerableCorrelate(correlation=[$cor1], joinType=[inner], requiredColumns=[{0}])\n"
             + "    EnumerableAggregate(group=[{0}])\n"
             + "      EnumerableTableScan(table=[[s, depts]])\n"