You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2017/11/15 21:29:42 UTC
calcite git commit: [CALCITE-2050] Exception when pushing
postaggregates into Druid
Repository: calcite
Updated Branches:
refs/heads/master e2588bfb8 -> f7933c7cb
[CALCITE-2050] Exception when pushing postaggregates into Druid
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/f7933c7c
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/f7933c7c
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/f7933c7c
Branch: refs/heads/master
Commit: f7933c7cb340d5880b43abc00fbb13a6fe0ce827
Parents: e2588bf
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Wed Nov 15 13:05:56 2017 -0800
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Wed Nov 15 13:29:35 2017 -0800
----------------------------------------------------------------------
.../calcite/adapter/druid/DruidRules.java | 11 ++++----
.../org/apache/calcite/test/DruidAdapterIT.java | 29 ++++++++++++++++++--
2 files changed, 32 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/f7933c7c/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
index 6779ded..7e757e2 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
@@ -525,9 +525,8 @@ public class DruidRules {
}
Project innerProject = project.copy(project.getTraitSet(), Util.last(query.rels), innerRex,
typeBuilder.build());
- // When no input get visited, it means all project can be treated as post-aggregation.
- // Then the whole project can be get pushed in.
- if (visitor.inputPosReferenced.size() == 0) {
+ // If the whole project is pushed, we do not need to do anything else.
+ if (project.getNamedProjects().size() == nameMap.size()) {
return new Pair<>(innerProject, null);
}
// Build outer Project when some projects are left in outer project.
@@ -573,9 +572,9 @@ public class DruidRules {
final ImmutableMap.Builder<String, String> mapBuilder = ImmutableMap.builder();
int j = 0;
boolean ret = false;
- for (Pair namedProject : project.getNamedProjects()) {
- RexNode rex = (RexNode) namedProject.left;
- String name = (String) namedProject.right;
+ for (Pair<RexNode, String> namedProject : project.getNamedProjects()) {
+ RexNode rex = namedProject.left;
+ String name = namedProject.right;
// Find out the corresponding fieldName for DruidQuery to fetch result
// in DruidConnectionImpl, give specific name for post aggregator
if (rex instanceof RexCall) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/f7933c7c/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
----------------------------------------------------------------------
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
index efe59e8..49b442e 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -2266,7 +2266,6 @@ public class DruidAdapterIT {
final String sql = "SELECT \"store_state\", \"brand_name\", sum(\"store_sales\") - "
+ "sum(\"store_cost\") as a from \"foodmart\" where extract (week from \"timestamp\")"
+ " IN (10,11) and \"brand_name\"='Bird Call' group by \"store_state\", \"brand_name\"";
-
final String druidQuery = "'filter':{'type':'and','fields':[{'type':'selector','dimension'"
+ ":'brand_name','value':'Bird Call'},{'type':'or','fields':[{'type':'selector',"
+ "'dimension':'__time','value':'10','extractionFn':{'type':'timeFormat','format'"
@@ -2282,7 +2281,33 @@ public class DruidAdapterIT {
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(=(";
sql(sql, FOODMART)
.explainContains(plan)
- .queryContains(druidChecker(druidQuery));
+ .queryContains(druidChecker(druidQuery))
+ .returnsOrdered("store_state=CA; brand_name=Bird Call; A=34.364601135253906",
+ "store_state=OR; brand_name=Bird Call; A=39.16360282897949",
+ "store_state=WA; brand_name=Bird Call; A=53.74250030517578");
+ }
+
+ @Test public void testExtractFilterWorkWithPostAggregationsWithConstant() {
+ final String sql = "SELECT \"store_state\", 'Bird Call' as \"brand_name\", "
+ + "sum(\"store_sales\") - sum(\"store_cost\") as a from \"foodmart\" "
+ + "where extract (week from \"timestamp\")"
+ + " IN (10,11) and \"brand_name\"='Bird Call' group by \"store_state\"";
+ final String druidQuery = "'aggregations':[{'type':'doubleSum','name':'$f1','fieldName':"
+ + "'store_sales'},{'type':'doubleSum','name':'$f2','fieldName':'store_cost'}],"
+ + "'postAggregations':[{'type':'arithmetic','name':'postagg#0','fn':'-',"
+ + "'fields':[{'type':'fieldAccess','name':'','fieldName':'$f1'},{'type':'fieldAccess',"
+ + "'name':'','fieldName':'$f2'}]}],"
+ + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
+ final String plan = "PLAN=EnumerableInterpreter\n"
+ + " BindableProject(store_state=[$0], brand_name=['Bird Call'], A=[$1])\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], "
+ + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(=(";
+ sql(sql, FOODMART)
+ .explainContains(plan)
+ .queryContains(druidChecker(druidQuery))
+ .returnsOrdered("store_state=CA; brand_name=Bird Call; A=34.364601135253906",
+ "store_state=OR; brand_name=Bird Call; A=39.16360282897949",
+ "store_state=WA; brand_name=Bird Call; A=53.74250030517578");
}
@Test public void testSingleAverageFunction() {