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 7ab6435  [CALCITE-4105] Replace Pair with Flat2List in RelDigestWriter
7ab6435 is described below

commit 7ab643565a695cd46b6013392874c250fc0cb5a0
Author: Haisheng Yuan <[email protected]>
AuthorDate: Fri Jul 3 15:51:31 2020 -0500

    [CALCITE-4105] Replace Pair with Flat2List in RelDigestWriter
---
 .../org/apache/calcite/plan/volcano/RelSubset.java |  8 +++++++
 .../org/apache/calcite/rel/AbstractRelNode.java    | 27 ++++++++++++++--------
 .../java/org/apache/calcite/rel/core/Filter.java   |  4 ++++
 .../java/org/apache/calcite/rel/core/Join.java     |  4 ++++
 .../java/org/apache/calcite/rel/core/Project.java  |  4 ++++
 .../main/java/org/apache/calcite/rex/RexCall.java  |  1 -
 6 files changed, 37 insertions(+), 11 deletions(-)

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 f77b5c7..afecdce 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
@@ -240,6 +240,14 @@ public class RelSubset extends AbstractRelNode {
     pw.done(input);
   }
 
+  @Override protected boolean digestEquals(Object obj) {
+    return this == obj;
+  }
+
+  @Override protected int digestHash() {
+    return this.hashCode();
+  }
+
   @Override protected RelDataType deriveRowType() {
     return set.rel.getRowType();
   }
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 ce71993..b55c90d 100644
--- a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
+++ b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
@@ -28,12 +28,14 @@ import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.core.CorrelationId;
 import org.apache.calcite.rel.hint.Hintable;
+import org.apache.calcite.rel.hint.RelHint;
 import org.apache.calcite.rel.metadata.Metadata;
 import org.apache.calcite.rel.metadata.MetadataFactory;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
+import org.apache.calcite.runtime.FlatLists;
 import org.apache.calcite.sql.SqlExplainLevel;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Litmus;
@@ -405,6 +407,7 @@ public abstract class AbstractRelNode implements RelNode {
    * @return Whether the 2 RelNodes are equivalent or have the same digest.
    * @see #digestHash()
    */
+  @API(since = "1.24", status = API.Status.EXPERIMENTAL)
   protected boolean digestEquals(Object obj) {
     if (this == obj) {
       return true;
@@ -423,17 +426,19 @@ public abstract class AbstractRelNode implements RelNode {
    *
    * @see #digestEquals(Object)
    */
+  @API(since = "1.24", status = API.Status.EXPERIMENTAL)
   protected int digestHash() {
     return Objects.hash(getTraitSet(), getDigestItems());
   }
 
-  private List<Pair<String, Object>> getDigestItems() {
+  private List<List<Object>> getDigestItems() {
     RelDigestWriter rdw = new RelDigestWriter();
     explainTerms(rdw);
     if (this instanceof Hintable) {
-      rdw.item("hints", ((Hintable) this).getHints());
+      List<RelHint> hints = ((Hintable) this).getHints();
+      rdw.itemIf("hints", hints, !hints.isEmpty());
     }
-    return rdw.values;
+    return rdw.attrs;
   }
 
   private class InnerRelDigest implements RelDigest {
@@ -485,7 +490,7 @@ public abstract class AbstractRelNode implements RelNode {
    */
   private static final class RelDigestWriter implements RelWriter {
 
-    private final List<Pair<String, Object>> values = new ArrayList<>();
+    private final List<List<Object>> attrs = new ArrayList<>();
 
     String digest = null;
 
@@ -503,7 +508,7 @@ public abstract class AbstractRelNode implements RelNode {
         // convert it to String to keep the same behaviour.
         value = "" + value;
       }
-      values.add(Pair.of(term, value));
+      attrs.add(FlatLists.of(term, value));
       return this;
     }
 
@@ -514,19 +519,21 @@ public abstract class AbstractRelNode implements RelNode {
       sb.append(node.getTraitSet());
       sb.append('(');
       int j = 0;
-      for (Pair<String, Object> value : values) {
+      for (List<Object> attr : attrs) {
+        String key = (String) attr.get(0);
+        Object value = attr.get(1);
         if (j++ > 0) {
           sb.append(',');
         }
-        sb.append(value.left);
+        sb.append(key);
         sb.append('=');
-        if (value.right instanceof RelNode) {
-          RelNode input = (RelNode) value.right;
+        if (value instanceof RelNode) {
+          RelNode input = (RelNode) value;
           sb.append(input.getRelTypeName());
           sb.append('#');
           sb.append(input.getId());
         } else {
-          sb.append(value.right);
+          sb.append(value);
         }
       }
       sb.append(')');
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Filter.java 
b/core/src/main/java/org/apache/calcite/rel/core/Filter.java
index 0efea06..64898f6 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Filter.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Filter.java
@@ -36,6 +36,8 @@ import org.apache.calcite.util.Litmus;
 
 import com.google.common.collect.ImmutableList;
 
+import org.apiguardian.api.API;
+
 import java.util.List;
 import java.util.Objects;
 
@@ -154,6 +156,7 @@ public abstract class Filter extends SingleRel {
         .item("condition", condition);
   }
 
+  @API(since = "1.24", status = API.Status.INTERNAL)
   protected boolean digestEquals0(Object obj) {
     if (this == obj) {
       return true;
@@ -168,6 +171,7 @@ public abstract class Filter extends SingleRel {
         && getRowType().equalsSansFieldNames(o.getRowType());
   }
 
+  @API(since = "1.24", status = API.Status.INTERNAL)
   protected int digestHash0() {
     return Objects.hash(traitSet, input, condition);
   }
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Join.java 
b/core/src/main/java/org/apache/calcite/rel/core/Join.java
index b8f6c13..2472f0c 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Join.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Join.java
@@ -41,6 +41,8 @@ import org.apache.calcite.util.Util;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
+import org.apiguardian.api.API;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -233,6 +235,7 @@ public abstract class Join extends BiRel implements 
Hintable {
             !getSystemFieldList().isEmpty());
   }
 
+  @API(since = "1.24", status = API.Status.INTERNAL)
   protected boolean digestEquals0(Object obj) {
     if (this == obj) {
       return true;
@@ -249,6 +252,7 @@ public abstract class Join extends BiRel implements 
Hintable {
         && getRowType().equalsSansFieldNames(o.getRowType());
   }
 
+  @API(since = "1.24", status = API.Status.INTERNAL)
   protected int digestHash0() {
     return Objects.hash(traitSet, left, right,
         condition, joinType, hints);
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Project.java 
b/core/src/main/java/org/apache/calcite/rel/core/Project.java
index 99083c0..841d823 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Project.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Project.java
@@ -46,6 +46,8 @@ import org.apache.calcite.util.mapping.Mappings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
+import org.apiguardian.api.API;
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
@@ -289,6 +291,7 @@ public abstract class Project extends SingleRel implements 
Hintable {
     return pw;
   }
 
+  @API(since = "1.24", status = API.Status.INTERNAL)
   protected boolean digestEquals0(Object obj) {
     if (this == obj) {
       return true;
@@ -304,6 +307,7 @@ public abstract class Project extends SingleRel implements 
Hintable {
         && getRowType().equalsSansFieldNames(o.getRowType());
   }
 
+  @API(since = "1.24", status = API.Status.INTERNAL)
   protected int digestHash0() {
     return Objects.hash(traitSet, input, exps, hints);
   }
diff --git a/core/src/main/java/org/apache/calcite/rex/RexCall.java 
b/core/src/main/java/org/apache/calcite/rex/RexCall.java
index 701df4d..e604820 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexCall.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexCall.java
@@ -333,7 +333,6 @@ public class RexCall extends RexNode {
 
   @Override public int hashCode() {
     if (hash == 0) {
-      assert digest == null;
       hash = Objects.hash(op, operands);
     }
     return hash;

Reply via email to