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 97d6895  [CALCITE-3295] Add aggregate call name in serialized json 
string for relnode (Wang Yanlin)
97d6895 is described below

commit 97d68952d467540cddddbe8350f706028001dfbf
Author: yanzhi <[email protected]>
AuthorDate: Mon Aug 26 20:45:16 2019 +0800

    [CALCITE-3295] Add aggregate call name in serialized json string for 
relnode (Wang Yanlin)
    
    Close #1415
---
 .../apache/calcite/rel/externalize/RelJson.java    |  1 +
 .../calcite/rel/externalize/RelJsonReader.java     |  3 +-
 .../org/apache/calcite/plan/RelWriterTest.java     | 90 +++++++++++++++++++++-
 3 files changed, 90 insertions(+), 4 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java 
b/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java
index c7fe76f..2b502df 100644
--- a/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java
+++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java
@@ -237,6 +237,7 @@ public class RelJson {
     map.put("type", toJson(node.getType()));
     map.put("distinct", node.isDistinct());
     map.put("operands", node.getArgList());
+    map.put("name", node.getName());
     return map;
   }
 
diff --git 
a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java 
b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
index e7a73a8..6ac696c 100644
--- a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
+++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
@@ -282,10 +282,11 @@ public class RelJsonReader {
     final Integer filterOperand = (Integer) jsonAggCall.get("filter");
     final RelDataType type =
         relJson.toType(cluster.getTypeFactory(), jsonAggCall.get("type"));
+    final String name = (String) jsonAggCall.get("name");
     return AggregateCall.create(aggregation, distinct, false, false, operands,
         filterOperand == null ? -1 : filterOperand,
         RelCollations.EMPTY,
-        type, null);
+        type, name);
   }
 
   private RelNode lookupInput(String jsonInput) {
diff --git a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java 
b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java
index 0e74702..690c372 100644
--- a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java
+++ b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java
@@ -122,7 +122,8 @@ public class RelWriterTest {
       + "          \"distinct\": true,\n"
       + "          \"operands\": [\n"
       + "            1\n"
-      + "          ]\n"
+      + "          ],\n"
+      + "          \"name\": \"c\"\n"
       + "        },\n"
       + "        {\n"
       + "          \"agg\": {\n"
@@ -135,7 +136,8 @@ public class RelWriterTest {
       + "            \"nullable\": false\n"
       + "          },\n"
       + "          \"distinct\": false,\n"
-      + "          \"operands\": []\n"
+      + "          \"operands\": [],\n"
+      + "          \"name\": \"d\"\n"
       + "        }\n"
       + "      ]\n"
       + "    }\n"
@@ -452,7 +454,7 @@ public class RelWriterTest {
         });
 
     assertThat(s,
-        isLinux("LogicalAggregate(group=[{0}], agg#0=[COUNT(DISTINCT $1)], 
agg#1=[COUNT()])\n"
+        isLinux("LogicalAggregate(group=[{0}], c=[COUNT(DISTINCT $1)], 
d=[COUNT()])\n"
             + "  LogicalFilter(condition=[=($1, 10)])\n"
             + "    LogicalTableScan(table=[[hr, emps]])\n"));
   }
@@ -581,6 +583,88 @@ public class RelWriterTest {
     assertThat(s, isLinux(expected));
   }
 
+  @Test public void testAggregateWithAlias() {
+    final FrameworkConfig config = RelBuilderTest.config().build();
+    final RelBuilder builder = RelBuilder.create(config);
+    // The rel node stands for sql: SELECT max(SAL) as max_sal from EMP group 
by JOB;
+    final RelNode rel = builder
+        .scan("EMP")
+        .project(
+            builder.field("JOB"),
+            builder.field("SAL"))
+        .aggregate(
+            builder.groupKey("JOB"),
+            builder.max("max_sal", builder.field("SAL")))
+        .project(
+            builder.field("max_sal"))
+        .build();
+    final RelJsonWriter jsonWriter = new RelJsonWriter();
+    rel.explain(jsonWriter);
+    final String relJson = jsonWriter.asString();
+    String s =
+        Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> {
+          final RelJsonReader reader = new RelJsonReader(
+              cluster, getSchema(rel), rootSchema);
+          RelNode node;
+          try {
+            node = reader.read(relJson);
+          } catch (IOException e) {
+            throw TestUtil.rethrow(e);
+          }
+          return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT,
+              SqlExplainLevel.EXPPLAN_ATTRIBUTES);
+        });
+    final String expected = ""
+        + "LogicalProject(max_sal=[$1])\n"
+        + "  LogicalAggregate(group=[{0}], max_sal=[MAX($1)])\n"
+        + "    LogicalProject(JOB=[$2], SAL=[$5])\n"
+        + "      LogicalTableScan(table=[[scott, EMP]])\n";
+
+    assertThat(s, isLinux(expected)
+    );
+  }
+
+  @Test public void testAggregateWithoutAlias() {
+    final FrameworkConfig config = RelBuilderTest.config().build();
+    final RelBuilder builder = RelBuilder.create(config);
+    // The rel node stands for sql: SELECT max(SAL) from EMP group by JOB;
+    final RelNode rel = builder
+        .scan("EMP")
+        .project(
+            builder.field("JOB"),
+            builder.field("SAL"))
+        .aggregate(
+            builder.groupKey("JOB"),
+            builder.max(builder.field("SAL")))
+        .project(
+            builder.field(1))
+        .build();
+    final RelJsonWriter jsonWriter = new RelJsonWriter();
+    rel.explain(jsonWriter);
+    final String relJson = jsonWriter.asString();
+    String s =
+        Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> {
+          final RelJsonReader reader = new RelJsonReader(
+              cluster, getSchema(rel), rootSchema);
+          RelNode node;
+          try {
+            node = reader.read(relJson);
+          } catch (IOException e) {
+            throw TestUtil.rethrow(e);
+          }
+          return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT,
+              SqlExplainLevel.EXPPLAN_ATTRIBUTES);
+        });
+    final String expected = ""
+        + "LogicalProject($f1=[$1])\n"
+        + "  LogicalAggregate(group=[{0}], agg#0=[MAX($1)])\n"
+        + "    LogicalProject(JOB=[$2], SAL=[$5])\n"
+        + "      LogicalTableScan(table=[[scott, EMP]])\n";
+
+    assertThat(s, isLinux(expected)
+    );
+  }
+
   /** Returns the schema of a {@link org.apache.calcite.rel.core.TableScan}
    * in this plan, or null if there are no scans. */
   private RelOptSchema getSchema(RelNode rel) {

Reply via email to