You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by kr...@apache.org on 2019/03/19 13:00:32 UTC
[calcite] branch master updated: [CALCITE-2932] Update stale Druid
integration test cases
This is an automated email from the ASF dual-hosted git repository.
krisden pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new 1229ef2 [CALCITE-2932] Update stale Druid integration test cases
1229ef2 is described below
commit 1229ef27094ea73ad9c7a397f442285c7e1df9b0
Author: Hongze Zhang <ho...@tencent.com>
AuthorDate: Tue Mar 19 16:07:00 2019 +0800
[CALCITE-2932] Update stale Druid integration test cases
Also, fix IOBE during pushing down filtered aggregate in Druid adapter.
Close apache/calcite#1115
Signed-off-by: Kevin Risden <kr...@apache.org>
---
.../src/main/java/org/apache/calcite/util/Bug.java | 6 +
.../apache/calcite/adapter/druid/DruidRules.java | 5 +-
.../org/apache/calcite/test/DruidAdapterIT.java | 108 +++++++++---------
.../org/apache/calcite/test/DruidAdapterIT2.java | 122 ++++++++++-----------
4 files changed, 119 insertions(+), 122 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/util/Bug.java b/core/src/main/java/org/apache/calcite/util/Bug.java
index 3e69a2c..0643678 100644
--- a/core/src/main/java/org/apache/calcite/util/Bug.java
+++ b/core/src/main/java/org/apache/calcite/util/Bug.java
@@ -183,6 +183,12 @@ public abstract class Bug {
* Wrong value when accessing struct types with one attribute</a> is fixed. */
public static final boolean CALCITE_2776_FIXED = false;
+ /** Whether
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-2933">[CALCITE-2933]
+ * In Druid adapter, expression like "cast(cast(\"timestamp\" as timestamp) as varchar)"
+ * returns as epoch millisecond</a> is fixed. */
+ public static final boolean CALCITE_2933_FIXED = false;
+
/**
* Use this to flag temporary code.
*/
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 b6a7270..1092e59 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
@@ -596,8 +596,9 @@ public class DruidRules {
// Erase references to filters
for (AggregateCall aggCall : aggregate.getAggCallList()) {
if ((uniqueFilterRefs.size() == 1
- && allHaveFilters) // filters get extracted
- || project.getProjects().get(aggCall.filterArg).isAlwaysTrue()) {
+ && allHaveFilters) // filters get extracted
+ || aggCall.hasFilter()
+ && project.getProjects().get(aggCall.filterArg).isAlwaysTrue()) {
aggCall = aggCall.copy(aggCall.getArgList(), -1, aggCall.collation);
}
newCalls.add(aggCall);
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 f4bcaf6..d4c7748 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -1024,8 +1024,8 @@ public class DruidAdapterIT {
.returnsUnordered("state_province=CA; A=3; S=74748; C=16347; C0=24441",
"state_province=OR; A=3; S=67659; C=21610; C0=21610")
.explainContains("PLAN=EnumerableInterpreter\n"
- + " BindableProject(state_province=[$0], A=[CAST(/(CASE(=($2, 0), null, $1), $2)):BIGINT],"
- + " S=[CASE(=($2, 0), null, $1)], C=[$3], C0=[$4])\n"
+ + " BindableProject(state_province=[$0], A=[/(CASE(=($2, 0), null:BIGINT, $1), $2)], "
+ + "S=[CASE(=($2, 0), null:BIGINT, $1)], C=[$3], C0=[$4])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$30, $89, $71]], groups=[{0}], "
+ "aggs=[[$SUM0($1), COUNT($1), COUNT($2), COUNT()]], sort0=[0], dir0=[ASC])")
@@ -1935,10 +1935,9 @@ public class DruidAdapterIT {
+ "where \"product_id\" = cast(NULL as varchar)\n"
+ "group by \"product_id\" order by \"product_id\" limit 5";
final String plan = "PLAN=EnumerableInterpreter\n"
- + " BindableSort(sort0=[$0], dir0=[ASC], fetch=[5])\n"
- + " BindableFilter(condition=[=($0, null)])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals="
- + "[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{1}], aggs=[[]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], "
+ + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ + "filter=[false], groups=[{1}], aggs=[[]], sort0=[0], dir0=[ASC], fetch=[5])";
final String query = "{\"queryType\":\"groupBy\"";
sql(sql)
.explainContains(plan)
@@ -2157,8 +2156,8 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ "filter=[AND(=($2, 'Bird Call'), OR(=(EXTRACT(FLAG(WEEK), $0), 10), "
- + "=(EXTRACT(FLAG(WEEK), $0), 11)))], projects=[[$0, $2, $63, $90, $91]], "
- + "groups=[{2}], aggs=[[SUM($3), SUM($4)]], post_projects=[[$0, 'Bird Call', -($1, $2)]])";
+ + "=(EXTRACT(FLAG(WEEK), $0), 11)))], projects=[[$63, $90, $91]], "
+ + "groups=[{0}], aggs=[[SUM($1), SUM($2)]], post_projects=[[$0, 'Bird Call', -($1, $2)]])";
sql(sql, FOODMART)
.returnsOrdered("store_state=CA; brand_name=Bird Call; A=34.364599999999996",
"store_state=OR; brand_name=Bird Call; A=39.16359999999999",
@@ -2193,9 +2192,9 @@ public class DruidAdapterIT {
+ "'expression':'case_searched((\\'$f3\\' == 0),1.0,CAST(\\'$f3\\'";
final String plan =
"DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[$63, $89, $90, $91]], groups=[{0}], "
- + "aggs=[[SUM($2), SUM($3), SUM($1)]], post_projects=[[$0, /($1, $2), "
- + "CASE(=($3, 0), 1.0, CAST($3):DECIMAL(19, 0))]], sort0=[1], dir0=[DESC])";
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $89, $90, $91]], groups=[{0}], "
+ + "aggs=[[SUM($2), SUM($3), SUM($1)]], post_projects=[[$0, /($1, $2), "
+ + "CASE(=($3, 0), 1.0:DECIMAL(19, 0), CAST($3):DECIMAL(19, 0))]], sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=OR; A=2.506091302943239; B=67659.0",
"store_state=CA; A=2.505379741272971; B=74748.0",
@@ -2212,9 +2211,9 @@ public class DruidAdapterIT {
+ "{'type':'expression','name':'C','expression':'((\\'$f1\\' + 100) - \\'B\\')'}]";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
- + "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]";
+ + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ + "projects=[[$63, $90, $91]], groups=[{0}], aggs=[[SUM($1), SUM($2)]], "
+ + "post_projects=[[$0, +($1, 100), -(+($1, 100), $2)]], sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=WA; A=263893.2200000001; C=158568.91210000002",
"store_state=CA; A=159267.83999999994; C=95737.41489999992",
@@ -2247,7 +2246,7 @@ public class DruidAdapterIT {
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63, $91]], groups=[{0}], aggs=[[SUM($1)]], "
- + "post_projects=[[$0, /(*(-1.0, $1), 0)]], sort0=[1], dir0=[DESC])";
+ + "post_projects=[[$0, /(*(-1.0:DECIMAL(2, 1), $1), 0)]], sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=CA; A=-Infinity",
"store_state=OR; A=-Infinity",
@@ -2300,9 +2299,8 @@ public class DruidAdapterIT {
+ "\"expression\":\"(\\\"$f2\\\" - \\\"$f3\\\")\"}";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], 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=[2], dir0=[ASC], fetch=[5])";
+ + "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)
.returnsOrdered("store_state=CA; brand_name=King; A=21.4632",
"store_state=OR; brand_name=Symphony; A=32.176",
@@ -3473,19 +3471,16 @@ public class DruidAdapterIT {
+ "(\"city\" as INTEGER)) IS NULL";
sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{}], EXPR$0=[$SUM0($1)])\n"
- + " BindableFilter(condition=[IS NULL(+(null, CAST($0):INTEGER))])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
+ + " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "groups=[{29}], aggs=[[COUNT()]])")
+ + "projects=[[0]], groups=[{}], aggs=[[COUNT()]])")
.queryContains(
druidChecker(
- "{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\","
- + "\"granularity\":\"all\",\"dimensions\":[{\"type\":\"default\","
- + "\"dimension\":\"city\",\"outputName\":\"city\",\"outputType\":\"STRING\"}],"
- + "\"limitSpec\":{\"type\":\"default\"},"
+ "{\"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\":false}}"))
.returnsUnordered("EXPR$0=86829");
}
@@ -3581,8 +3576,7 @@ public class DruidAdapterIT {
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[=(CAST(CAST($0):DATE NOT NULL):VARCHAR CHARACTER SET \"ISO-8859-1\" "
- + "COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '1997-01-01')], "
+ + "filter=[=(CAST(CAST($0):DATE NOT NULL):VARCHAR NOT NULL, '1997-01-01')], "
+ "groups=[{}], aggs=[[COUNT()]])")
.queryContains(
druidChecker("{\"type\":\"expression\","
@@ -3718,10 +3712,9 @@ public class DruidAdapterIT {
+ " CAST('1997-01-01' as DATE) GROUP BY floor(\"timestamp\" to DAY) order by d limit 3";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], filter=[=(CAST(FLOOR(CAST($0):DATE NOT NULL, "
- + "FLAG(MONTH))):DATE NOT NULL, 1997-01-01)], projects=[[FLOOR($0, FLAG(DAY))]], "
- + "groups=[{0}], aggs=[[]], post_projects=[[CAST($0):TIMESTAMP(0) NOT NULL]]"
- + ", sort0=[0], dir0=[ASC], fetch=[3])";
+ + "2992-01-10T00:00:00.000Z]], filter=[=(FLOOR(CAST($0):DATE NOT NULL, FLAG(MONTH)), "
+ + "1997-01-01)], projects=[[FLOOR($0, FLAG(DAY))]], groups=[{0}], aggs=[[]], "
+ + "post_projects=[[CAST($0):TIMESTAMP(0) NOT NULL]], sort0=[0], dir0=[ASC], fetch=[3])";
sql(sql, FOODMART)
.explainContains(plan)
.returnsOrdered("D=1997-01-01 00:00:00", "D=1997-01-02 00:00:00", "D=1997-01-03 00:00:00");
@@ -3808,8 +3801,9 @@ public class DruidAdapterIT {
+ " WHERE (CAST((\"product_id\" <> '1') AS BOOLEAN)) IS TRUE";
sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]],"
- + " filter=[IS TRUE(CAST(<>($1, '1')):BOOLEAN)], groups=[{}], aggs=[[COUNT()]])")
+ + " DruidQuery(table=[[foodmart, foodmart]], "
+ + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ + "filter=[<>($1, '1')], groups=[{}], aggs=[[COUNT()]])")
.queryContains(druidChecker("\"queryType\":\"timeseries\""))
.returnsOrdered("EXPR$0=86803");
}
@@ -3846,15 +3840,18 @@ public class DruidAdapterIT {
final String quarterAsExpressionFilter2 = "MONTH";
final String quarterAsExpressionFilterTimeZone = "UTC";
final String quarterAsExpressionFilter3 = "/ 4) + 1) == 1)'}]}";
- final String booleanAsFilter = "> 0";
+ // should use JSON filter instead of Druid expression after the fix of:
+ // 1. https://issues.apache.org/jira/browse/CALCITE-2590
+ // 2. https://issues.apache.org/jira/browse/CALCITE-2838
+ final String booleanAsFilter = "{\"type\":\"bound\",\"dimension\":\"store_sales\","
+ + "\"lower\":\"0\",\"lowerStrict\":true,\"ordering\":\"numeric\"}";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(<=(/(+(CAST($1):INTEGER, *(1, $90)), -($91, 5)), +(*(FLOOR($90), 25), 2)),"
- + " IS TRUE(CAST(>($90, 0)):BOOLEAN), "
- + "LIKE($1, '1%'), >($91, 1), <($0, 1997-01-02 00:00:00), =(EXTRACT(FLAG(MONTH), $0), 1), "
- + "=(EXTRACT(FLAG(DAY), $0), 1), =(+(/(EXTRACT(FLAG(MONTH), $0), 4), 1), 1))], "
- + "groups=[{}], aggs=[[COUNT()]])";
+ + "filter=[AND(<=(/(+(CAST($1):INTEGER, *(1, $90)), -($91, 5)), +(*(FLOOR($90), 25), 2)), "
+ + ">($90, 0), LIKE($1, '1%'), >($91, 1), <($0, 1997-01-02 00:00:00), "
+ + "=(EXTRACT(FLAG(MONTH), $0), 1), =(EXTRACT(FLAG(DAY), $0), 1), "
+ + "=(+(/(EXTRACT(FLAG(MONTH), $0), 4), 1), 1))], groups=[{}], aggs=[[COUNT()]])";
sql(sql, FOODMART)
.returnsOrdered("EXPR$0=36")
.explainContains(plan)
@@ -4024,7 +4021,7 @@ public class DruidAdapterIT {
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(IS NOT TRUE(=($1, 1020)), IS FALSE(=($1, 1020)))],"
+ + "filter=[AND(IS NOT TRUE(=($1, 1020)), <>($1, 1020))],"
+ " groups=[{}], aggs=[[COUNT()]])");
final String sql2 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + "WHERE "
+ "\"product_id\" <> 1020";
@@ -4265,11 +4262,11 @@ public class DruidAdapterIT {
.returnsOrdered(
"QR_TIMESTAMP_OK=1; SUM_STORE_SALES=139628.34999999971; YR_TIMESTAMP_OK=1997")
.queryContains(druidChecker("\"queryType\":\"groupBy\"", extract_year, extract_expression))
- .explainContains("BindableProject(QR_TIMESTAMP_OK=[$0], SUM_STORE_SALES=[$2], "
- + "YR_TIMESTAMP_OK=[$1])\n"
+ .explainContains("PLAN=EnumerableInterpreter\n"
+ + " BindableProject(QR_TIMESTAMP_OK=[$0], SUM_STORE_SALES=[$2], YR_TIMESTAMP_OK=[$1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[CAST(+(/(-(EXTRACT(FLAG(MONTH), $0), 1), 3), 1))"
- + ":BIGINT NOT NULL, EXTRACT(FLAG(YEAR), $0), $90]], groups=[{0, 1}], aggs=[[SUM($2)]], fetch=[1])");
+ + "2992-01-10T00:00:00.000Z]], projects=[[+(/(-(EXTRACT(FLAG(MONTH), $0), 1), 3), 1), "
+ + "EXTRACT(FLAG(YEAR), $0), $90]], groups=[{0, 1}], aggs=[[SUM($2)]], fetch=[1])");
}
@Test
@@ -4342,13 +4339,13 @@ public class DruidAdapterIT {
.returnsOrdered("QUARTER=3; WEEK=37; DAYOFWEEK=6; DAYOFMONTH=12;"
+ " DAYOFYEAR=255; SUM_ADDED=9385573")
.explainContains("PLAN=EnumerableInterpreter\n"
- + " BindableProject(QUARTER=[$4], WEEK=[$0], DAYOFWEEK=[$1], DAYOFMONTH=[$2], "
- + "DAYOFYEAR=[$3], SUM_ADDED=[$5])\n"
- + " BindableSort(fetch=[1])\n"
- + " DruidQuery(table=[[wiki, wikiticker]], intervals=[[1900-01-01T00:00:00.000Z/"
- + "3000-01-01T00:00:00.000Z]], projects=[[EXTRACT(FLAG(WEEK), $0), EXTRACT(FLAG(DOW), $0),"
- + " EXTRACT(FLAG(DAY), $0), EXTRACT(FLAG(DOY), $0), EXTRACT(FLAG(QUARTER), $0), $1]],"
- + " groups=[{0, 1, 2, 3, 4}], aggs=[[SUM($5)]], sort0=[5], dir0=[ASC])")
+ + " BindableProject(QUARTER=[$4], WEEK=[$0], DAYOFWEEK=[$1], "
+ + "DAYOFMONTH=[$2], DAYOFYEAR=[$3], SUM_ADDED=[$5])\n"
+ + " DruidQuery(table=[[wiki, wikiticker]], "
+ + "intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], "
+ + "projects=[[EXTRACT(FLAG(WEEK), $0), EXTRACT(FLAG(DOW), $0), "
+ + "EXTRACT(FLAG(DAY), $0), EXTRACT(FLAG(DOY), $0), EXTRACT(FLAG(QUARTER), $0), $1]], "
+ + "groups=[{0, 1, 2, 3, 4}], aggs=[[SUM($5)]], fetch=[1])")
.queryContains(druidChecker("\"queryType\":\"groupBy\""));
}
@@ -4362,9 +4359,8 @@ public class DruidAdapterIT {
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$90, $91]], groups=[{}], aggs=[[COUNT(), "
- + "SUM($0), SUM($1)]], post_projects=[[||(||(CAST(+($0, $1)):VARCHAR CHARACTER SET "
- + "\"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", '_'), CAST($2):"
- + "VARCHAR)]])");
+ + "SUM($0), SUM($1)]], post_projects=[[||(||(CAST(+($0, $1)):VARCHAR, '_'), "
+ + "CAST($2):VARCHAR)]])");
}
@Test
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
index 57c6b5b..f849157 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
@@ -25,6 +25,7 @@ import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.util.Bug;
import org.apache.calcite.util.TestUtil;
import com.google.common.collect.ArrayListMultimap;
@@ -781,8 +782,8 @@ public class DruidAdapterIT2 {
.returnsUnordered("state_province=CA; A=3; S=74748; C=16347; C0=24441",
"state_province=OR; A=3; S=67659; C=21610; C0=21610")
.explainContains("PLAN=EnumerableInterpreter\n"
- + " BindableProject(state_province=[$0], A=[CAST(/(CASE(=($2, 0), null, $1), $2)):BIGINT],"
- + " S=[CASE(=($2, 0), null, $1)], C=[$3], C0=[$4])\n"
+ + " BindableProject(state_province=[$0], A=[/(CASE(=($2, 0), null:BIGINT, $1), $2)], "
+ + "S=[CASE(=($2, 0), null:BIGINT, $1)], C=[$3], C0=[$4])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$30, $89, $71]], groups=[{0}], "
+ "aggs=[[$SUM0($1), COUNT($1), COUNT($2), COUNT()]], sort0=[0], dir0=[ASC])")
@@ -1673,10 +1674,9 @@ public class DruidAdapterIT2 {
+ "where \"product_id\" = cast(NULL as varchar)\n"
+ "group by \"product_id\" order by \"product_id\" limit 5";
final String plan = "PLAN=EnumerableInterpreter\n"
- + " BindableSort(sort0=[$0], dir0=[ASC], fetch=[5])\n"
- + " BindableFilter(condition=[=($0, null)])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals="
- + "[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{1}], aggs=[[]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], "
+ + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ + "filter=[false], groups=[{1}], aggs=[[]], sort0=[0], dir0=[ASC], fetch=[5])";
final String query = "{\"queryType\":\"groupBy\"";
sql(sql)
.explainContains(plan)
@@ -1892,11 +1892,11 @@ public class DruidAdapterIT2 {
+ " IN (10,11) and \"brand_name\"='Bird Call' group by \"store_state\"";
final String druidQuery = "type':'expression','name':'A','expression':'(\\'$f1\\' - \\'$f2\\')";
final String plan = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(=($2, 'Bird Call'), OR(=(EXTRACT(FLAG(WEEK), $0), 10), "
- + "=(EXTRACT(FLAG(WEEK), $0), 11)))], projects=[[$0, $2, $63, $90, $91]], "
- + "groups=[{2}], aggs=[[SUM($3), SUM($4)]], post_projects=[[$0, 'Bird Call', -($1, $2)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ + "2992-01-10T00:00:00.000Z]], filter=[AND(=($2, 'Bird Call'), "
+ + "OR(=(EXTRACT(FLAG(WEEK), $0), 10), =(EXTRACT(FLAG(WEEK), $0), 11)))], "
+ + "projects=[[$63, $90, $91]], groups=[{0}], aggs=[[SUM($1), SUM($2)]], "
+ + "post_projects=[[$0, 'Bird Call', -($1, $2)]])";
sql(sql, FOODMART)
.returnsOrdered("store_state=CA; brand_name=Bird Call; A=34.364599999999996",
"store_state=OR; brand_name=Bird Call; A=39.16359999999999",
@@ -1930,10 +1930,11 @@ public class DruidAdapterIT2 {
+ "'expression':'(\\'$f1\\' / \\'$f2\\')'},{'type':'expression','name':'B',"
+ "'expression':'case_searched((\\'$f3\\' == 0),1.0,CAST(\\'$f3\\'";
final String plan =
- "DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "PLAN=EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63, $89, $90, $91]], groups=[{0}], "
- + "aggs=[[SUM($2), SUM($3), SUM($1)]], post_projects=[[$0, /($1, $2), "
- + "CASE(=($3, 0), 1.0, CAST($3):DECIMAL(19, 0))]], sort0=[1], dir0=[DESC])";
+ + "aggs=[[SUM($2), SUM($3), SUM($1)]], post_projects=[[$0, /($1, $2), CASE(=($3, 0), "
+ + "1.0:DECIMAL(19, 0), CAST($3):DECIMAL(19, 0))]], sort0=[1], dir0=[DESC])\n";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=OR; A=2.506091302943239; B=67659.0",
"store_state=CA; A=2.505379741272971; B=74748.0",
@@ -1949,10 +1950,10 @@ public class DruidAdapterIT2 {
String postAggString = "[{'type':'expression','name':'A','expression':'(\\'$f1\\' + 100)'},"
+ "{'type':'expression','name':'C','expression':'((\\'$f1\\' + 100) - \\'B\\')'}]";
final String plan = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "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]";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $90, $91]], groups=[{0}], "
+ + "aggs=[[SUM($1), SUM($2)]], post_projects=[[$0, +($1, 100), "
+ + "-(+($1, 100), $2)]], sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=WA; A=263893.2200000001; C=158568.91210000002",
"store_state=CA; A=159267.83999999994; C=95737.41489999992",
@@ -1984,8 +1985,9 @@ public class DruidAdapterIT2 {
+ "\"expression\":\"((-1.0 * \\\"$f1\\\") / 0)\"}],";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[$63, $91]], groups=[{0}], aggs=[[SUM($1)]], "
- + "post_projects=[[$0, /(*(-1.0, $1), 0)]], sort0=[1], dir0=[DESC])";
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $91]], groups=[{0}], "
+ + "aggs=[[SUM($1)]], post_projects=[[$0, /(*(-1.0:DECIMAL(2, 1), $1), 0)]], "
+ + "sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=CA; A=-Infinity",
"store_state=OR; A=-Infinity",
@@ -2038,9 +2040,8 @@ public class DruidAdapterIT2 {
+ "\"expression\":\"(\\\"$f2\\\" - \\\"$f3\\\")\"}";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], 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=[2], dir0=[ASC], fetch=[5])";
+ + "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)
.returnsOrdered("store_state=CA; brand_name=King; A=21.4632",
"store_state=OR; brand_name=Symphony; A=32.176",
@@ -2976,19 +2977,15 @@ public class DruidAdapterIT2 {
+ "(\"city\" as INTEGER)) IS NULL";
sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{}], EXPR$0=[$SUM0($1)])\n"
- + " BindableFilter(condition=[IS NULL(+(null, CAST($0):INTEGER))])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
+ + " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "groups=[{29}], aggs=[[COUNT()]])")
+ + "projects=[[0]], groups=[{}], aggs=[[COUNT()]])")
.queryContains(
druidChecker(
- "{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\","
- + "\"granularity\":\"all\",\"dimensions\":[{\"type\":\"default\","
- + "\"dimension\":\"city\",\"outputName\":\"city\",\"outputType\":\"STRING\"}],"
- + "\"limitSpec\":{\"type\":\"default\"},"
- + "\"aggregations\":[{\"type\":\"count\",\"name\":\"EXPR$0\"}],"
- + "\"intervals\":[\"1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z\"]}"))
+ "{\"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\"],\"context\":{\"skipEmptyBuckets\":false}}"))
.returnsUnordered("EXPR$0=86829");
}
@@ -3082,10 +3079,9 @@ public class DruidAdapterIT2 {
+ "DATE) as VARCHAR) = '1997-01-01'";
sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[=(CAST(CAST($0):DATE NOT NULL):VARCHAR CHARACTER SET \"ISO-8859-1\" "
- + "COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '1997-01-01')], "
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ + "2992-01-10T00:00:00.000Z]], "
+ + "filter=[=(CAST(CAST($0):DATE NOT NULL):VARCHAR NOT NULL, '1997-01-01')], "
+ "groups=[{}], aggs=[[COUNT()]])")
.queryContains(
druidChecker("{\"type\":\"expression\","
@@ -3143,9 +3139,9 @@ public class DruidAdapterIT2 {
+ " CAST('1997-01-01' as DATE) GROUP BY floor(\"timestamp\" to DAY) order by d limit 3";
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], filter=[=(CAST(FLOOR(CAST($0):DATE NOT NULL, "
- + "FLAG(MONTH))):DATE NOT NULL, 1997-01-01)], projects=[[FLOOR($0, FLAG(DAY))]], "
- + "groups=[{0}], aggs=[[]], sort0=[0], dir0=[ASC], fetch=[3])";
+ + "2992-01-10T00:00:00.000Z]], filter=[=(FLOOR(CAST($0):DATE NOT NULL, FLAG(MONTH)), "
+ + "1997-01-01)], projects=[[FLOOR($0, FLAG(DAY))]], groups=[{0}], aggs=[[]], sort0=[0], "
+ + "dir0=[ASC], fetch=[3])";
sql(sql, FOODMART)
.explainContains(plan)
.returnsOrdered("D=1997-01-01 00:00:00", "D=1997-01-02 00:00:00", "D=1997-01-03 00:00:00");
@@ -3232,10 +3228,8 @@ public class DruidAdapterIT2 {
+ " WHERE (CAST((\"product_id\" <> '1') AS BOOLEAN)) IS TRUE";
sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]],"
- + " intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]],"
- + " filter=[IS TRUE(CAST(<>($1, '1')):BOOLEAN)],"
- + " groups=[{}], aggs=[[COUNT()]])")
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ + "2992-01-10T00:00:00.000Z]], filter=[<>($1, '1')], groups=[{}], aggs=[[COUNT()]])")
.queryContains(druidChecker("\"queryType\":\"timeseries\""))
.returnsOrdered("EXPR$0=86803");
}
@@ -3273,13 +3267,12 @@ public class DruidAdapterIT2 {
final String quarterAsExpressionFilterTimeZone = "UTC";
final String quarterAsExpressionFilter3 = "/ 4) + 1) == 1)'}]}";
final String plan = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]],"
- + " filter=[AND(<=(/(+(CAST($1):INTEGER, *(1, $90)), -($91, 5)), +(*(FLOOR($90), 25), 2)),"
- + " IS TRUE(CAST(>($90, 0)):BOOLEAN),"
- + " LIKE($1, '1%'), >($91, 1), <($0, 1997-01-02 00:00:00),"
- + " =(EXTRACT(FLAG(MONTH), $0), 1),"
- + " =(EXTRACT(FLAG(DAY), $0), 1), =(+(/(EXTRACT(FLAG(MONTH), $0), 4), 1), 1))],"
- + " groups=[{}], aggs=[[COUNT()]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ + "2992-01-10T00:00:00.000Z]], filter=[AND(<=(/(+(CAST($1):INTEGER, *(1, $90)), "
+ + "-($91, 5)), +(*(FLOOR($90), 25), 2)), >($90, 0), LIKE($1, '1%'), >($91, 1), "
+ + "<($0, 1997-01-02 00:00:00), =(EXTRACT(FLAG(MONTH), $0), 1), "
+ + "=(EXTRACT(FLAG(DAY), $0), 1), =(+(/(EXTRACT(FLAG(MONTH), $0), 4), 1), 1))], "
+ + "groups=[{}], aggs=[[COUNT()]])";
sql(sql, FOODMART)
.returnsOrdered("EXPR$0=36")
.explainContains(plan)
@@ -3449,8 +3442,8 @@ public class DruidAdapterIT2 {
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(IS NOT TRUE(=($1, 1020)), IS FALSE(=($1, 1020)))],"
- + " groups=[{}], aggs=[[COUNT()]])");
+ + "filter=[AND(IS NOT TRUE(=($1, 1020)), <>($1, 1020))], groups=[{}], "
+ + "aggs=[[COUNT()]])");
final String sql2 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + "WHERE "
+ "\"product_id\" <> 1020";
sql(sql2, FOODMART).returnsOrdered(result);
@@ -3679,11 +3672,11 @@ public class DruidAdapterIT2 {
.returnsOrdered(
"QR_TIMESTAMP_OK=1; SUM_STORE_SALES=139628.34999999971; YR_TIMESTAMP_OK=1997")
.queryContains(druidChecker("\"queryType\":\"groupBy\"", extract_year, extract_expression))
- .explainContains("BindableProject(QR_TIMESTAMP_OK=[$0], SUM_STORE_SALES=[$2], "
- + "YR_TIMESTAMP_OK=[$1])\n"
+ .explainContains("PLAN=EnumerableInterpreter\n"
+ + " BindableProject(QR_TIMESTAMP_OK=[$0], SUM_STORE_SALES=[$2], YR_TIMESTAMP_OK=[$1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[CAST(+(/(-(EXTRACT(FLAG(MONTH), $0), 1), 3), 1))"
- + ":BIGINT NOT NULL, EXTRACT(FLAG(YEAR), $0), $90]], groups=[{0, 1}], aggs=[[SUM($2)]], fetch=[1])");
+ + "2992-01-10T00:00:00.000Z]], projects=[[+(/(-(EXTRACT(FLAG(MONTH), $0), 1), 3), 1), "
+ + "EXTRACT(FLAG(YEAR), $0), $90]], groups=[{0, 1}], aggs=[[SUM($2)]], fetch=[1])");
}
@Test
@@ -3753,9 +3746,8 @@ public class DruidAdapterIT2 {
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$90, $91]], groups=[{}], aggs=[[COUNT(), "
- + "SUM($0), SUM($1)]], post_projects=[[||(||(CAST(+($0, $1)):VARCHAR CHARACTER SET "
- + "\"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", '_'), CAST($2):"
- + "VARCHAR)]])");
+ + "SUM($0), SUM($1)]], post_projects=[[||(||(CAST(+($0, $1)):VARCHAR, '_'), "
+ + "CAST($2):VARCHAR)]])");
}
@Test
@@ -3939,10 +3931,12 @@ public class DruidAdapterIT2 {
final String sql = "Select cast(cast(\"timestamp\" as timestamp) as varchar) as t"
+ " from \"foodmart\" order by t limit 1";
- sql(sql, FOODMART)
- .returnsOrdered("T=1997-01-01 00:00:00")
- .queryContains(
- druidChecker("UTC"));
+ if (Bug.CALCITE_2933_FIXED) {
+ sql(sql, FOODMART)
+ .returnsOrdered("T=1997-01-01 00:00:00")
+ .queryContains(
+ druidChecker("UTC"));
+ }
}
}