Repository: calcite Updated Branches: refs/heads/master fb760a6f4 -> 6971a3065
[CALCITE-1983] Push EQUALS and NOT EQUALS operations with numeric cast on dimensions to Druid * Fix value for strict flag * Adding additional tests Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/6971a306 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/6971a306 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/6971a306 Branch: refs/heads/master Commit: 6971a3065f7f93e9882b044b41ab69babdd46364 Parents: fb760a6 Author: Jesus Camacho Rodriguez <[email protected]> Authored: Fri Oct 6 11:39:06 2017 -0700 Committer: Jesus Camacho Rodriguez <[email protected]> Committed: Fri Oct 6 11:47:47 2017 -0700 ---------------------------------------------------------------------- .../calcite/adapter/druid/DruidQuery.java | 6 +- .../org/apache/calcite/test/DruidAdapterIT.java | 58 +++++++++++++------- 2 files changed, 40 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/6971a306/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 272a7c8..20cdb7c 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 @@ -1187,7 +1187,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel { // normal selector if (numeric && extractionFunction == null) { String constantValue = tr(e, posConstant); - return new JsonBound(dimName, constantValue, true, constantValue, true, + return new JsonBound(dimName, constantValue, false, constantValue, false, numeric, extractionFunction); } return new JsonSelector(dimName, tr(e, posConstant), extractionFunction); @@ -1198,9 +1198,9 @@ public class DruidQuery extends AbstractRelNode implements BindableRel { if (numeric && extractionFunction == null) { String constantValue = tr(e, posConstant); return new JsonCompositeFilter(JsonFilter.Type.OR, - new JsonBound(dimName, constantValue, false, null, false, + new JsonBound(dimName, constantValue, true, null, false, numeric, extractionFunction), - new JsonBound(dimName, null, false, constantValue, false, + new JsonBound(dimName, null, false, constantValue, true, numeric, extractionFunction)); } return new JsonCompositeFilter(JsonFilter.Type.NOT, http://git-wip-us.apache.org/repos/asf/calcite/blob/6971a306/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 a6902cf..1f6b895 100644 --- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java +++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java @@ -3190,40 +3190,56 @@ public class DruidAdapterIT { @Test public void testPushEqualsCastDimension() { final String sqlQuery = "select sum(\"store_cost\") as a " + "from \"foodmart\" " - + "where cast(\"customer_id\" as double) = 1.0"; + + "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]], " - + "filter=[=(CAST($20):DOUBLE, 1.0)], groups=[{}], aggs=[[SUM($91)]])"; + + "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']," + + "'context':{'skipEmptyBuckets':true}}"; sql(sqlQuery, FOODMART) .explainContains(plan) - .queryContains( - druidChecker( - "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," - + "'filter':{'type':'bound','dimension':'customer_id','lower':'1.0','lowerStrict':true," - + "'upper':'1.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']," - + "'context':{'skipEmptyBuckets':true}}")); + .queryContains(druidChecker(druidQuery)) + .returnsUnordered("A=85.3163999915123"); + + final String sqlQuery2 = "select sum(\"store_cost\") as a " + + "from \"foodmart\" " + + "where cast(\"product_id\" as double) <= 1016.0 " + + "and cast(\"product_id\" as double) >= 1016.0"; + sql(sqlQuery2, FOODMART) + .returnsUnordered("A=85.3163999915123"); } @Test public void testPushNotEqualsCastDimension() { final String sqlQuery = "select sum(\"store_cost\") as a " + "from \"foodmart\" " - + "where cast(\"customer_id\" as double) <> 1.0"; + + "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]], " - + "filter=[<>(CAST($20):DOUBLE, 1.0)], groups=[{}], aggs=[[SUM($91)]])"; + + "filter=[<>(CAST($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])"; + final String druidQuery = + "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," + + "'filter':{'type':'or','fields':[{'type':'bound','dimension':'product_id','lower':'1016.0'," + + "'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']," + + "'context':{'skipEmptyBuckets':true}}"; sql(sqlQuery, FOODMART) .explainContains(plan) - .queryContains( - druidChecker( - "{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all'," - + "'filter':{'type':'or','fields':[{'type':'bound','dimension':'customer_id','lower':'1.0'," - + "'lowerStrict':false,'ordering':'numeric'},{'type':'bound','dimension':'customer_id'," - + "'upper':'1.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']," - + "'context':{'skipEmptyBuckets':true}}")); + .queryContains(druidChecker(druidQuery)) + .returnsUnordered("A=225541.91732536256"); + + final String sqlQuery2 = "select sum(\"store_cost\") as a " + + "from \"foodmart\" " + + "where cast(\"product_id\" as double) < 1016.0 " + + "or cast(\"product_id\" as double) > 1016.0"; + sql(sqlQuery2, FOODMART) + .returnsUnordered("A=225541.91732536256"); } }
