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/01/30 12:07:01 UTC

calcite git commit: [CALCITE-1589] Druid adapter: timeseries query shows all days, even if no data

Repository: calcite
Updated Branches:
  refs/heads/master bc232c269 -> 0187cfc53


[CALCITE-1589] Druid adapter: timeseries query shows all days, even if no data

Close apache/calcite#358


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/0187cfc5
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/0187cfc5
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/0187cfc5

Branch: refs/heads/master
Commit: 0187cfc53aec4b1d472baebdc899038e5c970b7b
Parents: bc232c2
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Fri Jan 20 15:07:15 2017 +0000
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Mon Jan 30 12:05:26 2017 +0000

----------------------------------------------------------------------
 .../calcite/adapter/druid/DruidQuery.java       |  6 ++++
 .../org/apache/calcite/test/DruidAdapterIT.java | 36 ++++++++++++++++----
 2 files changed, 36 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/0187cfc5/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
index 5a40849..df2dbd8 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
@@ -576,6 +576,12 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
         writeFieldIf(generator, "postAggregations", null);
         writeField(generator, "intervals", intervals);
 
+        generator.writeFieldName("context");
+        // The following field is necessary to conform with SQL semantics (CALCITE-1589)
+        generator.writeStartObject();
+        generator.writeBooleanField("skipEmptyBuckets", true);
+        generator.writeEndObject();
+
         generator.writeEndObject();
         break;
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/0187cfc5/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 ea156f4..3c7a7c8 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -185,7 +185,8 @@ public class DruidAdapterIT {
     final String druidQuery = "{'queryType':'timeseries',"
         + "'dataSource':'wikiticker','descending':false,'granularity':'day',"
         + "'aggregations':[{'type':'longSum','name':'EXPR$0','fieldName':'added'}],"
-        + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z']}";
+        + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
     sql(sql, WIKI_AUTO2)
         .explainContains(explain)
         .queryContains(druidChecker(druidQuery));
@@ -223,7 +224,8 @@ public class DruidAdapterIT {
     final String druidQuery = "{'queryType':'timeseries',"
         + "'dataSource':'wikiticker','descending':false,'granularity':'day',"
         + "'aggregations':[{'type':'longSum','name':'EXPR$1','fieldName':'added'}],"
-        + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z']}";
+        + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
     sql(sql, WIKI_AUTO2)
         .returnsUnordered("day=2015-09-12 00:00:00; EXPR$1=9385573")
         .explainContains(explain)
@@ -256,6 +258,24 @@ public class DruidAdapterIT {
         .queryContains(druidChecker(druidQuery));
   }
 
+  @Test public void testSkipEmptyBuckets() {
+    final String sql = "select floor(\"__time\" to SECOND) as \"second\", sum(\"added\")\n"
+        + "from \"wikiticker\"\n"
+        + "where \"page\" = 'Jeremy Corbyn'\n"
+        + "group by floor(\"__time\" to SECOND)";
+    final String druidQuery = "{'queryType':'timeseries',"
+        + "'dataSource':'wikiticker','descending':false,'granularity':'second',"
+        + "'filter':{'type':'selector','dimension':'page','value':'Jeremy Corbyn'},"
+        + "'aggregations':[{'type':'longSum','name':'EXPR$1','fieldName':'added'}],"
+        + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
+    sql(sql, WIKI_AUTO2)
+        .limit(1)
+        // Result without 'skipEmptyBuckets':true => "second=2015-09-12 00:46:58; EXPR$1=0"
+        .returnsUnordered("second=2015-09-12 01:20:19; EXPR$1=1075")
+        .queryContains(druidChecker(druidQuery));
+  }
+
   private CalciteAssert.AssertQuery checkSelectDistinctWiki(URL url, String tableName) {
     final String sql = "select distinct \"countryName\"\n"
         + "from \"" + tableName + "\"\n"
@@ -768,7 +788,8 @@ public class DruidAdapterIT {
     final String druidQuery = "{'queryType':'timeseries','dataSource':'foodmart',"
         + "'descending':false,'granularity':'all',"
         + "'aggregations':[{'type':'count','name':'EXPR$0'}],"
-        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
+        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
     final String explain = "PLAN=EnumerableInterpreter\n"
         + "  DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[]], groups=[{}], aggs=[[COUNT()]])";
     final String sql = "select count(*) from \"foodmart\"";
@@ -882,7 +903,8 @@ public class DruidAdapterIT {
         + "'descending':false,'granularity':'month',"
         + "'aggregations':[{'type':'longSum','name':'S','fieldName':'unit_sales'},"
         + "{'type':'count','name':'C','fieldName':'store_sqft'}],"
-        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
+        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
     sql(sql)
         .limit(3)
         .returnsUnordered("S=20957; C=6844", "S=21628; C=7033", "S=23706; C=7710")
@@ -952,7 +974,8 @@ public class DruidAdapterIT {
         + "'descending':false,'granularity':'day',"
         + "'aggregations':[{'type':'longSum','name':'S','fieldName':'unit_sales'},"
         + "{'type':'count','name':'C','fieldName':'store_sqft'}],"
-        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
+        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
     sql(sql)
         .limit(3)
         .returnsUnordered("S=348; C=117", "S=589; C=189", "S=635; C=206")
@@ -970,7 +993,8 @@ public class DruidAdapterIT {
         + "'descending':false,'granularity':'month',"
         + "'aggregations':[{'type':'longSum','name':'S','fieldName':'unit_sales'},"
         + "{'type':'count','name':'C','fieldName':'store_sqft'}],"
-        + "'intervals':['1996-01-01T00:00:00.000Z/1998-01-01T00:00:00.000Z']}";
+        + "'intervals':['1996-01-01T00:00:00.000Z/1998-01-01T00:00:00.000Z'],"
+        + "'context':{'skipEmptyBuckets':true}}";
     sql(sql)
         .limit(3)
         .returnsUnordered("S=20957; C=6844", "S=21628; C=7033", "S=23706; C=7710")