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 <[email protected]> Authored: Wed Nov 15 13:05:56 2017 -0800 Committer: Jesus Camacho Rodriguez <[email protected]> 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() {
