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