Repository: calcite Updated Branches: refs/heads/master 830801b6e -> 20ade9d26
http://git-wip-us.apache.org/repos/asf/calcite/blob/20ade9d2/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 30e1438..efe59e8 100644 --- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java +++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java @@ -167,7 +167,7 @@ public class DruidAdapterIT { final String explain = "PLAN=" + "EnumerableInterpreter\n" + " DruidQuery(table=[[wiki, wiki]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[=($13, 'Jeremy Corbyn')], groups=[{5}], aggs=[[]])\n"; checkSelectDistinctWiki(WIKI, "wiki") .explainContains(explain); @@ -177,7 +177,7 @@ public class DruidAdapterIT { final String explain = "PLAN=" + "EnumerableInterpreter\n" + " DruidQuery(table=[[wiki, wiki]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[=($17, 'Jeremy Corbyn')], groups=[{7}], aggs=[[]])\n"; checkSelectDistinctWiki(WIKI_AUTO, "wiki") .explainContains(explain); @@ -194,14 +194,14 @@ public class DruidAdapterIT { final String explain = "PLAN=" + "EnumerableInterpreter\n" + " DruidQuery(table=[[wiki, wikiticker]], " - + "intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], " + + "intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], " + "filter=[=($17, 'Jeremy Corbyn')], groups=[{7}], aggs=[[]])\n"; final String druidQuery = "{'queryType':'groupBy'," + "'dataSource':'wikiticker','granularity':'all'," + "'dimensions':[{'type':'default','dimension':'countryName'}],'limitSpec':{'type':'default'}," + "'filter':{'type':'selector','dimension':'page','value':'Jeremy Corbyn'}," + "'aggregations':[{'type':'longSum','name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-01T00:00:00.000/3000-01-01T00:00:00.000']}"; + + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z']}"; sql(sql, WIKI_AUTO2) .returnsUnordered("countryName=United Kingdom", "countryName=null") @@ -221,11 +221,11 @@ public class DruidAdapterIT { final String explain = "PLAN=" + "EnumerableInterpreter\n" + " BindableProject(EXPR$0=[$1])\n" - + " DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], projects=[[FLOOR($0, FLAG(DAY)), $1]], groups=[{0}], aggs=[[SUM($1)]])\n"; + + " DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[FLOOR($0, FLAG(DAY)), $1]], groups=[{0}], aggs=[[SUM($1)]])\n"; 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.000/3000-01-01T00:00:00.000']," + + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql, WIKI_AUTO2) .explainContains(explain) @@ -239,10 +239,10 @@ public class DruidAdapterIT { + "from \"wikiticker\"\n" + "limit 1\n"; final String explain = - "DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], projects=[[$0]], fetch=[1])\n"; + "DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$0]], fetch=[1])\n"; final String druidQuery = "{'queryType':'select'," + "'dataSource':'wikiticker','descending':false," - + "'intervals':['1900-01-01T00:00:00.000/3000-01-01T00:00:00.000']," + + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z']," + "'dimensions':[],'metrics':[],'granularity':'all','pagingSpec':{'threshold':1,'fromNext':true}," + "'context':{'druid.query.fetch':true}}"; sql(sql, WIKI_AUTO2) @@ -259,11 +259,11 @@ public class DruidAdapterIT { + "from \"wikiticker\"\n" + "group by floor(\"__time\" to DAY)"; final String explain = - "DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], projects=[[FLOOR($0, FLAG(DAY)), $1]], groups=[{0}], aggs=[[SUM($1)]])\n"; + "DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[FLOOR($0, FLAG(DAY)), $1]], groups=[{0}], aggs=[[SUM($1)]])\n"; 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.000/3000-01-01T00:00:00.000']," + + "'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") @@ -282,7 +282,7 @@ public class DruidAdapterIT { final String explain = "PLAN=EnumerableInterpreter\n" + " BindableProject(s=[$2], page=[$0], day=[CAST($1):TIMESTAMP(0) NOT NULL])\n" + " DruidQuery(table=[[wiki, wikiticker]], " - + "intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], projects=[[$17, FLOOR" + + "intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$17, FLOOR" + "($0, FLAG(DAY)), $1]], groups=[{0, 1}], aggs=[[SUM($2)]], sort0=[2], dir0=[DESC])"; sql(sql, WIKI_AUTO2) .limit(1) @@ -304,7 +304,7 @@ public class DruidAdapterIT { + "'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.000/3000-01-01T00:00:00.000']," + + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql, WIKI_AUTO2) .limit(1) @@ -322,7 +322,7 @@ public class DruidAdapterIT { + "'dimensions':[{'type':'default','dimension':'countryName'}],'limitSpec':{'type':'default'}," + "'filter':{'type':'selector','dimension':'page','value':'Jeremy Corbyn'}," + "'aggregations':[{'type':'longSum','name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; return sql(sql, url) .returnsUnordered("countryName=United Kingdom", "countryName=null") @@ -338,11 +338,11 @@ public class DruidAdapterIT { + "from \"wikiticker\"\n" + "where \"__time\" < '2015-10-12 00:00:00 UTC'"; final String explain = "\n DruidQuery(table=[[wiki, wikiticker]], " - + "intervals=[[1900-01-01T00:00:00.000/2015-10-12T00:00:00.000]], " + + "intervals=[[1900-01-01T00:00:00.000Z/2015-10-12T00:00:00.000Z]], " + "projects=[[$0]])\n"; final String druidQuery = "{'queryType':'select'," + "'dataSource':'wikiticker','descending':false," - + "'intervals':['1900-01-01T00:00:00.000/2015-10-12T00:00:00.000']," + + "'intervals':['1900-01-01T00:00:00.000Z/2015-10-12T00:00:00.000Z']," + "'dimensions':[],'metrics':[],'granularity':'all'," + "'pagingSpec':{'threshold':16384,'fromNext':true}," + "'context':{'druid.query.fetch':false}}"; @@ -361,9 +361,9 @@ public class DruidAdapterIT { + "where \"__time\" < '2015-10-12 00:00:00 UTC')"; final String explain = "PLAN=" + "EnumerableInterpreter\n" - + " BindableProject(__time=[CAST($0):TIMESTAMP(0) NOT NULL)\n" + + " BindableProject(__time=[CAST($0):TIMESTAMP(0) NOT NULL])\n" + " DruidQuery(table=[[wiki, wikiticker]], " - + "intervals=[[1900-01-01T00:00:00.000/2015-10-12T00:00:00.000]], " + + "intervals=[[1900-01-01T00:00:00.000Z/2015-10-12T00:00:00.000Z]], " + "groups=[{0}], aggs=[[]])\n"; final String subDruidQuery = "{'queryType':'groupBy','dataSource':'wikiticker'," + "'granularity':'all','dimensions':[{'type':'extraction'," @@ -409,12 +409,12 @@ public class DruidAdapterIT { @Test public void testSelectDistinct() { final String explain = "PLAN=" + "EnumerableInterpreter\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{30}], aggs=[[]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{30}], aggs=[[]])"; final String sql = "select distinct \"state_province\" from \"foodmart\""; final String druidQuery = "{'queryType':'groupBy','dataSource':'foodmart','granularity':'all'," + "'dimensions':[{'type':'default','dimension':'state_province'}],'limitSpec':{'type':'default'}," + "'aggregations':[{'type':'longSum','name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sql) .returnsUnordered("state_province=CA", "state_province=OR", @@ -443,10 +443,10 @@ public class DruidAdapterIT { + "where \"product_id\" = 1020" + "group by \"store_sales\" ,\"product_id\" "; final String plan = "PLAN=EnumerableInterpreter\n BindableAggregate(group=[{0, 1}])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], filter=[=($1, 1020)]," + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=($1, 1020)]," + " projects=[[$90, $1]])\n"; final String druidQuery = "{'queryType':'select','dataSource':'foodmart','descending':false," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'filter':{'type':'selector','dimension':'product_id','value':'1020'}," + "'dimensions':['product_id'],'metrics':['store_sales'],'granularity':'all'," + "'pagingSpec':{'threshold':16384,'fromNext':true}," @@ -471,7 +471,7 @@ public class DruidAdapterIT { + "'dimension':'product_id','value':'1020'}," + "'aggregations':[{'type':'longSum','name':'dummy_agg'," + "'fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sql).queryContains(druidChecker(druidQuery)).returnsUnordered("product_id=1020"); } @@ -485,7 +485,7 @@ public class DruidAdapterIT { + "'limitSpec':{'type':'default'}," + "'filter':{'type':'selector','dimension':'product_id','value':'1020'}," + "'aggregations':[{'type':'longSum','name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sql) .returnsUnordered("id=1020") .queryContains(druidChecker(druidQuery)); @@ -517,7 +517,7 @@ public class DruidAdapterIT { @Test public void testSort() { final String explain = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$39, $30]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39, $30]], " + "groups=[{0, 1}], aggs=[[]], sort0=[1], sort1=[0], dir0=[ASC], dir1=[DESC])"; final String sql = "select distinct \"gender\", \"state_province\"\n" + "from \"foodmart\" order by 2, 1 desc"; @@ -538,7 +538,7 @@ public class DruidAdapterIT { + "'direction':'descending','dimensionOrder':'alphanumeric'}]}," + "'aggregations':[{'type':'longSum','name':'dummy_agg'," + "'fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}")) + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}")) .explainContains(explain); } @@ -546,7 +546,7 @@ public class DruidAdapterIT { final String explain = "PLAN=EnumerableInterpreter\n" + " BindableSort(sort0=[$1], sort1=[$0], dir0=[ASC], dir1=[DESC], offset=[2], fetch=[3])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$39, $30]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39, $30]], " + "groups=[{0, 1}], aggs=[[]], sort0=[1], sort1=[0], dir0=[ASC], dir1=[DESC])"; final String sql = "select distinct \"gender\", \"state_province\"\n" + "from \"foodmart\"\n" @@ -565,7 +565,7 @@ public class DruidAdapterIT { + "from \"foodmart\"\n" + "offset 2 fetch next 3 rows only"; final String druidQuery = "{'queryType':'select','dataSource':'foodmart'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'dimensions':['state_province','product_name'],'metrics':[],'granularity':'all'," + "'pagingSpec':{'threshold':16384,'fromNext':true},'context':{'druid.query.fetch':false}}"; sql(sql) @@ -577,7 +577,7 @@ public class DruidAdapterIT { final String sql = "select \"gender\", \"state_province\"\n" + "from \"foodmart\" fetch next 3 rows only"; final String druidQuery = "{'queryType':'select','dataSource':'foodmart'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'dimensions':['gender','state_province'],'metrics':[],'granularity':'all'," + "'pagingSpec':{'threshold':3,'fromNext':true},'context':{'druid.query.fetch':true}}"; sql(sql) @@ -593,10 +593,10 @@ public class DruidAdapterIT { + "{'type':'default','dimension':'state_province'}],'limitSpec':{'type':'default'," + "'limit':3,'columns':[]}," + "'aggregations':[{'type':'longSum','name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; final String explain = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$39, $30]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39, $30]], " + "groups=[{0, 1}], aggs=[[]], fetch=[3])"; sql(sql) .runs() @@ -620,10 +620,10 @@ public class DruidAdapterIT { + "'limitSpec':{'type':'default','limit':3,'columns':[{'dimension':'S'," + "'direction':'descending','dimensionOrder':'numeric'}]}," + "'aggregations':[{'type':'longSum','name':'S','fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; final String explain = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{2, 39}], aggs=[[SUM($89)]], sort0=[2], dir0=[DESC], fetch=[3])\n"; sql(sql) .runs() @@ -656,7 +656,7 @@ public class DruidAdapterIT { final String approxDruid = "{'queryType':'topN','dataSource':'foodmart','granularity':'all'," + "'dimension':{'type':'default','dimension':'brand_name'},'metric':'S'," + "'aggregations':[{'type':'longSum','name':'S','fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'threshold':3}"; final String exactDruid = "{'queryType':'groupBy','dataSource':'foodmart'," + "'granularity':'all','dimensions':[{'type':'default'," @@ -664,11 +664,11 @@ public class DruidAdapterIT { + "'columns':[{'dimension':'S','direction':'descending'," + "'dimensionOrder':'numeric'}]},'aggregations':[{'type':'longSum'," + "'name':'S','fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; final String druidQuery = approx ? approxDruid : exactDruid; final String explain = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{2}], aggs=[[SUM($89)]], sort0=[1], dir0=[DESC], fetch=[3])\n"; CalciteAssert.that() .enable(enabled()) @@ -698,7 +698,7 @@ public class DruidAdapterIT { + "order by s desc limit 30"; final String explain = " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$2, FLOOR" + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$2, FLOOR" + "($0, FLAG(DAY)), $89]], groups=[{0, 1}], aggs=[[SUM($2)]], sort0=[2], dir0=[DESC], " + "fetch=[30])"; sql(sql) @@ -736,9 +736,9 @@ public class DruidAdapterIT { + "'columns':[{'dimension':'S','direction':'descending'," + "'dimensionOrder':'numeric'}]},'aggregations':[{'type':'longSum'," + "'name':'S','fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; final String explain = "DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$2, FLOOR" + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$2, FLOOR" + "($0, FLAG(DAY)), $89]], groups=[{0, 1}], aggs=[[SUM($2)]], sort0=[2], dir0=[DESC], " + "fetch=[30])"; sql(sql) @@ -765,7 +765,7 @@ public class DruidAdapterIT { + "'dimension':'brand_name'},{'type':'extraction','dimension':'__time'," + "'outputName':'floor_day','extractionFn':{'type':'timeFormat'"; final String explain = " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$2, FLOOR" + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$2, FLOOR" + "($0, FLAG(DAY)), $89]], groups=[{0, 1}], aggs=[[SUM($2)]], sort0=[0], dir0=[ASC])"; sql(sql) .runs() @@ -783,7 +783,7 @@ public class DruidAdapterIT { + "where \"product_id\" BETWEEN '1500' AND '1502'\n" + "order by \"state_province\" desc, \"product_id\""; final String druidQuery = "{'queryType':'select','dataSource':'foodmart'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'filter':{'type':'and','fields':[" + "{'type':'bound','dimension':'product_id','lower':'1500','lowerStrict':false,'ordering':'lexicographic'}," + "{'type':'bound','dimension':'product_id','upper':'1502','upperStrict':false,'ordering':'lexicographic'}]}," @@ -816,7 +816,7 @@ public class DruidAdapterIT { + "where \"product_id\" BETWEEN 1500 AND 1502\n" + "order by \"state_province\" desc, \"product_id\""; final String druidQuery = "{'queryType':'select','dataSource':'foodmart'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'filter':{'type':'and','fields':[" + "{'type':'bound','dimension':'product_id','lower':'1500','lowerStrict':false,'ordering':'numeric'}," + "{'type':'bound','dimension':'product_id','upper':'1502','upperStrict':false,'ordering':'numeric'}]}," @@ -848,7 +848,7 @@ public class DruidAdapterIT { final String sql = "select \"product_name\" from \"foodmart\"\n" + "where \"product_id\" = -1"; final String druidQuery = "{'queryType':'select','dataSource':'foodmart'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'filter':{'type':'selector','dimension':'product_id','value':'-1'}," + "'dimensions':['product_name'],'metrics':[],'granularity':'all'," + "'pagingSpec':{'threshold':16384,'fromNext':true},'context':{'druid.query.fetch':false}}"; @@ -865,7 +865,7 @@ public class DruidAdapterIT { + "where cast(\"product_id\" as integer) - 1500 BETWEEN 0 AND 2\n" + "order by \"state_province\" desc, \"product_id\""; final String druidQuery = "{'queryType':'select','dataSource':'foodmart'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'dimensions':['product_id','product_name','state_province'],'metrics':[],'granularity':'all'," + "'pagingSpec':{'threshold':16384,'fromNext':true},'context':{'druid.query.fetch':false}}"; sql(sql) @@ -896,8 +896,8 @@ public class DruidAdapterIT { final String explain = "PLAN=" + "EnumerableInterpreter\n" + " BindableUnion(all=[true])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{39}], aggs=[[]])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{37}], aggs=[[]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{39}], aggs=[[]])\n" + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{37}], aggs=[[]])"; sql(sql) .explainContains(explain) .returnsUnordered( @@ -917,8 +917,8 @@ public class DruidAdapterIT { + "EnumerableInterpreter\n" + " BindableFilter(condition=[=($0, 'M')])\n" + " BindableUnion(all=[true])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{39}], aggs=[[]])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{37}], aggs=[[]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{39}], aggs=[[]])\n" + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{37}], aggs=[[]])"; sql(sql) .explainContains(explain) .returnsUnordered("gender=M", @@ -929,10 +929,10 @@ 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.000/2992-01-10T00:00:00.000']," + + "'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.000/2992-01-10T00:00:00.000]], projects=[[]], groups=[{}], aggs=[[COUNT()]])"; + + " 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\""; sql(sql) .returns("EXPR$0=86829\n") @@ -1009,7 +1009,7 @@ public class DruidAdapterIT { + "order by \"state_province\""; String explain = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{30}], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{30}], " + "aggs=[[COUNT()]], sort0=[0], dir0=[ASC])"; sql(sql) .limit(2) @@ -1072,7 +1072,7 @@ public class DruidAdapterIT { + " BindableAggregate(group=[{0}], S=[SUM($1)], C=[COUNT($2)])\n" + " BindableProject($f0=[FLOOR($0, FLAG(MONTH))], unit_sales=[$2], store_sqft=[$1])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$0, $71, $89]])"; + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$0, $71, $89]])"; sql(sql) .explainContains(explain) .returnsOrdered("S=21628; C=5957", @@ -1100,7 +1100,7 @@ public class DruidAdapterIT { + " BindableAggregate(group=[{0}], S=[SUM($1)], C=[COUNT($2)])\n" + " BindableProject($f0=[FLOOR($0, FLAG(MONTH))], unit_sales=[$2], store_sqft=[$1])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$0, $71, $89]])"; + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$0, $71, $89]])"; sql(sql) .returnsOrdered("M=1997-01-01 00:00:00; S=21628; C=5957", "M=1997-02-01 00:00:00; S=20957; C=5842", @@ -1147,7 +1147,7 @@ public class DruidAdapterIT { + "EnumerableCalc(expr#0..3=[{inputs}], S=[$t2], M=[$t3], P=[$t0])\n" + " EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$30, FLOOR" + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$30, FLOOR" + "($0, FLAG(MONTH)), $89]], groups=[{0, 1}], aggs=[[SUM($2), MAX($2)]], sort0=[2], " + "dir0=[DESC], fetch=[3])"; final String druidQueryPart1 = "{'queryType':'groupBy','dataSource':'foodmart'," @@ -1159,7 +1159,7 @@ public class DruidAdapterIT { + "'dimensionOrder':'numeric'}]},'aggregations':[{'type':'longSum'," + "'name':'S','fieldName':'unit_sales'},{'type':'longMax','name':'M'," + "'fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sql) .returnsUnordered("S=12399; M=6; P=WA", "S=12297; M=7; P=WA", @@ -1180,7 +1180,7 @@ public class DruidAdapterIT { final String explain = "PLAN=EnumerableInterpreter\n" + " BindableProject(S=[$2], M=[$3], P=[$0])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1997-01-01T00:00:00.000/1997-09-01T00:00:00.000]], projects=[[$30, FLOOR" + + "intervals=[[1997-01-01T00:00:00.000Z/1997-09-01T00:00:00.000Z]], projects=[[$30, FLOOR" + "($0, FLAG(DAY)), $89]], groups=[{0, 1}], aggs=[[SUM($2), MAX($2)]], sort0=[2], " + "dir0=[DESC], fetch=[6])"; final String druidQueryType = "{'queryType':'groupBy','dataSource':'foodmart'," @@ -1207,7 +1207,7 @@ public class DruidAdapterIT { + "EnumerableInterpreter\n" + " BindableSort(sort0=[$0], dir0=[ASC])\n" + " BindableFilter(condition=[>($1, 23000)])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{30}], aggs=[[COUNT()]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{30}], aggs=[[COUNT()]])"; sql(sql) .returnsOrdered("S=CA; C=24441", "S=WA; C=40778") @@ -1223,7 +1223,7 @@ public class DruidAdapterIT { final String explain = "PLAN=" + "EnumerableInterpreter\n" + " BindableProject(C=[$2], state_province=[$1], city=[$0])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{29, 30}], aggs=[[COUNT()]], sort0=[2], dir0=[DESC], fetch=[2])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{29, 30}], aggs=[[COUNT()]], sort0=[2], dir0=[DESC], fetch=[2])"; sql(sql) .returnsOrdered("C=7394; state_province=WA; city=Spokane", "C=3958; state_province=WA; city=Olympia") @@ -1244,14 +1244,14 @@ public class DruidAdapterIT { + " BindableProject(state_province=[$0], CDC=[FLOOR($1)])\n" + " BindableAggregate(group=[{1}], agg#0=[COUNT($0)])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{29, 30}], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{29, 30}], " + "aggs=[[]])"; final String druidQuery = "{'queryType':'groupBy','dataSource':'foodmart'," + "'granularity':'all','dimensions':[{'type':'default','dimension':'city'}," + "{'type':'default','dimension':'state_province'}]," + "'limitSpec':{'type':'default'},'aggregations':[{'type':'longSum'," + "'name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sql) .explainContains(explain) .queryContains(druidChecker(druidQuery)) @@ -1270,7 +1270,7 @@ public class DruidAdapterIT { + "EnumerableInterpreter\n" + " BindableProject(product_name=[$0], ZERO=[0])\n" + " BindableSort(sort0=[$0], dir0=[ASC])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$3]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$3]])"; sql(sql) .limit(2) .explainContains(explain) @@ -1294,9 +1294,9 @@ public class DruidAdapterIT { + "'dimension':'quarter','value':'Q2'},{'type':'selector','dimension':'quarter'," + "'value':'Q3'}]},{'type':'selector','dimension':'state_province','value':'WA'}]}," + "'aggregations':[{'type':'longSum','name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; final String explain = "PLAN=EnumerableInterpreter\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]]," + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]]," + " filter=[AND(=($3, 'High Top Dried Mushrooms')," + " OR(=($87, 'Q2')," + " =($87, 'Q3'))," @@ -1328,7 +1328,7 @@ public class DruidAdapterIT { final String druidQuery = "{'queryType':'select'," + "'dataSource':'foodmart'," + "'descending':false," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'filter':{'type':'and','fields':[" + "{'type':'selector','dimension':'product_name','value':'High Top Dried Mushrooms'}," + "{'type':'or','fields':[" @@ -1341,7 +1341,7 @@ public class DruidAdapterIT { + "'pagingSpec':{'threshold':16384,'fromNext':true},'context':{'druid.query.fetch':false}}"; final String explain = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[AND(=($3, 'High Top Dried Mushrooms'), " + "OR(=($87, 'Q2'), =($87, 'Q3')), =($30, 'WA'))], " + "projects=[[$30, $29, $3]])\n"; @@ -1378,7 +1378,7 @@ public class DruidAdapterIT { + "where extract(year from \"timestamp\") = 1997\n" + "and extract(month from \"timestamp\") in (4, 6)\n"; final String explain = "DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[AND(=(EXTRACT(FLAG(YEAR), $0), 1997), OR(=(EXTRACT(FLAG(MONTH), $0), 4), " + "=(EXTRACT(FLAG(MONTH), $0), 6)))], groups=[{}], aggs=[[COUNT()]])"; sql(sql) @@ -1391,7 +1391,7 @@ public class DruidAdapterIT { + "from \"foodmart\"\n" + "where 'High Top Dried Mushrooms' = \"product_name\""; final String explain = "EnumerableInterpreter\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], filter=[=('High Top Dried Mushrooms', $3)], projects=[[$30]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=('High Top Dried Mushrooms', $3)], projects=[[$30]])"; final String druidQuery = "'filter':{'type':'selector','dimension':'product_name'," + "'value':'High Top Dried Mushrooms'}"; sql(sql) @@ -1436,13 +1436,13 @@ public class DruidAdapterIT { + " BindableAggregate(group=[{0, 1}], agg#0=[COUNT()])\n" + " BindableProject(countryName=[$1], EXPR$1=[FLOOR(CAST($0):TIMESTAMP(0) NOT NULL, FLAG(DAY))])\n" + " BindableFilter(condition=[AND(>=(FLOOR($0, FLAG(DAY)), 1997-01-01 00:00:00), <(FLOOR($0, FLAG(DAY)), 1997-09-01 00:00:00))])\n" - + " DruidQuery(table=[[wiki, wiki]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$0, $5]])"; + + " DruidQuery(table=[[wiki, wiki]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$0, $5]])"; // NOTE: Druid query only has countryName as the dimension // being queried after project is pushed to druid query. String druidQuery = "{'queryType':'select'," + "'dataSource':'wikiticker'," + "'descending':false," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'dimensions':['countryName']," + "'metrics':[]," + "'granularity':'all'," @@ -1587,7 +1587,7 @@ public class DruidAdapterIT { + "'timeZone':'UTC','locale':'en-US'}}")) .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1997-01-01T00:00:00.001/1997-01-20T00:00:00.000]], " + + "intervals=[[1997-01-01T00:00:00.001Z/1997-01-20T00:00:00.000Z]], " + "filter=[=($1, 1016)], projects=[[EXTRACT(FLAG(DAY), $0), EXTRACT(FLAG(MONTH), $0), " + "EXTRACT(FLAG(YEAR), $0), $1]], groups=[{0, 1, 2, 3}], aggs=[[]])\n") .returnsUnordered("day=2; month=1; year=1997; product_id=1016", @@ -1620,7 +1620,7 @@ public class DruidAdapterIT { + "'timeZone':'UTC','locale':'en-US'}}")) .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1997-01-01T00:00:00.001/1997-01-20T00:00:00.000]], " + + "intervals=[[1997-01-01T00:00:00.001Z/1997-01-20T00:00:00.000Z]], " + "filter=[=($1, 1016)], projects=[[EXTRACT(FLAG(DAY), $0), EXTRACT(FLAG(MONTH), $0), " + "EXTRACT(FLAG(YEAR), $0), $1]], groups=[{0, 1, 2, 3}], aggs=[[]])\n") .returnsUnordered("EXPR$0=2; EXPR$1=1; EXPR$2=1997; product_id=1016", @@ -1646,7 +1646,7 @@ public class DruidAdapterIT { + "'timeZone':'UTC','locale':'en-US'}}")) .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1997-01-01T00:00:00.001/1997-01-20T00:00:00.000]], " + + "intervals=[[1997-01-01T00:00:00.001Z/1997-01-20T00:00:00.000Z]], " + "filter=[=($1, 1016)], projects=[[EXTRACT(FLAG(DAY), $0), $1]], " + "groups=[{0, 1}], aggs=[[]])\n") .returnsUnordered("EXPR$0=2; dayOfMonth=1016", "EXPR$0=10; dayOfMonth=1016", @@ -1669,12 +1669,12 @@ public class DruidAdapterIT { + "'extractionFn':{'type':'timeFormat','format':'yyyy','timeZone':'UTC'," + "'locale':'en-US'}}]},'aggregations':[{'type':'doubleSum'," + "'name':'EXPR$0','fieldName':'store_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql) .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[AND(>=(CAST($11):BIGINT, 8), <=(CAST($11):BIGINT, 10), " + "<(CAST($10):BIGINT, 15), =(EXTRACT(FLAG(YEAR), $0), 1997))], groups=[{}], " + "aggs=[[SUM($90)]])\n") @@ -1707,7 +1707,7 @@ public class DruidAdapterIT { + "'value':'11','extractionFn':{'type':'timeFormat','format':'M'," + "'timeZone':'UTC','locale':'en-US'}}]},'aggregations':[{'type':'longSum'," + "'name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}")) + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}")) .returnsUnordered("product_id=1549; EXPR$1=30; EXPR$2=11", "product_id=1553; EXPR$1=30; EXPR$2=11"); } @@ -1743,7 +1743,7 @@ public class DruidAdapterIT { + "'format':'yyyy','timeZone':'UTC','locale':'en-US'}}]}," + "'aggregations':[{'type':'longSum','name':'dummy_agg'," + "'fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}")) + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}")) .returnsUnordered("product_id=1549; EXPR$1=30; EXPR$2=11; EXPR$3=1997", "product_id=1553; EXPR$1=30; EXPR$2=11; EXPR$3=1997"); } @@ -1767,7 +1767,7 @@ public class DruidAdapterIT { + "'ordering':'numeric','extractionFn':{'type':'timeFormat','format':'M'," + "'timeZone':'UTC','locale':'en-US'}}]},'aggregations':[{'type':'longSum'," + "'name':'dummy_agg','fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sqlQuery) .returnsUnordered("product_id=1558; EXPR$1=10", "product_id=1558; EXPR$1=11", "product_id=1559; EXPR$1=11") @@ -1795,7 +1795,7 @@ public class DruidAdapterIT { + "'format':'M','timeZone':'UTC','locale':'en-US'}}]}]}," + "'aggregations':[{'type':'longSum','name':'dummy_agg'," + "'fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}")) + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}")) .returnsUnordered("product_id=1558; EXPR$1=10", "product_id=1558; EXPR$1=11", "product_id=1559; EXPR$1=11"); } @@ -1820,10 +1820,10 @@ public class DruidAdapterIT { + "'dimension':'product_id','lower':'1558','lowerStrict':false," + "'ordering':'numeric'},'aggregations':[{'type':'longSum','name':'S'," + "'fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}")) + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}")) .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[>=(CAST($1):BIGINT, 1558)], projects=[[EXTRACT(FLAG(MONTH), $0), $1, $89]], " + "groups=[{0, 1}], aggs=[[SUM($2)]], sort0=[0], sort1=[2], sort2=[1], " + "dir0=[ASC], dir1=[ASC], dir2=[ASC])"); @@ -1837,7 +1837,7 @@ public class DruidAdapterIT { + "order by \"month\" DESC"; sql(sql) .explainContains("DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[FLOOR($0, " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[FLOOR($0, " + "FLAG(MONTH))]], groups=[{0}], aggs=[[]], sort0=[0], dir0=[DESC])") .queryContains(druidChecker("'queryType':'timeseries'", "'descending':true")); } @@ -1851,7 +1851,7 @@ public class DruidAdapterIT { final String explain = " BindableSort(sort0=[$0], dir0=[DESC], fetch=[3])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "projects=[[FLOOR($0, FLAG(MONTH))]], groups=[{0}], aggs=[[]], " + "sort0=[0], dir0=[DESC])"; sql(sql).explainContains(explain) @@ -1869,7 +1869,7 @@ public class DruidAdapterIT { + " by y DESC, m ASC, s DESC, \"product_id\" LIMIT 3"; final String expectedPlan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[>=(CAST($1):BIGINT, 1558)], projects=[[EXTRACT(FLAG(YEAR), $0), " + "EXTRACT(FLAG(MONTH), $0), $1, $89]], groups=[{0, 1, 2}], aggs=[[SUM($3)]], sort0=[0], " + "sort1=[1], sort2=[3], sort3=[2], dir0=[DESC], " @@ -1891,7 +1891,7 @@ public class DruidAdapterIT { + "'dimension':'product_id','lower':'1558','lowerStrict':false," + "'ordering':'numeric'},'aggregations':[{'type':'longSum','name':'S'," + "'fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sqlQuery).explainContains(expectedPlan).queryContains(druidChecker(expectedDruidQuery)) .returnsOrdered("Y=1997; M=1; product_id=1558; S=6", "Y=1997; M=1; product_id=1559; S=6", "Y=1997; M=2; product_id=1558; S=24"); @@ -1905,7 +1905,7 @@ public class DruidAdapterIT { + " by s DESC, m DESC, \"product_id\" LIMIT 3"; final String expectedPlan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[>=(CAST($1):BIGINT, 1558)], projects=[[EXTRACT(FLAG(YEAR), $0), " + "EXTRACT(FLAG(MONTH), $0), $1, $89]], groups=[{0, 1, 2}], aggs=[[SUM($3)]], " + "sort0=[3], sort1=[1], sort2=[2], dir0=[DESC], dir1=[DESC], dir2=[ASC], fetch=[3])"; @@ -1925,7 +1925,7 @@ public class DruidAdapterIT { + "'dimension':'product_id','lower':'1558','lowerStrict':false," + "'ordering':'numeric'},'aggregations':[{'type':'longSum','name':'S'," + "'fieldName':'unit_sales'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sqlQuery).explainContains(expectedPlan).queryContains(druidChecker(expectedDruidQuery)) .returnsOrdered("Y=1997; M=12; product_id=1558; S=30", "Y=1997; M=3; product_id=1558; S=29", "Y=1997; M=5; product_id=1558; S=27"); @@ -1940,7 +1940,7 @@ public class DruidAdapterIT { + " BindableSort(sort0=[$1], dir0=[DESC])\n" + " BindableProject(C=[$1], S=[$2], EXPR$2=[CAST($0):TIMESTAMP(0) NOT NULL])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[FLOOR($0, " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[FLOOR($0, " + "FLAG(MONTH)), $89]], groups=[{0}], aggs=[[COUNT(), SUM($1)]])") .queryContains(druidChecker("'queryType':'timeseries'")) .returnsOrdered("C=8716; S=26796; EXPR$2=1997-12-01 00:00:00", @@ -2025,7 +2025,7 @@ public class DruidAdapterIT { + "'timeZone':'UTC','locale':'en-US'}}]}]}," + "'aggregations':[{'type':'longSum','name':'dummy_agg'," + "'fieldName':'dummy_agg'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}"; + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; sql(sql).returnsOrdered("EXPR$0=10\nEXPR$0=11").queryContains(druidChecker(druidQuery)); } @@ -2040,7 +2040,7 @@ public class DruidAdapterIT { + " BindableAggregate(group=[{0}])\n" + " BindableProject(EXPR$0=[EXTRACT(FLAG(CENTURY), $0)])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[=($1, 1558)], projects=[[$0]])\n"; sql(sql).explainContains(plan).queryContains(druidChecker("'queryType':'select'")) .returnsUnordered("EXPR$0=20"); @@ -2058,7 +2058,7 @@ public class DruidAdapterIT { + " BindableAggregate(group=[{0}])\n" + " BindableFilter(condition=[=($0, null)])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], projects=[[$1]])"; + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$1]])"; sql(sql).explainContains(plan); } @@ -2132,7 +2132,7 @@ public class DruidAdapterIT { + "name':'','fieldName':'$f2'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($90), SUM($91)]], post_projects=[[+($1, $2), $0]], " + "sort0=[0], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2151,7 +2151,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f2'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($90), SUM($91)]], post_projects=[[$0, /($1, $2)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2170,7 +2170,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f2'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($90), SUM($91)]], post_projects=[[$0, *($1, $2)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2189,7 +2189,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f2'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($90), SUM($91)]], post_projects=[[$0, -($1, $2)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2206,7 +2206,7 @@ public class DruidAdapterIT { String postAggString = "{'type':'constant','name':'','value':100.0}"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($90)]], post_projects=[[$0, +($1, 100)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2233,7 +2233,7 @@ public class DruidAdapterIT { + ":'','fieldName':'B'}]}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{63}], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{63}], " + "aggs=[[SUM($90), SUM($91), COUNT(), SUM($89)]], " + "post_projects=[[$0, *(-1, +(/(-($1, $2), *($3, 3)), $4))]], sort0=[1], dir0=[DESC])"; sql(sqlQuery, FOODMART) @@ -2255,7 +2255,7 @@ public class DruidAdapterIT { + "{'type':'hyperUniqueCardinality','name':'','fieldName':'$f2'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=" - + "[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{63}], "; + + "[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{63}], "; foodmartApprox(sqlQuery) .runs() .explainContains(plan) @@ -2279,7 +2279,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f3'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], filter=[AND(=("; + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(=("; sql(sql, FOODMART) .explainContains(plan) .queryContains(druidChecker(druidQuery)); @@ -2295,7 +2295,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f2'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($91), COUNT()]], post_projects=[[$0, /($1, $2)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2317,7 +2317,7 @@ public class DruidAdapterIT { + " BindableProject(store_state=[$0], A=[$1], B=[CASE(=($2, 0), " + "1.0, CAST($2):DECIMAL(19, 0))])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($90), SUM($91), SUM($89)]], " + "post_projects=[[$0, /($1, $2), $3]], sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2341,7 +2341,7 @@ public class DruidAdapterIT { + "'name':'','fieldName':'B'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], groups=[{63}], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{63}], " + "aggs=[[SUM($90), SUM($91)]], post_projects=[[$0, +($1, 100), -(+($1, 100), $2)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2360,7 +2360,7 @@ public class DruidAdapterIT { + "{'type':'constant','name':'','value':0.0}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($91)]], post_projects=[[$0, /($1, 0)]]"; sql(sqlQuery, FOODMART) .explainContains(plan) @@ -2380,7 +2380,7 @@ public class DruidAdapterIT { + "{'type':'constant','name':'','value':0.0}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($91)]], post_projects=[[$0, /(*(-1.0, $1), 0)]]"; sql(sqlQuery, FOODMART) .explainContains(plan) @@ -2400,7 +2400,7 @@ public class DruidAdapterIT { + "{'type':'constant','name':'','value':0.0}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[SUM($91)]], post_projects=[[$0, /(-($1, $1), 0)]], " + "sort0=[1], dir0=[DESC]"; sql(sqlQuery, FOODMART) @@ -2417,7 +2417,7 @@ public class DruidAdapterIT { + "order by a desc"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[COUNT()]], post_projects=[[$0, /(-($1, $1), 0)]]"; sql(sqlQuery, FOODMART) .explainContains(plan) @@ -2440,7 +2440,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f3'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{2, 63}], aggs=[[SUM($90), SUM($91)]], " + "post_projects=[[$1, $0, -($2, $3)]], sort0=[2], dir0=[ASC], fetch=[5]"; sql(sqlQuery, FOODMART) @@ -2468,7 +2468,7 @@ public class DruidAdapterIT { + "{'type':'fieldAccess','name':'','fieldName':'$f3'}]}]"; final String plan = "PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "projects=[[$63, $2, $90, $91]], " + "groups=[{0, 1}], aggs=[[SUM($2), SUM($3)]], " + "post_projects=[[$0, $1, +($2, $3)]], sort0=[1], sort1=[0], dir0=[ASC], dir1=[ASC]"; @@ -2514,8 +2514,8 @@ public class DruidAdapterIT { String expectedQuery = "{'queryType':'timeseries','dataSource':'foodmart','descending':false," + "'granularity':'all','filter':{'type':'bound','dimension':'the_year','lower':'1997'," + "'lowerStrict':false,'ordering':'numeric'},'aggregations':[{'type':'doubleSum','name'" - + ":'EXPR$0','fieldName':'store_sales'}],'intervals':['1900-01-09T00:00:00.000/2992-01" - + "-10T00:00:00.000'],'context':{'skipEmptyBuckets':true}}"; + + ":'EXPR$0','fieldName':'store_sales'}],'intervals':['1900-01-09T00:00:00.000Z/2992-01" + + "-10T00:00:00.000Z'],'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); } @@ -2529,7 +2529,7 @@ public class DruidAdapterIT { String sql = "select sum(\"store_sales\") filter (where 1 = 1) from \"foodmart\""; String expectedQuery = "{'queryType':'timeseries','dataSource':'foodmart','descending':false," + "'granularity':'all','aggregations':[{'type':'doubleSum','name':'EXPR$0','fieldName':" - + "'store_sales'}],'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'store_sales'}],'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); @@ -2547,7 +2547,7 @@ public class DruidAdapterIT { String expectedQuery = "{'queryType':'timeseries','dataSource':'foodmart','descending':false," + "'granularity':'all','aggregations':[{'type':'doubleSum','name':'EXPR$0','fieldName':" + "'store_sales'},{'type':'doubleSum','name':'EXPR$1','fieldName':'store_cost'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); @@ -2569,7 +2569,7 @@ public class DruidAdapterIT { + ":'store_sales'},{'type':'filtered','filter':{'type':'selector','dimension':" + "'store_state','value':'CA'},'aggregator':{'type':'doubleSum','name':'EXPR$1'," + "'fieldName':'store_cost'}}],'intervals':" - + "['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); @@ -2589,7 +2589,7 @@ public class DruidAdapterIT { + "'value':'Seattle'},'aggregations':[{'type':'doubleSum','name':'EXPR$0'," + "'fieldName':'store_sales'},{'type':'doubleSum','name':'EXPR$1'," + "'fieldName':'store_cost'}],'intervals':" - + "['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); @@ -2618,7 +2618,7 @@ public class DruidAdapterIT { " BindableAggregate(group=[{}], EXPR$0=[SUM($0) FILTER $1])\n" + " BindableProject(store_sales=[$0], $f1=[false])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " // Make sure the original filter is still there + "filter=[=($62, 'Seattle')], projects=[[$90]])"; @@ -2638,7 +2638,7 @@ public class DruidAdapterIT { String expectedQuery = "{'queryType':'timeseries','dataSource':'foodmart','descending':false," + "'granularity':'all','filter':{'type':'selector','dimension':'store_city','value':" + "'Seattle'},'aggregations':[{'type':'doubleSum','name':'EXPR$0','fieldName':" - + "'store_sales'}],'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'store_sales'}],'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql) @@ -2657,7 +2657,7 @@ public class DruidAdapterIT { + "'granularity':'all','aggregations':[{'type':'filtered','filter':{'type':'selector'," + "'dimension':'store_state','value':'CA'},'aggregator':{'type':'doubleSum','name':" + "'EXPR$0','fieldName':'store_sales'}},{'type':'doubleSum','name':'EXPR$1','fieldName'" - + ":'store_cost'}],'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + ":'store_cost'}],'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); @@ -2677,7 +2677,7 @@ public class DruidAdapterIT { + "'filter':{'type':'selector','dimension':'store_state','value':'CA'},'aggregator':{" + "'type':'doubleSum','name':'EXPR$0','fieldName':'store_sales'}},{'type':'doubleSum'," + "'name':'EXPR$1','fieldName':'store_cost'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql).queryContains(druidChecker(expectedQuery)); @@ -2700,7 +2700,7 @@ public class DruidAdapterIT { + "'EXPR$0','fieldName':'store_sales'}},{'type':'filtered','filter':{'type':'selector'," + "'dimension':'store_state','value':'WA'},'aggregator':{'type':'doubleSum','name':" + "'EXPR$1','fieldName':'store_sales'}}],'intervals':" - + "['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql) @@ -2726,7 +2726,7 @@ public class DruidAdapterIT { + "'EXPR$0','fieldName':'store_sales'}},{'type':'filtered','filter':{'type':'selector'," + "'dimension':'store_state','value':'WA'},'aggregator':{'type':'doubleSum','name':" + "'EXPR$1','fieldName':'store_sales'}}],'intervals':" - + "['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql) @@ -2754,7 +2754,7 @@ public class DruidAdapterIT { + "'store_state','value':'CA'},{'type':'selector','dimension':'brand_name','value':" + "'Super'}]},'aggregations':[{'type':'doubleSum','name':'EXPR$0','fieldName':" + "'store_sales'},{'type':'doubleSum','name':'EXPR$1','fieldName':'store_cost'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql) @@ -2887,7 +2887,7 @@ public class DruidAdapterIT { final String plan2 = "PLAN=EnumerableInterpreter\n" + " BindableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n" + " DruidQuery(table=[[wiki, wikiticker]], " - + "intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], projects=[[$7]])"; + + "intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$7]])"; sql(sql2, WIKI_AUTO2) .returnsUnordered("EXPR$0=3799") .explainContains(plan2); @@ -2896,7 +2896,7 @@ public class DruidAdapterIT { final String plan3 = "PLAN=EnumerableInterpreter\n" + " BindableAggregate(group=[{}], EXPR$0=[COUNT()], EXPR$1=[COUNT($0)])\n" + " DruidQuery(table=[[wiki, wikiticker]], " - + "intervals=[[1900-01-01T00:00:00.000/3000-01-01T00:00:00.000]], projects=[[$7]])"; + + "intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$7]])"; sql(sql3, WIKI_AUTO2) .explainContains(plan3); } @@ -2931,7 +2931,7 @@ public class DruidAdapterIT { @Test public void testDistinctCountWhenApproxResultsAccepted() { String sql = "select count(distinct \"store_state\") from \"foodmart\""; String expectedSubExplain = "DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00" - + ":00:00.000/2992-01-10T00:00:00.000]], groups=[{}], aggs=[[COUNT(DISTINCT $63)]])"; + + ":00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT(DISTINCT $63)]])"; String expectedAggregate = "{'type':'cardinality','name':" + "'EXPR$0','fieldNames':['store_state']}"; @@ -2946,7 +2946,7 @@ public class DruidAdapterIT { String sql = "select count(distinct \"store_state\") from \"foodmart\""; String expectedSubExplain = " BindableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n" + " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "groups=[{63}], aggs=[[]])"; testCountWithApproxDistinct(false, sql, expectedSubExplain); @@ -2972,8 +2972,8 @@ public class DruidAdapterIT { String sql = "select \"brand_name\", count(\"store_sales\") from \"foodmart\" " + "group by \"brand_name\""; String expectedSubExplain = " BindableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/" - + "2992-01-10T00:00:00.000]], projects=[[$2, $90]])"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" + + "2992-01-10T00:00:00.000Z]], projects=[[$2, $90]])"; testCountWithApproxDistinct(true, sql, expectedSubExplain); testCountWithApproxDistinct(false, sql, expectedSubExplain); @@ -2985,7 +2985,7 @@ public class DruidAdapterIT { @Test public void testCountStar() { String sql = "select count(*) from \"foodmart\""; String expectedSubExplain = " DruidQuery(table=[[foodmart, foodmart]], " - + "intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "projects=[[]], groups=[{}], aggs=[[COUNT()]])"; sql(sql).explainContains(expectedSubExplain); @@ -3000,8 +3000,8 @@ public class DruidAdapterIT { + "(select \"unit_sales\" as \"A\", \"store_state\" as \"B\" from \"foodmart\") " + "group by \"B\""; String expectedSubExplain = " BindableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000" - + "/2992-01-10T00:00:00.000]], projects=[[$63, $89]])\n"; + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z" + + "/2992-01-10T00:00:00.000Z]], projects=[[$63, $89]])\n"; testCountWithApproxDistinct(true, sql, expectedSubExplain); testCountWithApproxDistinct(false, sql, expectedSubExplain); @@ -3013,7 +3013,7 @@ public class DruidAdapterIT { + "group by \"B\""; String expectedSubExplain = " BindableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:" - + "00.000/2992-01-10T00:00:00.000]], projects=[[$63, $89]], groups=[{0, 1}], " + + "00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0, 1}], " + "aggs=[[]])"; testCountWithApproxDistinct(true, sql, expectedSubExplain); @@ -3051,7 +3051,7 @@ public class DruidAdapterIT { druidChecker("{'queryType':'timeseries','dataSource':" + "'foodmart','descending':false,'granularity':'all','aggregations':[{'type':" + "'thetaSketch','name':'EXPR$0','fieldName':'customer_id_ts'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}")) .returnsUnordered("EXPR$0=5581"); @@ -3177,7 +3177,7 @@ public class DruidAdapterIT { + "'granularity':'all','dimensions':[{'type':'default','dimension':" + "'customer_id'}],'limitSpec':{'type':'default'},'aggregations':[{" + "'type':'cardinality','name':'EXPR$0','fieldNames':['the_month']}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']}")); + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}")); } /** @@ -3190,7 +3190,7 @@ public class DruidAdapterIT { // make sure user_id column is not present .queryContains( druidChecker("{'queryType':'select','dataSource':'wikiticker'," - + "'descending':false,'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'descending':false,'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'dimensions':['channel','cityName','comment','countryIsoCode','countryName'," + "'isAnonymous','isMinor','isNew','isRobot','isUnpatrolled','metroCode'," + "'namespace','page','regionIsoCode','regionName'],'metrics':['count','added'," @@ -3212,14 +3212,14 @@ public class DruidAdapterIT { + "from \"foodmart\" " + "where cast(\"product_id\" as double) = 1016.0"; final String plan = "PLAN=EnumerableInterpreter\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[=(CAST($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])"; final String druidQuery = "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," + "'filter':{'type':'bound','dimension':'product_id','lower':'1016.0'," + "'lowerStrict':false,'upper':'1016.0','upperStrict':false,'ordering':'numeric'}," + "'aggregations':[{'type':'doubleSum','name':'A','fieldName':'store_cost'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sqlQuery, FOODMART) .explainContains(plan) @@ -3239,7 +3239,7 @@ public class DruidAdapterIT { + "from \"foodmart\" " + "where cast(\"product_id\" as double) <> 1016.0"; final String plan = "PLAN=EnumerableInterpreter\n" - + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000/2992-01-10T00:00:00.000]], " + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], " + "filter=[<>(CAST($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])"; final String druidQuery = "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," @@ -3247,7 +3247,7 @@ public class DruidAdapterIT { + "'lowerStrict':true,'ordering':'numeric'},{'type':'bound','dimension':'product_id'," + "'upper':'1016.0','upperStrict':true,'ordering':'numeric'}]}," + "'aggregations':[{'type':'doubleSum','name':'A','fieldName':'store_cost'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sqlQuery, FOODMART) .explainContains(plan) @@ -3270,7 +3270,7 @@ public class DruidAdapterIT { "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," + "'filter':{'type':'selector','dimension':'product_id','value':null}," + "'aggregations':[{'type':'count','name':'C'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql, FOODMART) .queryContains(druidChecker(druidQuery)) @@ -3285,7 +3285,7 @@ public class DruidAdapterIT { "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," + "'filter':{'type':'not','field':{'type':'selector','dimension':'product_id','value':null}}," + "'aggregations':[{'type':'count','name':'C'}]," - + "'intervals':['1900-01-09T00:00:00.000/2992-01-10T00:00:00.000']," + + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']," + "'context':{'skipEmptyBuckets':true}}"; sql(sql, FOODMART) .queryContains(druidChecker(druidQuery)) http://git-wip-us.apache.org/repos/asf/calcite/blob/20ade9d2/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java ---------------------------------------------------------------------- diff --git a/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java b/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java index f993a53..58f5b9e 100644 --- a/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java +++ b/druid/src/test/java/org/apache/calcite/test/DruidDateRangeRulesTest.java @@ -17,7 +17,6 @@ package org.apache.calcite.test; import org.apache.calcite.adapter.druid.DruidDateTimeUtils; -import org.apache.calcite.adapter.druid.LocalInterval; import org.apache.calcite.avatica.util.TimeUnitRange; import org.apache.calcite.rel.rules.DateRangeRules; import org.apache.calcite.rex.RexNode; @@ -31,6 +30,7 @@ import com.google.common.collect.Ordering; import com.google.common.collect.RangeSet; import org.hamcrest.Matcher; +import org.joda.time.Interval; import org.junit.Test; import java.util.Calendar; @@ -50,7 +50,7 @@ public class DruidDateRangeRulesTest { // AND(>=($8, 2014-01-01), <($8, 2015-01-01), >=($8, 2014-06-01), <($8, 2014-07-01)) checkDateRange(f, f.and(f.eq(f.exYear, f.literal(2014)), f.eq(f.exMonth, f.literal(6))), - is("[2014-06-01T00:00:00.000/2014-07-01T00:00:00.000]")); + is("[2014-06-01T00:00:00.000Z/2014-07-01T00:00:00.000Z]")); } @Test public void testExtractYearAndDayFromDateColumn() { @@ -65,13 +65,13 @@ public class DruidDateRangeRulesTest { // AND(>=($8, 2010-12-31), <($8, 2011-01-01)))) checkDateRange(f, f.and(f.eq(f.exYear, f.literal(2010)), f.eq(f.exDay, f.literal(31))), - is("[2010-01-31T00:00:00.000/2010-02-01T00:00:00.000, " - + "2010-03-31T00:00:00.000/2010-04-01T00:00:00.000, " - + "2010-05-31T00:00:00.000/2010-06-01T00:00:00.000, " - + "2010-07-31T00:00:00.000/2010-08-01T00:00:00.000, " - + "2010-08-31T00:00:00.000/2010-09-01T00:00:00.000, " - + "2010-10-31T00:00:00.000/2010-11-01T00:00:00.000, " - + "2010-12-31T00:00:00.000/2011-01-01T00:00:00.000]")); + is("[2010-01-31T00:00:00.000Z/2010-02-01T00:00:00.000Z, " + + "2010-03-31T00:00:00.000Z/2010-04-01T00:00:00.000Z, " + + "2010-05-31T00:00:00.000Z/2010-06-01T00:00:00.000Z, " + + "2010-07-31T00:00:00.000Z/2010-08-01T00:00:00.000Z, " + + "2010-08-31T00:00:00.000Z/2010-09-01T00:00:00.000Z, " + + "2010-10-31T00:00:00.000Z/2010-11-01T00:00:00.000Z, " + + "2010-12-31T00:00:00.000Z/2011-01-01T00:00:00.000Z]")); } @Test public void testExtractYearMonthDayFromDateColumn() { @@ -92,8 +92,8 @@ public class DruidDateRangeRulesTest { checkDateRange(f, f.and(f.gt(f.exYear, f.literal(2010)), f.lt(f.exYear, f.literal(2020)), f.eq(f.exMonth, f.literal(2)), f.eq(f.exDay, f.literal(29))), - is("[2012-02-29T00:00:00.000/2012-03-01T00:00:00.000, " - + "2016-02-29T00:00:00.000/2016-03-01T00:00:00.000]")); + is("[2012-02-29T00:00:00.000Z/2012-03-01T00:00:00.000Z, " + + "2016-02-29T00:00:00.000Z/2016-03-01T00:00:00.000Z]")); } @Test public void testExtractYearMonthDayFromTimestampColumn() { @@ -115,8 +115,8 @@ public class DruidDateRangeRulesTest { f.and(f.gt(f.exYear, f.literal(2010)), f.lt(f.exYear, f.literal(2020)), f.eq(f.exMonth, f.literal(2)), f.eq(f.exDay, f.literal(29))), - is("[2012-02-29T00:00:00.000/2012-03-01T00:00:00.000, " - + "2016-02-29T00:00:00.000/2016-03-01T00:00:00.000]")); + is("[2012-02-29T00:00:00.000Z/2012-03-01T00:00:00.000Z, " + + "2016-02-29T00:00:00.000Z/2016-03-01T00:00:00.000Z]")); } /** Test case for @@ -137,7 +137,7 @@ public class DruidDateRangeRulesTest { f.and( f.ge(f.dt, f.cast(f.timeStampDataType, f.timestampLiteral(from))), f.lt(f.dt, f.cast(f.timeStampDataType, f.timestampLiteral(to)))), - is("[2010-01-01T00:00:00.000/2011-01-01T00:00:00.000]")); + is("[2010-01-01T00:00:00.000Z/2011-01-01T00:00:00.000Z]")); } // For testFilterWithCast we need to no simplify the expression, which would @@ -157,7 +157,7 @@ public class DruidDateRangeRulesTest { new DateRangeRules.ExtractShuttle(f.rexBuilder, timeUnit, operandRanges)); } - final List<LocalInterval> intervals = + final List<Interval> intervals = DruidDateTimeUtils.createInterval(e, "UTC"); assertThat(intervals, notNullValue()); assertThat(intervals.toString(), intervalMatcher); @@ -177,7 +177,7 @@ public class DruidDateRangeRulesTest { operandRanges)); } final RexNode e2 = f.simplify.simplify(e); - List<LocalInterval> intervals = + List<Interval> intervals = DruidDateTimeUtils.createInterval(e2, "UTC"); if (intervals == null) { throw new AssertionError("null interval"); http://git-wip-us.apache.org/repos/asf/calcite/blob/20ade9d2/druid/src/test/resources/druid-foodmart-model.json ---------------------------------------------------------------------- diff --git a/druid/src/test/resources/druid-foodmart-model.json b/druid/src/test/resources/druid-foodmart-model.json index 7f776d9..dfca063 100644 --- a/druid/src/test/resources/druid-foodmart-model.json +++ b/druid/src/test/resources/druid-foodmart-model.json @@ -31,7 +31,7 @@ "name": "foodmart", "factory": "org.apache.calcite.adapter.druid.DruidTableFactory", "operand": { - "interval": "1900-01-09T00:00:00.000/2992-01-10T00:00:00.000", + "interval": "1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z", "timestampColumn": "timestamp", "dimensions": [ "product_id", http://git-wip-us.apache.org/repos/asf/calcite/blob/20ade9d2/druid/src/test/resources/druid-wiki-model.json ---------------------------------------------------------------------- diff --git a/druid/src/test/resources/druid-wiki-model.json b/druid/src/test/resources/druid-wiki-model.json index ce93cda..abfe424 100644 --- a/druid/src/test/resources/druid-wiki-model.json +++ b/druid/src/test/resources/druid-wiki-model.json @@ -32,7 +32,7 @@ "factory": "org.apache.calcite.adapter.druid.DruidTableFactory", "operand": { "dataSource": "wikiticker", - "interval": "1900-01-09T00:00:00.000/2992-01-10T00:00:00.000", + "interval": "1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z", "timestampColumn": "time", "dimensions": [ "channel", http://git-wip-us.apache.org/repos/asf/calcite/blob/20ade9d2/druid/src/test/resources/druid-wiki-no-columns-model.json ---------------------------------------------------------------------- diff --git a/druid/src/test/resources/druid-wiki-no-columns-model.json b/druid/src/test/resources/druid-wiki-no-columns-model.json index 2125ae0..c9231c4 100644 --- a/druid/src/test/resources/druid-wiki-no-columns-model.json +++ b/druid/src/test/resources/druid-wiki-no-columns-model.json @@ -35,7 +35,7 @@ "factory": "org.apache.calcite.adapter.druid.DruidTableFactory", "operand": { "dataSource": "wikiticker", - "interval": "1900-01-09T00:00:00.000/2992-01-10T00:00:00.000", + "interval": "1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z", "timestampColumn": "time" } } http://git-wip-us.apache.org/repos/asf/calcite/blob/20ade9d2/site/_docs/druid_adapter.md ---------------------------------------------------------------------- diff --git a/site/_docs/druid_adapter.md b/site/_docs/druid_adapter.md index cd74d74..c81687b 100644 --- a/site/_docs/druid_adapter.md +++ b/site/_docs/druid_adapter.md @@ -60,7 +60,7 @@ A basic example of a model file is given below: "factory": "org.apache.calcite.adapter.druid.DruidTableFactory", "operand": { "dataSource": "wikiticker", - "interval": "1900-01-09T00:00:00.000/2992-01-10T00:00:00.000", + "interval": "1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z", "timestampColumn": "time", "dimensions": [ "channel", @@ -213,7 +213,7 @@ but with `dimensions`, `metrics` and `timestampColumn` removed: "factory": "org.apache.calcite.adapter.druid.DruidTableFactory", "operand": { "dataSource": "wikiticker", - "interval": "1900-01-09T00:00:00.000/2992-01-10T00:00:00.000" + "interval": "1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z" } } ]
