From 3c1488d23311c6171540b6427470c8f6862d8244 Mon Sep 17 00:00:00 2001 From: Will Noble Date: Wed, 3 Nov 2021 15:18:57 -0700 Subject: [PATCH] Add recursive digest helper method --- .../org/apache/calcite/plan/RelOptNode.java | 9 ++++++++ .../apache/calcite/plan/hep/HepRelVertex.java | 6 +++++ .../java/org/apache/calcite/rel/RelNode.java | 22 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptNode.java b/core/src/main/java/org/apache/calcite/plan/RelOptNode.java index c21f745d4ea..0171ccfaccb 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptNode.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptNode.java @@ -49,6 +49,15 @@ public interface RelOptNode { */ String getDigest(); + /** + * Like {@link #getDigest()} but describes this relational expression as well as all of it's + * inputs, with each digest separated by newlines and children indented according to depth. + * This is mainly useful for visual comparisons of rel node trees while debugging. + * + * @return Digest string of this {@code RelNode}, with input digests indented recursively underneath + */ + String getDigestRecursive(); + /** * Retrieves this RelNode's traits. Note that although the RelTraitSet * returned is modifiable, it must not be modified during 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 96d5f68856e..d4077e96dbf 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 @@ -114,4 +114,10 @@ public RelNode getCurrentRel() { @Override public String getDigest() { return "HepRelVertex(" + currentRel + ')'; } + + @Override public String getDigestRecursive() { + // For the purposes of the recursive digest (which is really only intended for debugging), + // pretend vertices don't exist. + return currentRel.getDigestRecursive(); + } } diff --git a/core/src/main/java/org/apache/calcite/rel/RelNode.java b/core/src/main/java/org/apache/calcite/rel/RelNode.java index 21f6586cc2f..78536e40d8a 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelNode.java +++ b/core/src/main/java/org/apache/calcite/rel/RelNode.java @@ -270,6 +270,28 @@ default String explain() { return getRelDigest().toString(); } + /** + * Returns a digest string of this {@code RelNode}, as well as the digests of all its input rel + * nodes as an indented tree, useful for visual debugging. + * + *

Each call creates many new digest strings, + * so don't forget to cache the result if necessary. + * + * @return Digest string of this {@code RelNode} and all it's direct or indirect inputs. + * + * @see #getDigest() + */ + @Override default String getDigestRecursive() { + final String indentedNewline = "\n "; + final StringBuilder builder = new StringBuilder(); + builder.append(getDigest()); + for (RelNode input: getInputs()) { + builder.append(indentedNewline); + builder.append(input.getDigestRecursive().replace("\n", indentedNewline)); + } + return builder.toString(); + } + /** * Returns a digest of this {@code RelNode}. *