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) {