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"