You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by za...@apache.org on 2020/09/09 22:11:10 UTC
[calcite] branch master updated (60aa74f -> 32ac731)
This is an automated email from the ASF dual-hosted git repository.
zabetak pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git.
from 60aa74f [CALCITE-4237] Following [CALCITE-4173], fix assertion error when RexSimplify generates Sarg with single null only
new 7404445 [CALCITE-4200] ExceptionInInitializerError when initializing DruidRules
new c09c080 [CALCITE-4201] AssertionError when registering Druid rules due to conflict in description
new fb89615 [CALCITE-4221] Update stale integration tests in Druid adapter
new 32ac731 Minor refactoring of DruidAdapterIT and DruidAdapter2IT
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../src/main/java/org/apache/calcite/util/Bug.java | 15 +
.../apache/calcite/adapter/druid/DruidRules.java | 113 +++--
.../org/apache/calcite/test/DruidAdapter2IT.java | 549 ++++++++++-----------
.../org/apache/calcite/test/DruidAdapterIT.java | 366 +++++++-------
4 files changed, 532 insertions(+), 511 deletions(-)
[calcite] 03/04: [CALCITE-4221] Update stale integration tests in
Druid adapter
Posted by za...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zabetak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit fb8961528ff559e109612465cdef3e62eee852e2
Author: Stamatis Zampetakis <za...@gmail.com>
AuthorDate: Wed Sep 2 13:54:17 2020 +0300
[CALCITE-4221] Update stale integration tests in Druid adapter
Update doc of DruidAdapterIT and DruidAdapter2IT to reflect the
new dockerized Druid setup.
The changes in the following tests are due to CALCITE-4202:
* testSelectDistinctWiki
* testSelectDistinctWikiNoColumns
* testSelectDistinctWikiNoTables
* testSelectDistinct
* testFilterUnionPlan
* testDistinctCount
* testPushComplexFilter
* testCountOnMetric
* testCountOnMetricRenamed
* testPushEqualsCastDimension
* testPushNotEqualsCastDimension
* testComplexExpressionsIsNull
The changes in the following tests are due to CALCITE-4212:
* testSelectTimestampColumnNoTables1
* testUnionPlan
* testProject
* testTimeExtractThatCannotBePushed
* testSubStringExpressionFilter
The changes in the following tests are due to both CALCITE-4212 and
CALCITE-4202:
* testUnionPlan
* testDistinctCountOnMetric
* testDistinctCountOnMetricRenamed
* testDistinctCountWhenApproxResultsNotAccepted
* testFilterClauseWithMetricRefAndAggregates
The rest of the changes are normal improvements of the optimizer.
Problematic tests are skipped with the appropriate JIRA references
describing the problem.
---
.../src/main/java/org/apache/calcite/util/Bug.java | 15 +
.../org/apache/calcite/test/DruidAdapter2IT.java | 368 ++++++++++-----------
.../org/apache/calcite/test/DruidAdapterIT.java | 347 ++++++++++---------
3 files changed, 375 insertions(+), 355 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 a7a502a..85531a2 100644
--- a/core/src/main/java/org/apache/calcite/util/Bug.java
+++ b/core/src/main/java/org/apache/calcite/util/Bug.java
@@ -186,6 +186,21 @@ public abstract class Bug {
* Incomplete validation of operands in JSON functions</a> is fixed. */
public static final boolean CALCITE_3243_FIXED = false;
+ /** Whether
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-4204">[CALCITE-4204]
+ * Intermittent precision in Druid results when using aggregation functions over columns of type
+ * DOUBLE</a> is fixed. */
+ public static final boolean CALCITE_4204_FIXED = false;
+ /** Whether
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-4205">[CALCITE-4205]
+ * DruidAdapterIT#testDruidTimeFloorAndTimeParseExpressions2 fails</a> is fixed. */
+ public static final boolean CALCITE_4205_FIXED = false;
+ /** Whether
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-4213">[CALCITE-4213]
+ * Druid plans with small intervals should be chosen over full interval scan plus filter</a> is
+ * fixed. */
+ public static final boolean CALCITE_4213_FIXED = false;
+
/**
* Use this to flag temporary code.
*/
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
index 4d6d069..a2bcf78 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
@@ -24,12 +24,14 @@ 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;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -48,15 +50,9 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
/**
* Tests for the {@code org.apache.calcite.adapter.druid} package.
*
- * <p>Before calling this test, you need to populate Druid, as follows:
- *
- * <blockquote><code>
- * git clone https://github.com/vlsi/calcite-test-dataset<br>
- * cd calcite-test-dataset<br>
- * mvn install
- * </code></blockquote>
- *
- * <p>This will create a virtual machine with Druid and test data set.
+ * <p>Druid must be up and running with foodmart and wikipedia datasets loaded. Follow the
+ * instructions on <a href="https://github.com/zabetak/calcite-druid-dataset">calcite-druid-dataset
+ * </a> to setup Druid before launching these tests.</p>
*
* <p>Features not yet implemented:
* <ul>
@@ -146,7 +142,7 @@ public class DruidAdapter2IT {
@Test void testSelectDistinct() {
final String explain = "PLAN="
+ "EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{30}], aggs=[[]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$30]], groups=[{0}], 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','outputName':'state_province'"
@@ -621,10 +617,11 @@ public class DruidAdapter2IT {
+ "union all\n"
+ "select distinct \"marital_status\" from \"foodmart\"";
final String explain = "PLAN="
- + "EnumerableInterpreter\n"
- + " BindableUnion(all=[true])\n"
- + " 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=[[]])";
+ + "EnumerableUnion(all=[true])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39]], groups=[{0}], aggs=[[]])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$37]], groups=[{0}], aggs=[[]])";
sql(sql)
.explainContains(explain)
.returnsUnordered(
@@ -644,8 +641,8 @@ public class DruidAdapter2IT {
+ "EnumerableInterpreter\n"
+ " BindableFilter(condition=[=($0, 'M')])\n"
+ " BindableUnion(all=[true])\n"
- + " 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=[[]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39]], groups=[{0}], aggs=[[]])\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$37]], groups=[{0}], aggs=[[]])";
sql(sql)
.explainContains(explain)
.returnsUnordered("gender=M",
@@ -659,8 +656,7 @@ public class DruidAdapter2IT {
+ "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+ "'context':{'skipEmptyBuckets':false}}";
final String explain = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[0]], groups=[{}], aggs=[[COUNT()]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])";
final String sql = "select count(*) from \"foodmart\"";
sql(sql)
.returns("EXPR$0=86829\n")
@@ -988,14 +984,12 @@ public class DruidAdapter2IT {
final String explain = "PLAN=EnumerableInterpreter\n"
+ " BindableSort(sort0=[$1], dir0=[DESC], fetch=[2])\n"
+ " 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.000Z/2992-01-10T00:00:00.000Z]], groups=[{29, 30}], "
- + "aggs=[[]])";
+ + " BindableAggregate(group=[{0}], agg#0=[COUNT($1)])\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$30, $29]], groups=[{0, 1}], aggs=[[]])";
final String druidQuery = "{'queryType':'groupBy','dataSource':'foodmart',"
- + "'granularity':'all','dimensions':[{'type':'default','dimension':'city','outputName':'city'"
- + ",'outputType':'STRING'},"
- + "{'type':'default','dimension':'state_province','outputName':'state_province','outputType':'STRING'}],"
+ + "'granularity':'all','dimensions':["
+ + "{'type':'default','dimension':'state_province','outputName':'state_province','outputType':'STRING'},"
+ + "{'type':'default','dimension':'city','outputName':'city','outputType':'STRING'}],"
+ "'limitSpec':{'type':'default'},'aggregations':[],"
+ "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
sql(sql)
@@ -1012,10 +1006,10 @@ public class DruidAdapter2IT {
final String sql = "select \"product_name\", 0 as zero\n"
+ "from \"foodmart\"\n"
+ "order by \"product_name\"";
- final String explain = "PLAN=EnumerableInterpreter\n"
- + " BindableSort(sort0=[$0], dir0=[ASC])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$3, 0]])";
+ final String explain = "PLAN="
+ + "EnumerableSort(sort0=[$0], dir0=[ASC])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$3, 0]])";
sql(sql)
.limit(2)
.returnsUnordered("product_name=ADJ Rosy Sunglasses; ZERO=0",
@@ -1121,9 +1115,10 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1997-04-01T00:00:00.000Z/"
+ "1997-05-01T00:00:00.000Z, 1997-06-01T00:00:00.000Z/1997-07-01T00:00:00.000Z]],"
+ " projects=[[0]], groups=[{}], aggs=[[COUNT()]])";
- sql(sql)
- .returnsUnordered("C=13500")
- .explainContains(explain);
+ CalciteAssert.AssertQuery q = sql(sql)
+ .returnsUnordered("C=13500");
+ Assumptions.assumeTrue(Bug.CALCITE_4213_FIXED, "CALCITE-4213");
+ q.explainContains(explain);
}
@Test void testFilterSwapped() {
@@ -1344,11 +1339,7 @@ public class DruidAdapter2IT {
+ "1998-01-01T00:00:00.000Z'],'context':{'skipEmptyBuckets':false}}";
sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1997-01-01T00:00:00.000Z/1998-01-01T00:00:00.000Z]], "
- + "filter=[AND(>=(CAST($11):INTEGER, 8), <=(CAST($11):INTEGER, 10), "
- + "<(CAST($10):INTEGER, 15))], groups=[{}], "
- + "aggs=[[SUM($90)]])\n")
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1997-01-01T00:00:00.000Z/1998-01-01T00:00:00.000Z]], filter=[AND(>=(CAST($11):INTEGER, 8), <=(CAST($11):INTEGER, 10), <(CAST($10):INTEGER, 15))], projects=[[$90]], groups=[{}], aggs=[[SUM($0)]])")
.returnsUnordered("EXPR$0=75364.1")
.queryContains(new DruidChecker(druidQuery));
}
@@ -1642,12 +1633,11 @@ public class DruidAdapter2IT {
@Test void testTimeExtractThatCannotBePushed() {
final String sql = "SELECT extract(CENTURY from \"timestamp\") from \"foodmart\" where "
+ "\"product_id\" = 1558 group by extract(CENTURY from \"timestamp\")";
- final String plan = "PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{0}])\n"
+ final String plan = "PLAN="
+ + "EnumerableAggregate(group=[{0}])\n"
+ + " EnumerableInterpreter\n"
+ " BindableProject(EXPR$0=[EXTRACT(FLAG(CENTURY), $0)])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[=(CAST($1):INTEGER, 1558)], projects=[[$0]])\n";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=(CAST($1):INTEGER, 1558)], projects=[[$0]])";
sql(sql).explainContains(plan).queryContains(new DruidChecker("'queryType':'scan'"))
.returnsUnordered("EXPR$0=20");
}
@@ -1739,12 +1729,13 @@ public class DruidAdapter2IT {
+ " 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=[[+($1, $2), $0]], sort0=[0], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("A=369117.52790000016; store_state=WA",
- "A=222698.26509999996; store_state=CA",
- "A=199049.57059999998; store_state=OR")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("A=369117.52790000016; store_state=WA",
+ "A=222698.26509999996; store_state=CA",
+ "A=199049.57059999998; store_state=OR");
}
@Test void testDivideArithmeticOperation() {
@@ -1755,12 +1746,13 @@ public class DruidAdapter2IT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=OR; A=2.506091302943239",
- "store_state=CA; A=2.505379741272971",
- "store_state=WA; A=2.5045806163801996")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=OR; A=2.506091302943239",
+ "store_state=CA; A=2.505379741272971",
+ "store_state=WA; A=2.5045806163801996");
}
@Test void testMultiplyArithmeticOperation() {
@@ -1771,12 +1763,13 @@ public class DruidAdapter2IT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=WA; A=2.7783838325212463E10",
- "store_state=CA; A=1.0112000537448784E10",
- "store_state=OR; A=8.077425041941243E9")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=2.7783838325212463E10",
+ "store_state=CA; A=1.0112000537448784E10",
+ "store_state=OR; A=8.077425041941243E9");
}
@Test void testMinusArithmeticOperation() {
@@ -1788,12 +1781,13 @@ public class DruidAdapter2IT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=WA; A=158468.91210000002",
- "store_state=CA; A=95637.41489999992",
- "store_state=OR; A=85504.56939999988")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=158468.91210000002",
+ "store_state=CA; A=95637.41489999992",
+ "store_state=OR; A=85504.56939999988");
}
@Test void testConstantPostAggregator() {
@@ -1804,12 +1798,14 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63, $90]], groups=[{0}], aggs=[[SUM($1)]], "
+ "post_projects=[[$0, +($1, 100)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=WA; A=263893.2200000001",
- "store_state=CA; A=159267.83999999994",
- "store_state=OR; A=142377.06999999992")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered(
+ "store_state=WA; A=263893.2200000001",
+ "store_state=CA; A=159267.83999999994",
+ "store_state=OR; A=142377.06999999992");
}
@Test void testRecursiveArithmeticOperation() {
@@ -1820,10 +1816,7 @@ public class DruidAdapter2IT {
String postAggString = "'postAggregations':[{'type':'expression','name':'C','expression':"
+ "'(-1 * (((\\'$f1\\' - \\'$f2\\') / (\\'$f3\\' * 3)) + \\'B\\'))'}]";
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, $89, $90, $91]], groups=[{0}], "
- + "aggs=[[SUM($2), SUM($3), COUNT(), SUM($1)]], post_projects=[[$0, *(-1, +(/(-($1, $2), "
- + "*($3, 3)), $4))]], 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, $89]], groups=[{0}], aggs=[[SUM($1), SUM($2), COUNT(), SUM($3)]], post_projects=[[$0, *(-1, +(/(-($1, $2), *($3, 3)), $4))]], sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=OR; C=-67660.31890435601",
"store_state=CA; C=-74749.30433035882",
@@ -1839,9 +1832,7 @@ public class DruidAdapter2IT {
final String postAggString = "[{'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]], projects=[[$2, $63, $91]], groups=[{1}], aggs=[[SUM($2), "
- + "COUNT(DISTINCT $0)]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$63, $91, $2]], groups=[{0}], aggs=[[SUM($1), COUNT(DISTINCT $2)]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
foodmartApprox(sqlQuery)
.runs()
.explainContains(plan)
@@ -1895,12 +1886,13 @@ public class DruidAdapter2IT {
+ " 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), COUNT()]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=OR; A=2.6271402406293403",
- "store_state=CA; A=2.599338206292706",
- "store_state=WA; A=2.5828708592868717")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=OR; A=2.6271402406293403",
+ "store_state=CA; A=2.599338206292706",
+ "store_state=WA; A=2.5828708592868717");
}
@Test void testPartiallyPostAggregation() {
@@ -1910,18 +1902,16 @@ public class DruidAdapter2IT {
final String postAggString = "'postAggregations':[{'type':'expression','name':'A',"
+ "'expression':'(\\'$f1\\' / \\'$f2\\')'},{'type':'expression','name':'B',"
+ "'expression':'case_searched((\\'$f3\\' == 0),1.0,CAST(\\'$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, $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])\n";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=OR; A=2.506091302943239; B=67659.0",
- "store_state=CA; A=2.505379741272971; B=74748.0",
- "store_state=WA; A=2.5045806163801996; B=124366.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, $90, $91, $89]], groups=[{0}], aggs=[[SUM($1), SUM($2), SUM($3)]], post_projects=[[$0, /($1, $2), CASE(=($3, 0), 1.0:DECIMAL(19, 0), CAST($3):DECIMAL(19, 0))]], sort0=[1], dir0=[DESC])\n";
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=OR; A=2.506091302943239; B=67659.0",
+ "store_state=CA; A=2.505379741272971; B=74748.0",
+ "store_state=WA; A=2.5045806163801996; B=124366.0");
}
@Test void testDuplicateReferenceOnPostAggregation() {
@@ -1935,12 +1925,13 @@ public class DruidAdapter2IT {
+ "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",
- "store_state=OR; A=142377.06999999992; C=85604.56939999988")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=263893.2200000001; C=158568.91210000002",
+ "store_state=CA; A=159267.83999999994; C=95737.41489999992",
+ "store_state=OR; A=142377.06999999992; C=85604.56939999988");
}
@Test void testDivideByZeroDoubleTypeInfinity() {
@@ -2020,17 +2011,16 @@ public class DruidAdapter2IT {
String postAggString = "\"postAggregations\":[{\"type\":\"expression\",\"name\":\"A\","
+ "\"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]], 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",
- "store_state=CA; brand_name=Toretti; A=32.24650000000001",
- "store_state=WA; brand_name=King; A=34.6104",
- "store_state=OR; brand_name=Toretti; A=36.3")
+ + " 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])";
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=CA; brand_name=King; A=21.4632",
+ "store_state=OR; brand_name=Symphony; A=32.176",
+ "store_state=CA; brand_name=Toretti; A=32.24650000000001",
+ "store_state=WA; brand_name=King; A=34.6104",
+ "store_state=OR; brand_name=Toretti; A=36.3");
}
@Test void testInterleaveBetweenAggregateAndGroupOrderByOnDimension() {
@@ -2041,17 +2031,16 @@ public class DruidAdapter2IT {
final String postAggString = "'postAggregations':[{'type':'expression','name':'A',"
+ "'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]], groups=[{2, 63}], aggs=[[SUM($90), SUM($91)]], post_projects"
- + "=[[$1, $0, +($2, $3)]], sort0=[1], sort1=[0], dir0=[ASC], dir1=[ASC], fetch=[5])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=CA; brand_name=ADJ; A=222.1524",
- "store_state=OR; brand_name=ADJ; A=186.60359999999997",
- "store_state=WA; brand_name=ADJ; A=216.9912",
- "store_state=CA; brand_name=Akron; A=250.349",
- "store_state=OR; brand_name=Akron; A=278.69720000000007")
+ + " 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=[1], sort1=[0], dir0=[ASC], dir1=[ASC], fetch=[5])";
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=CA; brand_name=ADJ; A=222.1524",
+ "store_state=OR; brand_name=ADJ; A=186.60359999999997",
+ "store_state=WA; brand_name=ADJ; A=216.9912",
+ "store_state=CA; brand_name=Akron; A=250.349",
+ "store_state=OR; brand_name=Akron; A=278.69720000000007");
}
@Test void testOrderByOnMetricsInSelectDruidQuery() {
@@ -2395,22 +2384,21 @@ public class DruidAdapter2IT {
@Test void testFilterClauseWithMetricRefAndAggregates() {
String sql = "select sum(\"store_sales\"), \"product_id\" "
+ "from \"foodmart\" where \"product_id\" > 1553 and \"store_cost\" > 5 group by \"product_id\"";
- String expectedSubExplain =
- "PLAN=EnumerableInterpreter\n"
- + " BindableProject(EXPR$0=[$1], product_id=[$0])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(>"
- + "(CAST($1):INTEGER, 1553), >($91, 5))], groups=[{1}], aggs=[[SUM($90)]])";
+ String expectedSubExplain = "PLAN="
+ + "EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1], product_id=[$t0])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(>(CAST($1):INTEGER, 1553), >($91, 5))], projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]])";
- sql(sql)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains(expectedSubExplain)
.queryContains(
new DruidChecker("\"queryType\":\"groupBy\"", "{\"type\":\"bound\","
+ "\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true,"
- + "\"ordering\":\"numeric\"}"))
- .returnsUnordered("EXPR$0=10.16; product_id=1554\n"
- + "EXPR$0=45.05; product_id=1556\n"
- + "EXPR$0=88.5; product_id=1555");
+ + "\"ordering\":\"numeric\"}"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsUnordered("EXPR$0=10.16; product_id=1554\n"
+ + "EXPR$0=45.05; product_id=1556\n"
+ + "EXPR$0=88.5; product_id=1555");
}
@Test void testFilterClauseWithMetricAndTimeAndAggregates() {
@@ -2523,10 +2511,10 @@ public class DruidAdapter2IT {
* when approximate results are not acceptable. */
@Test void testDistinctCountWhenApproxResultsNotAccepted() {
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.000Z/2992-01-10T00:00:00.000Z]], "
- + "groups=[{63}], aggs=[[]])";
+ String expectedSubExplain = ""
+ + "EnumerableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$63]], groups=[{0}], aggs=[[]])";
testCountWithApproxDistinct(false, sql, expectedSubExplain);
}
@@ -2534,15 +2522,12 @@ public class DruidAdapter2IT {
@Test void testDistinctCountOnMetric() {
final String sql = "select count(distinct \"store_sales\") from \"foodmart\" "
+ "where \"store_state\" = 'WA'";
- final String expectedSubExplainNoApprox = "PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')"
- + "], groups=[{90}], aggs=[[]])";
+ final String expectedSubExplainNoApprox = "PLAN="
+ + "EnumerableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')], projects=[[$90]], groups=[{0}], aggs=[[]])";
final String expectedSubPlanWithApprox = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')], groups=[{}], "
- + "aggs=[[COUNT(DISTINCT $90)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')], projects=[[$90]], groups=[{}], aggs=[[COUNT(DISTINCT $0)]])";
testCountWithApproxDistinct(true, sql, expectedSubPlanWithApprox, "'queryType':'timeseries'");
testCountWithApproxDistinct(false, sql, expectedSubExplainNoApprox, "'queryType':'groupBy'");
@@ -2553,7 +2538,7 @@ public class DruidAdapter2IT {
String sql = "select \"brand_name\", count(\"store_sales\") from \"foodmart\" "
+ "group by \"brand_name\"";
String expectedSubExplain = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{2}], aggs=[[COUNT($90)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$2, $90]], groups=[{0}], aggs=[[COUNT($1)]])";
testCountWithApproxDistinct(true, sql, expectedSubExplain, "\"queryType\":\"groupBy\"");
testCountWithApproxDistinct(false, sql, expectedSubExplain, "\"queryType\":\"groupBy\"");
@@ -2563,8 +2548,7 @@ public class DruidAdapter2IT {
@Test void testCountStar() {
String sql = "select count(*) from \"foodmart\"";
String expectedSubExplain = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[0]], groups=[{}], aggs=[[COUNT()]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])";
sql(sql).explainContains(expectedSubExplain);
}
@@ -2575,8 +2559,7 @@ public class DruidAdapter2IT {
+ "(select \"unit_sales\" as \"A\", \"store_state\" as \"B\" from \"foodmart\") "
+ "group by \"B\"";
String expectedSubExplain = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], groups=[{63}], aggs=[[COUNT($89)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0}], aggs=[[COUNT($1)]])";
testCountWithApproxDistinct(true, sql, expectedSubExplain);
testCountWithApproxDistinct(false, sql, expectedSubExplain);
@@ -2586,13 +2569,13 @@ public class DruidAdapter2IT {
final String sql = "select \"B\", count(distinct \"A\") from "
+ "(select \"unit_sales\" as \"A\", \"store_state\" as \"B\" from \"foodmart\") "
+ "group by \"B\"";
- final String expectedSubExplainNoApprox = "PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0, 1}], aggs=[[]])";
- final String expectedPlanWithApprox = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], groups=[{63}], aggs=[[COUNT(DISTINCT $89)]])";
+ final String expectedSubExplainNoApprox = "PLAN="
+ + "EnumerableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0, 1}], aggs=[[]])";
+ final String expectedPlanWithApprox = "PLAN="
+ + "EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0}], aggs=[[COUNT(DISTINCT $1)]])";
testCountWithApproxDistinct(true, sql, expectedPlanWithApprox, "'queryType':'groupBy'");
testCountWithApproxDistinct(false, sql, expectedSubExplainNoApprox, "'queryType':'groupBy'");
@@ -2649,8 +2632,7 @@ public class DruidAdapter2IT {
+ "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.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[=(CAST($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=(CAST($1):DOUBLE, 1016.0)], projects=[[$91]], groups=[{}], aggs=[[SUM($0)]])";
final String druidQuery =
"{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all',"
+ "'filter':{'type':'bound','dimension':'product_id','lower':'1016.0',"
@@ -2676,8 +2658,7 @@ public class DruidAdapter2IT {
+ "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.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[<>(CAST($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[<>(CAST($1):DOUBLE, 1016.0)], projects=[[$91]], groups=[{}], aggs=[[SUM($0)]])";
final String druidQuery =
"{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all',"
+ "'filter':{'type':'not','field':{'type':'bound','dimension':'product_id','"
@@ -2911,9 +2892,7 @@ public class DruidAdapter2IT {
+ "(\"city\" as INTEGER)) IS NULL";
sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "projects=[[0]], groups=[{}], aggs=[[COUNT()]])")
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])")
.queryContains(
new DruidChecker(
"{\"queryType\":\"timeseries\",\"dataSource\":\"foodmart\",\"descending\":false,"
@@ -3078,12 +3057,13 @@ public class DruidAdapter2IT {
sql(sql, FOODMART)
.returnsOrdered("timestamp=1997-01-01 00:00:00; EXPR$1=117")
.queryContains(
- new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\""
- + "(timestamp_floor(timestamp_parse(concat(concat(",
- "== timestamp_floor(\\\"__time\\\""));
+ new DruidChecker(
+ "\"filter\":{\"type\":\"expression\",\"expression\":\"(852076800000 == "
+ + "timestamp_floor"));
}
@Test void testDruidTimeFloorAndTimeParseExpressions2() {
+ Assumptions.assumeTrue(Bug.CALCITE_4205_FIXED, "CALCITE-4205");
final String sql = "SELECT \"timestamp\", count(*) "
+ "from \"foodmart\" WHERE "
+ "CAST(('1997' || '-01' || '-01') AS TIMESTAMP) = CAST(\"timestamp\" AS TIMESTAMP) "
@@ -3226,14 +3206,10 @@ public class DruidAdapter2IT {
+ " AND CAST(SUBSTRING(\"product_id\" from 4 for 1) AS INTEGER) = 7"
+ " AND CAST(SUBSTRING(\"product_id\" from 4) AS INTEGER) = 7"
+ " Group by SUBSTRING(\"product_id\" from 1 for 4)";
- final String plan = "PLAN=EnumerableInterpreter\n"
- + " BindableProject(C=[$1], EXPR$1=[$0])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(LIKE(SUBSTRING($1, 1, 4), '12%'), =(CHAR_LENGTH($1), 4), "
- + "=(SUBSTRING($1, 3, 1), '2'), =(CAST(SUBSTRING($1, 2, 1)):INTEGER, 2), "
- + "=(CAST(SUBSTRING($1, 4, 1)):INTEGER, 7), =(CAST(SUBSTRING($1, 4)):INTEGER, 7))], "
- + "projects=[[SUBSTRING($1, 1, 4)]], groups=[{0}], aggs=[[COUNT()]])";
+ final String plan = "PLAN="
+ + "EnumerableCalc(expr#0..1=[{inputs}], C=[$t1], EXPR$1=[$t0])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(LIKE(SUBSTRING($1, 1, 4), '12%'), =(CHAR_LENGTH($1), 4), =(SUBSTRING($1, 3, 1), '2'), =(CAST(SUBSTRING($1, 2, 1)):INTEGER, 2), =(CAST(SUBSTRING($1, 4, 1)):INTEGER, 7), =(CAST(SUBSTRING($1, 4)):INTEGER, 7))], projects=[[SUBSTRING($1, 1, 4)]], groups=[{0}], aggs=[[COUNT()]])";
sql(sql, FOODMART)
.returnsOrdered("C=60; EXPR$1=1227")
.explainContains(plan)
@@ -3319,11 +3295,10 @@ public class DruidAdapter2IT {
sql(sql, FOODMART)
.returnsOrdered("EXPR$0=2")
.explainContains("PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(>(SIN($91), SIN(20)), >(COS($90), COS(20)), =(FLOOR(TAN($91)), 2), "
- + "<(ABS(-(TAN($91), /(SIN($91), COS($91)))), 1.0E-6))], "
- + "groups=[{}], aggs=[[COUNT()]])");
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], filter=[AND(>(SIN($91), 9.129452507276277E-1), >"
+ + "(COS($90), 4.08082061813392E-1), =(FLOOR(TAN($91)), 2), <(ABS(-(TAN($91), /(SIN"
+ + "($91), COS($91)))), 1.0E-6))], groups=[{}], aggs=[[COUNT()]])");
}
@Test void testCastLiteralToTimestamp() {
@@ -3351,11 +3326,7 @@ public class DruidAdapter2IT {
sql(sql, FOODMART)
.returnsOrdered(result)
.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(=(CAST($1):INTEGER, 1020)), <>(CAST($1):INTEGER, 1020))], "
- + "groups=[{}], "
- + "aggs=[[COUNT()]])");
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[<>(CAST($1):INTEGER, 1020)], groups=[{}], aggs=[[COUNT()]])");
final String sql2 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + "WHERE "
+ "\"product_id\" <> 1020";
sql(sql2, FOODMART).returnsOrdered(result);
@@ -3566,9 +3537,7 @@ public class DruidAdapter2IT {
+ "\"timeZone\":\"UTC\",\"locale\":\"en-US\"}}";
final String extract_expression = "\"expression\":\"(((timestamp_extract(\\\"__time\\\",";
- sql(sql, FOODMART)
- .returnsOrdered(
- "QR_TIMESTAMP_OK=1; SUM_STORE_SALES=139628.34999999971; YR_TIMESTAMP_OK=1997")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker("\"queryType\":\"groupBy\"", extract_year, extract_expression))
.explainContains("PLAN=EnumerableInterpreter\n"
@@ -3576,6 +3545,8 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "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])");
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("QR_TIMESTAMP_OK=1; SUM_STORE_SALES=139628.34999999971; YR_TIMESTAMP_OK=1997");
}
@Test void testTableauQueryExtractMonthDayYear() {
@@ -3604,9 +3575,7 @@ public class DruidAdapter2IT {
+ " AS hr_t_timestamp_ok2 FROM \"foodmart\" GROUP BY "
+ " CAST(SUBSTRING(CAST(\"foodmart\".\"timestamp\" AS VARCHAR) from 12 for 2 ) AS INT),"
+ " MINUTE(\"foodmart\".\"timestamp\"), EXTRACT(HOUR FROM \"timestamp\")) LIMIT 1";
- sql(sql, FOODMART)
- .returnsOrdered("HR_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; "
- + "SUM_T_OTHER_OK=565238.1299999986; HR_T_TIMESTAMP_OK2=0")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("BindableProject(HR_T_TIMESTAMP_OK=[$0], MI_T_TIMESTAMP_OK=[$1], "
+ "SUM_T_OTHER_OK=[$3], HR_T_TIMESTAMP_OK2=[$2])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3615,6 +3584,9 @@ public class DruidAdapter2IT {
+ "NOT NULL, 12, 2)):INTEGER NOT NULL, EXTRACT(FLAG(MINUTE), $0), "
+ "EXTRACT(FLAG(HOUR), $0), $90]], groups=[{0, 1, 2}], aggs=[[SUM($3)]], fetch=[1])")
.queryContains(new DruidChecker("\"queryType\":\"groupBy\""));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("HR_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; "
+ + "SUM_T_OTHER_OK=565238.1299999986; HR_T_TIMESTAMP_OK2=0");
}
@Test void testTableauQueryMinutesSecondsExtract() {
@@ -3622,14 +3594,14 @@ public class DruidAdapter2IT {
+ "MINUTE(\"timestamp\") AS mi_t_timestamp_ok, SUM(\"store_sales\") AS sum_store_sales "
+ " FROM \"foodmart\" GROUP BY SECOND(\"timestamp\"), MINUTE(\"timestamp\"))"
+ " LIMIT_ZERO LIMIT 1";
- sql(sql, FOODMART)
- .returnsOrdered(
- "SC_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; SUM_STORE_SALES=565238.1299999986")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[EXTRACT(FLAG(SECOND), $0), "
+ "EXTRACT(FLAG(MINUTE), $0), $90]], groups=[{0, 1}], aggs=[[SUM($2)]], fetch=[1])")
.queryContains(new DruidChecker("\"queryType\":\"groupBy\""));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("SC_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; SUM_STORE_SALES=565238.1299999986");
}
@Test void testCastConcatOverPostAggregates() {
@@ -3648,8 +3620,7 @@ public class DruidAdapter2IT {
@Test void testHavingSpecs() {
final String sql = "SELECT \"product_id\" AS P, SUM(\"store_sales\") AS S FROM \"foodmart\" "
+ " GROUP BY \"product_id\" HAVING SUM(\"store_sales\") > 220 ORDER BY P LIMIT 2";
- sql(sql, FOODMART)
- .returnsOrdered("P=1; S=236.55", "P=10; S=230.04")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]], "
@@ -3657,20 +3628,23 @@ public class DruidAdapter2IT {
.queryContains(
new DruidChecker("'having':{'type':'filter','filter':{'type':'bound',"
+ "'dimension':'S','lower':'220','lowerStrict':true,'ordering':'numeric'}}"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("P=1; S=236.55", "P=10; S=230.04");
}
@Test void testTransposableHavingFilter() {
final String sql = "SELECT \"product_id\" AS P, SUM(\"store_sales\") AS S FROM \"foodmart\" "
+ " GROUP BY \"product_id\" HAVING SUM(\"store_sales\") > 220 AND \"product_id\" > '10'"
+ " ORDER BY P LIMIT 2";
- sql(sql, FOODMART)
- .returnsOrdered("P=100; S=343.19999999999993", "P=1000; S=532.62")
+ CalciteAssert.AssertQuery q = 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=[>($1, '10')], projects=[[$1, $90]], groups=[{0}],"
+ " aggs=[[SUM($1)]], filter=[>($1, 220)], sort0=[0], dir0=[ASC], fetch=[2])\n")
.queryContains(
new DruidChecker("{'queryType':'groupBy','dataSource':'foodmart','granularity':'all'"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("P=100; S=343.19999999999993", "P=1000; S=532.62");
}
@Test void testProjectSameColumnMultipleTimes() {
@@ -3718,21 +3692,21 @@ public class DruidAdapter2IT {
"SELECT \"product_id\" as prod_id1, \"product_id\" as prod_id2, "
+ "SUM(\"store_sales\") as S1, SUM(\"store_sales\") as S2 FROM " + FOODMART_TABLE
+ " GROUP BY \"product_id\" ORDER BY prod_id2 LIMIT 1";
- sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("BindableProject(PROD_ID1=[$0], PROD_ID2=[$0], S1=[$1], S2=[$1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]], "
+ "sort0=[0], dir0=[ASC], fetch=[1])")
.queryContains(
- new DruidChecker("\"queryType\":\"groupBy\""))
- .returnsOrdered("PROD_ID1=1; PROD_ID2=1; S1=236.55; S2=236.55");
+ new DruidChecker("\"queryType\":\"groupBy\""));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("PROD_ID1=1; PROD_ID2=1; S1=236.55; S2=236.55");
}
@Test void testGroupBy1() {
final String sql = "SELECT SUM(\"store_sales\") FROM \"foodmart\" "
+ "GROUP BY 1 HAVING (COUNT(1) > 0)";
- sql(sql, FOODMART)
- .returnsOrdered("EXPR$0=565238.1299999986")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker("{'queryType':'groupBy','dataSource':'foodmart','granularity':'all',"
+ "'dimensions':[{'type':'default','dimension':'vc','outputName':'vc','outputType':'LONG'}],"
@@ -3742,6 +3716,8 @@ public class DruidAdapter2IT {
+ "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],'having':"
+ "{'type':'filter','filter':{'type':'bound','dimension':'$f2','lower':'0',"
+ "'lowerStrict':true,'ordering':'numeric'}}}"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("EXPR$0=565238.1299999986");
}
@Test void testFloorQuarter() {
@@ -3781,10 +3757,7 @@ public class DruidAdapter2IT {
+ " WHERE \"product_id\" = 1"
+ " GROUP BY EXTRACT(quarter from \"timestamp\"), \"product_id\"";
- sql(sql, FOODMART).returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.050000000000004\n"
- + "EXPR$0=2; product_id=1; EXPR$2=62.7\n"
- + "EXPR$0=3; product_id=1; EXPR$2=88.35\n"
- + "EXPR$0=4; product_id=1; EXPR$2=48.45")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\",\"dimensions\":"
@@ -3792,6 +3765,11 @@ public class DruidAdapter2IT {
+ "{\"type\":\"default\",\"dimension\":\"product_id\",\"outputName\":\"product_id\",\"outputType\":\"STRING\"}],"
+ "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
"QUARTER"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.050000000000004\n"
+ + "EXPR$0=2; product_id=1; EXPR$2=62.7\n"
+ + "EXPR$0=3; product_id=1; EXPR$2=88.35\n"
+ + "EXPR$0=4; product_id=1; EXPR$2=48.45");
}
@Test void testExtractQuarter() {
@@ -3799,16 +3777,18 @@ public class DruidAdapter2IT {
+ FOODMART_TABLE
+ " GROUP BY EXTRACT(quarter from \"timestamp\")";
- sql(sql, FOODMART).returnsOrdered("EXPR$0=1; EXPR$1=139628.34999999971\n"
- + "EXPR$0=2; EXPR$1=132666.26999999944\n"
- + "EXPR$0=3; EXPR$1=140271.88999999964\n"
- + "EXPR$0=4; EXPR$1=152671.61999999985")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\","
+ "\"dimensions\":[{\"type\":\"default\",\"dimension\":\"vc\",\"outputName\":\"vc\",\"outputType\":\"LONG\"}],"
+ "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
"QUARTER"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("EXPR$0=1; EXPR$1=139628.34999999971\n"
+ + "EXPR$0=2; EXPR$1=132666.26999999944\n"
+ + "EXPR$0=3; EXPR$1=140271.88999999964\n"
+ + "EXPR$0=4; EXPR$1=152671.61999999985");
}
@Test void testCastTimestamp1() {
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 72ebf98..be2b8fb 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -24,12 +24,14 @@ 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;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -48,15 +50,9 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
/**
* Tests for the {@code org.apache.calcite.adapter.druid} package.
*
- * <p>Before calling this test, you need to populate Druid, as follows:
- *
- * <blockquote><code>
- * git clone https://github.com/vlsi/calcite-test-dataset<br>
- * cd calcite-test-dataset<br>
- * mvn install
- * </code></blockquote>
- *
- * <p>This will create a virtual machine with Druid and test data set.
+ * <p>Druid must be up and running with foodmart and wikipedia datasets loaded. Follow the
+ * instructions on <a href="https://github.com/zabetak/calcite-druid-dataset">calcite-druid-dataset
+ * </a> to setup Druid before launching these tests.</p>
*
* <p>Features not yet implemented:
* <ul>
@@ -146,7 +142,7 @@ public class DruidAdapterIT {
+ "EnumerableInterpreter\n"
+ " DruidQuery(table=[[wiki, wiki]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[=($13, 'Jeremy Corbyn')], groups=[{5}], aggs=[[]])\n";
+ + "filter=[=($13, 'Jeremy Corbyn')], projects=[[$5]], groups=[{0}], aggs=[[]])\n";
checkSelectDistinctWiki(WIKI, "wiki")
.explainContains(explain);
}
@@ -156,7 +152,7 @@ public class DruidAdapterIT {
+ "EnumerableInterpreter\n"
+ " DruidQuery(table=[[wiki, wiki]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[=($16, 'Jeremy Corbyn')], groups=[{6}], aggs=[[]])\n";
+ + "filter=[=($16, 'Jeremy Corbyn')], projects=[[$6]], groups=[{0}], aggs=[[]])\n";
checkSelectDistinctWiki(WIKI_AUTO, "wiki")
.explainContains(explain);
}
@@ -173,7 +169,7 @@ public class DruidAdapterIT {
+ "EnumerableInterpreter\n"
+ " DruidQuery(table=[[wiki, wikipedia]], "
+ "intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], "
- + "filter=[=($16, 'Jeremy Corbyn')], groups=[{6}], aggs=[[]])\n";
+ + "filter=[=($16, 'Jeremy Corbyn')], projects=[[$6]], groups=[{0}], aggs=[[]])\n";
final String druidQuery = "{'queryType':'groupBy',"
+ "'dataSource':'wikipedia','granularity':'all',"
+ "'dimensions':[{'type':'default','dimension':'countryName','outputName':'countryName',"
@@ -198,8 +194,8 @@ public class DruidAdapterIT {
+ "from \"wikipedia\"\n"
+ "group by floor(\"__time\" to DAY)";
final String explain = "PLAN="
- + "EnumerableInterpreter\n"
- + " BindableProject(EXPR$0=[$1])\n"
+ + "EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1])\n"
+ + " EnumerableInterpreter\n"
+ " DruidQuery(table=[[wiki, wikipedia]], 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':'wikipedia','descending':false,'granularity':{'type':'period','period':'P1D','timeZone':'UTC'},"
@@ -384,7 +380,7 @@ public class DruidAdapterIT {
@Test void testSelectDistinct() {
final String explain = "PLAN="
+ "EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{30}], aggs=[[]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$30]], groups=[{0}], 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','outputName':'state_province'"
@@ -880,10 +876,11 @@ public class DruidAdapterIT {
+ "union all\n"
+ "select distinct \"marital_status\" from \"foodmart\"";
final String explain = "PLAN="
- + "EnumerableInterpreter\n"
- + " BindableUnion(all=[true])\n"
- + " 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=[[]])";
+ + "EnumerableUnion(all=[true])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39]], groups=[{0}], aggs=[[]])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$37]], groups=[{0}], aggs=[[]])\n";
sql(sql)
.explainContains(explain)
.returnsUnordered(
@@ -903,8 +900,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.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=[[]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$39]], groups=[{0}], aggs=[[]])\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$37]], groups=[{0}], aggs=[[]])";
sql(sql)
.explainContains(explain)
.returnsUnordered("gender=M",
@@ -919,7 +916,7 @@ public class DruidAdapterIT {
+ "'context':{'skipEmptyBuckets':false}}";
final String explain = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[0]], groups=[{}], aggs=[[COUNT()]])";
+ + "2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])";
final String sql = "select count(*) from \"foodmart\"";
sql(sql)
.returns("EXPR$0=86829\n")
@@ -1248,14 +1245,14 @@ public class DruidAdapterIT {
final String explain = "PLAN=EnumerableInterpreter\n"
+ " BindableSort(sort0=[$1], dir0=[DESC], fetch=[2])\n"
+ " BindableProject(state_province=[$0], CDC=[FLOOR($1)])\n"
- + " BindableAggregate(group=[{1}], agg#0=[COUNT($0)])\n"
+ + " BindableAggregate(group=[{0}], agg#0=[COUNT($1)])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{29, 30}], "
- + "aggs=[[]])";
+ + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ + "projects=[[$30, $29]], groups=[{0, 1}], aggs=[[]])";
final String druidQuery = "{'queryType':'groupBy','dataSource':'foodmart',"
- + "'granularity':'all','dimensions':[{'type':'default','dimension':'city','outputName':'city'"
- + ",'outputType':'STRING'},"
- + "{'type':'default','dimension':'state_province','outputName':'state_province','outputType':'STRING'}],"
+ + "'granularity':'all','dimensions':["
+ + "{'type':'default','dimension':'state_province','outputName':'state_province','outputType':'STRING'},"
+ + "{'type':'default','dimension':'city','outputName':'city','outputType':'STRING'}],"
+ "'limitSpec':{'type':'default'},'aggregations':[],"
+ "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
sql(sql)
@@ -1272,8 +1269,8 @@ public class DruidAdapterIT {
final String sql = "select \"product_name\", 0 as zero\n"
+ "from \"foodmart\"\n"
+ "order by \"product_name\"";
- final String explain = "PLAN=EnumerableInterpreter\n"
- + " BindableSort(sort0=[$0], dir0=[ASC])\n"
+ final String explain = "PLAN=EnumerableSort(sort0=[$0], dir0=[ASC])\n"
+ + " EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$3, 0]])";
sql(sql)
@@ -1381,9 +1378,10 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1997-04-01T00:00:00.000Z/"
+ "1997-05-01T00:00:00.000Z, 1997-06-01T00:00:00.000Z/1997-07-01T00:00:00.000Z]],"
+ " projects=[[0]], groups=[{}], aggs=[[COUNT()]])";
- sql(sql)
- .returnsUnordered("C=13500")
- .explainContains(explain);
+ CalciteAssert.AssertQuery q = sql(sql)
+ .returnsUnordered("C=13500");
+ Assumptions.assumeTrue(Bug.CALCITE_4213_FIXED, "CALCITE-4213");
+ q.explainContains(explain);
}
@Test void testFilterSwapped() {
@@ -1624,8 +1622,7 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1997-01-01T00:00:00.000Z/1998-01-01T00:00:00.000Z]], "
+ "filter=[AND(>=(CAST($11):INTEGER, 8), <=(CAST($11):INTEGER, 10), "
- + "<(CAST($10):INTEGER, 15))], groups=[{}], "
- + "aggs=[[SUM($90)]])\n")
+ + "<(CAST($10):INTEGER, 15))], projects=[[$90]], groups=[{}], aggs=[[SUM($0)]])\n")
.returnsUnordered("EXPR$0=75364.1")
.queryContains(new DruidChecker(druidQuery));
}
@@ -1920,8 +1917,9 @@ public class DruidAdapterIT {
@Test void testTimeExtractThatCannotBePushed() {
final String sql = "SELECT extract(CENTURY from \"timestamp\") from \"foodmart\" where "
+ "\"product_id\" = 1558 group by extract(CENTURY from \"timestamp\")";
- final String plan = "PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{0}])\n"
+ final String plan = "PLAN="
+ + "EnumerableAggregate(group=[{0}])\n"
+ + " EnumerableInterpreter\n"
+ " BindableProject(EXPR$0=[EXTRACT(FLAG(CENTURY), $0)])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
@@ -2017,12 +2015,13 @@ public class DruidAdapterIT {
+ " 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=[[+($1, $2), $0]], sort0=[0], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("A=369117.52790000016; store_state=WA",
- "A=222698.26509999996; store_state=CA",
- "A=199049.57059999998; store_state=OR")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("A=369117.52790000016; store_state=WA",
+ "A=222698.26509999996; store_state=CA",
+ "A=199049.57059999998; store_state=OR");
}
@Test void testDivideArithmeticOperation() {
@@ -2033,12 +2032,13 @@ public class DruidAdapterIT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=OR; A=2.506091302943239",
- "store_state=CA; A=2.505379741272971",
- "store_state=WA; A=2.5045806163801996")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=OR; A=2.506091302943239",
+ "store_state=CA; A=2.505379741272971",
+ "store_state=WA; A=2.5045806163801996");
}
@Test void testMultiplyArithmeticOperation() {
@@ -2049,12 +2049,13 @@ public class DruidAdapterIT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=WA; A=2.7783838325212463E10",
- "store_state=CA; A=1.0112000537448784E10",
- "store_state=OR; A=8.077425041941243E9")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=2.7783838325212463E10",
+ "store_state=CA; A=1.0112000537448784E10",
+ "store_state=OR; A=8.077425041941243E9");
}
@Test void testMinusArithmeticOperation() {
@@ -2066,12 +2067,13 @@ public class DruidAdapterIT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=WA; A=158468.91210000002",
- "store_state=CA; A=95637.41489999992",
- "store_state=OR; A=85504.56939999988")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=158468.91210000002",
+ "store_state=CA; A=95637.41489999992",
+ "store_state=OR; A=85504.56939999988");
}
@Test void testConstantPostAggregator() {
@@ -2082,12 +2084,13 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63, $90]], groups=[{0}], aggs=[[SUM($1)]], "
+ "post_projects=[[$0, +($1, 100)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=WA; A=263893.2200000001",
- "store_state=CA; A=159267.83999999994",
- "store_state=OR; A=142377.06999999992")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=263893.2200000001",
+ "store_state=CA; A=159267.83999999994",
+ "store_state=OR; A=142377.06999999992");
}
@Test void testRecursiveArithmeticOperation() {
@@ -2099,8 +2102,8 @@ public class DruidAdapterIT {
+ "'(-1 * (((\\'$f1\\' - \\'$f2\\') / (\\'$f3\\' * 3)) + \\'B\\'))'}]";
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, $89, $90, $91]], groups=[{0}], "
- + "aggs=[[SUM($2), SUM($3), COUNT(), SUM($1)]], post_projects=[[$0, *(-1, +(/(-($1, $2), "
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $90, $91, $89]], groups=[{0}], "
+ + "aggs=[[SUM($1), SUM($2), COUNT(), SUM($3)]], post_projects=[[$0, *(-1, +(/(-($1, $2), "
+ "*($3, 3)), $4))]], sort0=[1], dir0=[DESC])";
sql(sqlQuery, FOODMART)
.returnsOrdered("store_state=OR; C=-67660.31890435601",
@@ -2118,8 +2121,8 @@ public class DruidAdapterIT {
+ "'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]], projects=[[$2, $63, $91]], groups=[{1}], aggs=[[SUM($2), "
- + "COUNT(DISTINCT $0)]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $91, $2]], groups=[{0}], aggs=[[SUM($1), "
+ + "COUNT(DISTINCT $2)]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
foodmartApprox(sqlQuery)
.runs()
.explainContains(plan)
@@ -2172,12 +2175,13 @@ public class DruidAdapterIT {
+ " 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), COUNT()]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=OR; A=2.6271402406293403",
- "store_state=CA; A=2.599338206292706",
- "store_state=WA; A=2.5828708592868717")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=OR; A=2.6271402406293403",
+ "store_state=CA; A=2.599338206292706",
+ "store_state=WA; A=2.5828708592868717");
}
@Test void testPartiallyPostAggregation() {
@@ -2189,15 +2193,16 @@ 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), "
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $90, $91, $89]], groups=[{0}], "
+ + "aggs=[[SUM($1), SUM($2), SUM($3)]], 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",
- "store_state=WA; A=2.5045806163801996; B=124366.0")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=OR; A=2.506091302943239; B=67659.0",
+ "store_state=CA; A=2.505379741272971; B=74748.0",
+ "store_state=WA; A=2.5045806163801996; B=124366.0");
}
@Test void testDuplicateReferenceOnPostAggregation() {
@@ -2211,12 +2216,13 @@ public class DruidAdapterIT {
+ "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",
- "store_state=OR; A=142377.06999999992; C=85604.56939999988")
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=WA; A=263893.2200000001; C=158568.91210000002",
+ "store_state=CA; A=159267.83999999994; C=95737.41489999992",
+ "store_state=OR; A=142377.06999999992; C=85604.56939999988");
}
@Test void testDivideByZeroDoubleTypeInfinity() {
@@ -2296,16 +2302,18 @@ 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]], 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",
- "store_state=CA; brand_name=Toretti; A=32.24650000000001",
- "store_state=WA; brand_name=King; A=34.6104",
- "store_state=OR; brand_name=Toretti; A=36.3")
+ + "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])";
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=CA; brand_name=King; A=21.4632",
+ "store_state=OR; brand_name=Symphony; A=32.176",
+ "store_state=CA; brand_name=Toretti; A=32.24650000000001",
+ "store_state=WA; brand_name=King; A=34.6104",
+ "store_state=OR; brand_name=Toretti; A=36.3");
}
@Test void testInterleaveBetweenAggregateAndGroupOrderByOnDimension() {
@@ -2317,16 +2325,18 @@ 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]], groups=[{2, 63}], aggs=[[SUM($90), SUM($91)]], post_projects"
- + "=[[$1, $0, +($2, $3)]], sort0=[1], sort1=[0], dir0=[ASC], dir1=[ASC], fetch=[5])";
- sql(sqlQuery, FOODMART)
- .returnsOrdered("store_state=CA; brand_name=ADJ; A=222.1524",
- "store_state=OR; brand_name=ADJ; A=186.60359999999997",
- "store_state=WA; brand_name=ADJ; A=216.9912",
- "store_state=CA; brand_name=Akron; A=250.349",
- "store_state=OR; brand_name=Akron; A=278.69720000000007")
- .explainContains(plan)
- .queryContains(new DruidChecker(postAggString));
+ + "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], fetch=[5])";
+ CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ .explainContains(plan)
+ .queryContains(new DruidChecker(postAggString));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("store_state=CA; brand_name=ADJ; A=222.1524",
+ "store_state=OR; brand_name=ADJ; A=186.60359999999997",
+ "store_state=WA; brand_name=ADJ; A=216.9912",
+ "store_state=CA; brand_name=Akron; A=250.349",
+ "store_state=OR; brand_name=Akron; A=278.69720000000007");
}
@Test void testOrderByOnMetricsInSelectDruidQuery() {
@@ -2667,20 +2677,21 @@ public class DruidAdapterIT {
@Test void testFilterClauseWithMetricRefAndAggregates() {
String sql = "select sum(\"store_sales\"), \"product_id\" "
+ "from \"foodmart\" where \"product_id\" > 1553 and \"store_cost\" > 5 group by \"product_id\"";
- String expectedSubExplain =
- "PLAN=EnumerableInterpreter\n"
- + " BindableProject(EXPR$0=[$1], product_id=[$0])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(>"
- + "(CAST($1):INTEGER, 1553), >($91, 5))], groups=[{1}], aggs=[[SUM($90)]])";
+ String expectedSubExplain = "PLAN="
+ + "EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1], product_id=[$t0])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], filter=[AND(>(CAST($1):INTEGER, 1553), >($91, 5))], "
+ + "projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]])";
- sql(sql)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains(expectedSubExplain)
.queryContains(
new DruidChecker("\"queryType\":\"groupBy\"", "{\"type\":\"bound\","
+ "\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true,"
- + "\"ordering\":\"numeric\"}"))
- .returnsUnordered("EXPR$0=10.16; product_id=1554\n"
+ + "\"ordering\":\"numeric\"}"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsUnordered("EXPR$0=10.16; product_id=1554\n"
+ "EXPR$0=45.05; product_id=1556\n"
+ "EXPR$0=88.5; product_id=1555");
}
@@ -2834,26 +2845,27 @@ public class DruidAdapterIT {
* approximate results are not acceptable. */
@Test void testDistinctCountWhenApproxResultsNotAccepted() {
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.000Z/2992-01-10T00:00:00.000Z]], "
- + "groups=[{63}], aggs=[[]])";
-
+ String expectedSubExplain = "PLAN="
+ + "EnumerableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], projects=[[$63]], groups=[{0}], aggs=[[]])\n";
testCountWithApproxDistinct(false, sql, expectedSubExplain);
}
@Test void testDistinctCountOnMetric() {
final String sql = "select count(distinct \"store_sales\") from \"foodmart\" "
+ "where \"store_state\" = 'WA'";
- final String expectedSubExplainNoApprox = "PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')"
- + "], groups=[{90}], aggs=[[]])";
+ final String expectedSubExplainNoApprox = "PLAN="
+ + "EnumerableAggregate(group=[{}], EXPR$0=[COUNT($0)])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')], projects=[[$90]], "
+ + "groups=[{0}], aggs=[[]])";
final String expectedSubPlanWithApprox = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')], groups=[{}], "
- + "aggs=[[COUNT(DISTINCT $90)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], filter=[=($63, 'WA')], projects=[[$90]], "
+ + "groups=[{}], aggs=[[COUNT(DISTINCT $0)]])";
testCountWithApproxDistinct(true, sql, expectedSubPlanWithApprox, "'queryType':'timeseries'");
testCountWithApproxDistinct(false, sql, expectedSubExplainNoApprox, "'queryType':'groupBy'");
@@ -2864,7 +2876,7 @@ public class DruidAdapterIT {
String sql = "select \"brand_name\", count(\"store_sales\") from \"foodmart\" "
+ "group by \"brand_name\"";
String expectedSubExplain = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{2}], aggs=[[COUNT($90)]])";
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], projects=[[$2, $90]], groups=[{0}], aggs=[[COUNT($1)]])";
testCountWithApproxDistinct(true, sql, expectedSubExplain, "\"queryType\":\"groupBy\"");
testCountWithApproxDistinct(false, sql, expectedSubExplain, "\"queryType\":\"groupBy\"");
@@ -2875,7 +2887,7 @@ public class DruidAdapterIT {
String sql = "select count(*) from \"foodmart\"";
String expectedSubExplain = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], projects=[[0]], groups=[{}], aggs=[[COUNT()]])";
+ + "2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])";
sql(sql).explainContains(expectedSubExplain);
}
@@ -2887,7 +2899,7 @@ public class DruidAdapterIT {
+ "group by \"B\"";
String expectedSubExplain = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], groups=[{63}], aggs=[[COUNT($89)]])";
+ + "2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0}], aggs=[[COUNT($1)]])";
testCountWithApproxDistinct(true, sql, expectedSubExplain);
testCountWithApproxDistinct(false, sql, expectedSubExplain);
@@ -2897,13 +2909,16 @@ public class DruidAdapterIT {
final String sql = "select \"B\", count(distinct \"A\") from "
+ "(select \"unit_sales\" as \"A\", \"store_state\" as \"B\" from \"foodmart\") "
+ "group by \"B\"";
- final String expectedSubExplainNoApprox = "PLAN=EnumerableInterpreter\n"
- + " BindableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n"
+ final String expectedSubExplainNoApprox = "PLAN="
+ + "EnumerableAggregate(group=[{0}], EXPR$1=[COUNT($1)])\n"
+ + " EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0, 1}], aggs=[[]])";
- final String expectedPlanWithApprox = "PLAN=EnumerableInterpreter\n"
- + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
- + "2992-01-10T00:00:00.000Z]], groups=[{63}], aggs=[[COUNT(DISTINCT $89)]])";
+ final String expectedPlanWithApprox = "PLAN="
+ + "EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], projects=[[$63, $89]], groups=[{0}], aggs=[[COUNT"
+ + "(DISTINCT $1)]])\n";
testCountWithApproxDistinct(true, sql, expectedPlanWithApprox, "'queryType':'groupBy'");
testCountWithApproxDistinct(false, sql, expectedSubExplainNoApprox, "'queryType':'groupBy'");
@@ -3078,7 +3093,7 @@ public class DruidAdapterIT {
+ "where cast(\"product_id\" as double) = 1016.0";
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($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])";
+ + "filter=[=(CAST($1):DOUBLE, 1016.0)], projects=[[$91]], groups=[{}], aggs=[[SUM($0)]])";
final String druidQuery =
"{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all',"
+ "'filter':{'type':'bound','dimension':'product_id','lower':'1016.0',"
@@ -3105,7 +3120,7 @@ public class DruidAdapterIT {
+ "where cast(\"product_id\" as double) <> 1016.0";
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($1):DOUBLE, 1016.0)], groups=[{}], aggs=[[SUM($91)]])";
+ + "filter=[<>(CAST($1):DOUBLE, 1016.0)], projects=[[$91]], groups=[{}], aggs=[[SUM($0)]])";
final String druidQuery =
"{'queryType':'timeseries','dataSource':'foodmart','descending':false,'granularity':'all',"
+ "'filter':{'type':'not','field':{'type':'bound','dimension':'product_id','"
@@ -3415,7 +3430,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]], "
- + "projects=[[0]], groups=[{}], aggs=[[COUNT()]])")
+ + "groups=[{}], aggs=[[COUNT()]])")
.queryContains(
new DruidChecker(
"{\"queryType\":\"timeseries\",\"dataSource\":\"foodmart\","
@@ -3658,11 +3673,11 @@ public class DruidAdapterIT {
.returnsOrdered("EXPR$0=1997-01-01 00:00:00; EXPR$1=117")
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\""
- + "(timestamp_floor(timestamp_parse(concat(concat(",
- "== timestamp_floor("));
+ + "(852076800000 == timestamp_floor(timestamp_parse(timestamp_format("));
}
@Test void testDruidTimeFloorAndTimeParseExpressions2() {
+ Assumptions.assumeTrue(Bug.CALCITE_4205_FIXED, "CALCITE-4205");
final String sql = "SELECT CAST(\"timestamp\" AS TIMESTAMP), count(*) "
+ "from \"foodmart\" WHERE "
+ "CAST(('1997' || '-01' || '-01') AS TIMESTAMP) = CAST(\"timestamp\" AS TIMESTAMP) "
@@ -3811,14 +3826,14 @@ public class DruidAdapterIT {
+ " AND CAST(SUBSTRING(\"product_id\" from 4 for 1) AS INTEGER) = 7"
+ " AND CAST(SUBSTRING(\"product_id\" from 4) AS INTEGER) = 7"
+ " Group by SUBSTRING(\"product_id\" from 1 for 4)";
- final String plan = "PLAN=EnumerableInterpreter\n"
- + " BindableProject(C=[$1], EXPR$1=[$0])\n"
- + " DruidQuery(table=[[foodmart, foodmart]], "
- + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
- + "filter=[AND(LIKE(SUBSTRING($1, 1, 4), '12%'), =(CHAR_LENGTH($1), 4), "
- + "=(SUBSTRING($1, 3, 1), '2'), =(CAST(SUBSTRING($1, 2, 1)):INTEGER, 2), "
- + "=(CAST(SUBSTRING($1, 4, 1)):INTEGER, 7), =(CAST(SUBSTRING($1, 4)):INTEGER, 7))], "
- + "projects=[[SUBSTRING($1, 1, 4)]], groups=[{0}], aggs=[[COUNT()]])";
+ final String plan = "PLAN="
+ + "EnumerableCalc(expr#0..1=[{inputs}], C=[$t1], EXPR$1=[$t0])\n"
+ + " EnumerableInterpreter\n"
+ + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
+ + ".000Z/2992-01-10T00:00:00.000Z]], filter=[AND(LIKE(SUBSTRING($1, 1, 4), '12%'), ="
+ + "(CHAR_LENGTH($1), 4), =(SUBSTRING($1, 3, 1), '2'), =(CAST(SUBSTRING($1, 2, 1))"
+ + ":INTEGER, 2), =(CAST(SUBSTRING($1, 4, 1)):INTEGER, 7), =(CAST(SUBSTRING($1, 4))"
+ + ":INTEGER, 7))], projects=[[SUBSTRING($1, 1, 4)]], groups=[{0}], aggs=[[COUNT()]])\n";
sql(sql, FOODMART)
.returnsOrdered("C=60; EXPR$1=1227")
.explainContains(plan)
@@ -3906,7 +3921,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(>(SIN($91), SIN(20)), >(COS($90), COS(20)), =(FLOOR(TAN($91)), 2), "
+ + "filter=[AND(>(SIN($91), 9.129452507276277E-1), >(COS($90), 4.08082061813392E-1), =(FLOOR(TAN($91)), 2), "
+ "<(ABS(-(TAN($91), /(SIN($91), COS($91)))), 1.0E-6))], "
+ "groups=[{}], aggs=[[COUNT()]])");
}
@@ -3938,7 +3953,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(=(CAST($1):INTEGER, 1020)), <>(CAST($1):INTEGER, 1020))],"
+ + "filter=[<>(CAST($1):INTEGER, 1020)],"
+ " groups=[{}], aggs=[[COUNT()]])");
final String sql2 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + "WHERE "
+ "\"product_id\" <> 1020";
@@ -4160,9 +4175,7 @@ public class DruidAdapterIT {
+ "\"timeZone\":\"UTC\",\"locale\":\"en-US\"}}";
final String extract_expression = "\"expression\":\"(((timestamp_extract(\\\"__time\\\",";
- sql(sql, FOODMART)
- .returnsOrdered(
- "QR_TIMESTAMP_OK=1; SUM_STORE_SALES=139628.34999999971; YR_TIMESTAMP_OK=1997")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker("\"queryType\":\"groupBy\"", extract_year, extract_expression))
.explainContains("PLAN=EnumerableInterpreter\n"
@@ -4170,6 +4183,9 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "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])");
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered(
+ "QR_TIMESTAMP_OK=1; SUM_STORE_SALES=139628.34999999971; YR_TIMESTAMP_OK=1997");
}
@Test void testTableauQueryExtractMonthDayYear() {
@@ -4198,9 +4214,7 @@ public class DruidAdapterIT {
+ " AS hr_t_timestamp_ok2 FROM \"foodmart\" GROUP BY "
+ " CAST(SUBSTRING(CAST(CAST(\"foodmart\".\"timestamp\" AS TIMESTAMP) AS VARCHAR) from 12 for 2 ) AS INT),"
+ " MINUTE(\"foodmart\".\"timestamp\"), EXTRACT(HOUR FROM \"timestamp\")) LIMIT 1";
- sql(sql, FOODMART)
- .returnsOrdered("HR_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; "
- + "SUM_T_OTHER_OK=565238.1299999986; HR_T_TIMESTAMP_OK2=0")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("BindableProject(HR_T_TIMESTAMP_OK=[$0], MI_T_TIMESTAMP_OK=[$1], "
+ "SUM_T_OTHER_OK=[$3], HR_T_TIMESTAMP_OK2=[$2])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -4209,6 +4223,9 @@ public class DruidAdapterIT {
+ "NOT NULL, 12, 2)):INTEGER NOT NULL, EXTRACT(FLAG(MINUTE), $0), "
+ "EXTRACT(FLAG(HOUR), $0), $90]], groups=[{0, 1, 2}], aggs=[[SUM($3)]], fetch=[1])")
.queryContains(new DruidChecker("\"queryType\":\"groupBy\""));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("HR_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; "
+ + "SUM_T_OTHER_OK=565238.1299999986; HR_T_TIMESTAMP_OK2=0");
}
@Test void testTableauQueryMinutesSecondsExtract() {
@@ -4216,14 +4233,15 @@ public class DruidAdapterIT {
+ "MINUTE(\"timestamp\") AS mi_t_timestamp_ok, SUM(\"store_sales\") AS sum_store_sales "
+ " FROM \"foodmart\" GROUP BY SECOND(\"timestamp\"), MINUTE(\"timestamp\"))"
+ " LIMIT_ZERO LIMIT 1";
- sql(sql, FOODMART)
- .returnsOrdered(
- "SC_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; SUM_STORE_SALES=565238.1299999986")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[EXTRACT(FLAG(SECOND), $0), "
+ "EXTRACT(FLAG(MINUTE), $0), $90]], groups=[{0, 1}], aggs=[[SUM($2)]], fetch=[1])")
.queryContains(new DruidChecker("\"queryType\":\"groupBy\""));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered(
+ "SC_T_TIMESTAMP_OK=0; MI_T_TIMESTAMP_OK=0; SUM_STORE_SALES=565238.1299999986");
}
@Test void testQueryWithExtractsTimes() {
@@ -4264,8 +4282,7 @@ public class DruidAdapterIT {
@Test void testHavingSpecs() {
final String sql = "SELECT \"product_id\" AS P, SUM(\"store_sales\") AS S FROM \"foodmart\" "
+ " GROUP BY \"product_id\" HAVING SUM(\"store_sales\") > 220 ORDER BY P LIMIT 2";
- sql(sql, FOODMART)
- .returnsOrdered("P=1; S=236.55", "P=10; S=230.04")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]], "
@@ -4273,20 +4290,23 @@ public class DruidAdapterIT {
.queryContains(
new DruidChecker("'having':{'type':'filter','filter':{'type':'bound',"
+ "'dimension':'S','lower':'220','lowerStrict':true,'ordering':'numeric'}}"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("P=1; S=236.55", "P=10; S=230.04");
}
@Test void testTransposableHavingFilter() {
final String sql = "SELECT \"product_id\" AS P, SUM(\"store_sales\") AS S FROM \"foodmart\" "
+ " GROUP BY \"product_id\" HAVING SUM(\"store_sales\") > 220 AND \"product_id\" > '10'"
+ " ORDER BY P LIMIT 2";
- sql(sql, FOODMART)
- .returnsOrdered("P=100; S=343.19999999999993", "P=1000; S=532.62")
+ CalciteAssert.AssertQuery q = 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=[>($1, '10')], projects=[[$1, $90]], groups=[{0}],"
+ " aggs=[[SUM($1)]], filter=[>($1, 220)], sort0=[0], dir0=[ASC], fetch=[2])\n")
.queryContains(
new DruidChecker("{'queryType':'groupBy','dataSource':'foodmart','granularity':'all'"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("P=100; S=343.19999999999993", "P=1000; S=532.62");
}
@Test void testProjectSameColumnMultipleTimes() {
@@ -4347,8 +4367,7 @@ public class DruidAdapterIT {
@Test void testGroupBy1() {
final String sql = "SELECT SUM(\"store_sales\") FROM \"foodmart\" "
+ "GROUP BY 1 HAVING (COUNT(1) > 0)";
- sql(sql, FOODMART)
- .returnsOrdered("EXPR$0=565238.1299999986")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker("{'queryType':'groupBy','dataSource':'foodmart','granularity':'all',"
+ "'dimensions':[{'type':'default','dimension':'vc','outputName':'vc','outputType':'LONG'}],"
@@ -4358,6 +4377,8 @@ public class DruidAdapterIT {
+ "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],'having':"
+ "{'type':'filter','filter':{'type':'bound','dimension':'$f2','lower':'0',"
+ "'lowerStrict':true,'ordering':'numeric'}}}"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "XLAKY");
+ q.returnsOrdered("EXPR$0=565238.1299999986");
}
@Test void testFloorQuarter() {
@@ -4397,10 +4418,7 @@ public class DruidAdapterIT {
+ " WHERE \"product_id\" = 1"
+ " GROUP BY EXTRACT(quarter from \"timestamp\"), \"product_id\"";
- sql(sql, FOODMART).returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.050000000000004\n"
- + "EXPR$0=2; product_id=1; EXPR$2=62.7\n"
- + "EXPR$0=3; product_id=1; EXPR$2=88.35\n"
- + "EXPR$0=4; product_id=1; EXPR$2=48.45")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\",\"dimensions\":"
@@ -4408,6 +4426,11 @@ public class DruidAdapterIT {
+ "{\"type\":\"default\",\"dimension\":\"product_id\",\"outputName\":\"product_id\",\"outputType\":\"STRING\"}],"
+ "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
"QUARTER"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.050000000000004\n"
+ + "EXPR$0=2; product_id=1; EXPR$2=62.7\n"
+ + "EXPR$0=3; product_id=1; EXPR$2=88.35\n"
+ + "EXPR$0=4; product_id=1; EXPR$2=48.45");
}
@Test void testExtractQuarter() {
@@ -4415,16 +4438,18 @@ public class DruidAdapterIT {
+ FOODMART_TABLE
+ " GROUP BY EXTRACT(quarter from \"timestamp\")";
- sql(sql, FOODMART).returnsOrdered("EXPR$0=1; EXPR$1=139628.34999999971\n"
- + "EXPR$0=2; EXPR$1=132666.26999999944\n"
- + "EXPR$0=3; EXPR$1=140271.88999999964\n"
- + "EXPR$0=4; EXPR$1=152671.61999999985")
+ CalciteAssert.AssertQuery q = sql(sql, FOODMART)
.queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\","
+ "\"dimensions\":[{\"type\":\"default\",\"dimension\":\"vc\",\"outputName\":\"vc\",\"outputType\":\"LONG\"}],"
+ "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
"QUARTER"));
+ Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
+ q.returnsOrdered("EXPR$0=1; EXPR$1=139628.34999999971\n"
+ + "EXPR$0=2; EXPR$1=132666.26999999944\n"
+ + "EXPR$0=3; EXPR$1=140271.88999999964\n"
+ + "EXPR$0=4; EXPR$1=152671.61999999985");
}
[calcite] 04/04: Minor refactoring of DruidAdapterIT and
DruidAdapter2IT
Posted by za...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zabetak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 32ac7311cef3aa539538a069026d21b1a31f1d24
Author: Stamatis Zampetakis <za...@gmail.com>
AuthorDate: Wed Sep 2 15:03:04 2020 +0300
Minor refactoring of DruidAdapterIT and DruidAdapter2IT
1. Remove unecessary escaping of \'
2. Methods always called with the same literals
3. Remove exceptions never thrown from method signatures
---
.../org/apache/calcite/test/DruidAdapter2IT.java | 219 ++++++++++-----------
.../org/apache/calcite/test/DruidAdapterIT.java | 19 +-
2 files changed, 112 insertions(+), 126 deletions(-)
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
index a2bcf78..b48519e 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
@@ -86,33 +86,24 @@ public class DruidAdapter2IT {
/** Creates a query against FOODMART with approximate parameters. */
private CalciteAssert.AssertQuery foodmartApprox(String sql) {
- return approxQuery(FOODMART, sql);
- }
-
- private CalciteAssert.AssertQuery approxQuery(URL url, String sql) {
return CalciteAssert.that()
.enable(enabled())
- .withModel(url)
+ .withModel(FOODMART)
.with(CalciteConnectionProperty.APPROXIMATE_DISTINCT_COUNT.camelName(), true)
.with(CalciteConnectionProperty.APPROXIMATE_TOP_N.camelName(), true)
.with(CalciteConnectionProperty.APPROXIMATE_DECIMAL.camelName(), true)
.query(sql);
}
- /** Creates a query against a data set given by a map. */
- private CalciteAssert.AssertQuery sql(String sql, URL url) {
+ /** Creates a query against the {@link #FOODMART} data set. */
+ private CalciteAssert.AssertQuery sql(String sql) {
return CalciteAssert.that()
.enable(enabled())
- .withModel(url)
+ .withModel(FOODMART)
.query(sql);
}
- /** Creates a query against the {@link #FOODMART} data set. */
- private CalciteAssert.AssertQuery sql(String sql) {
- return sql(sql, FOODMART);
- }
-
- @Test void testMetadataColumns() throws Exception {
+ @Test void testMetadataColumns() {
sql("values 1")
.withConnection(c -> {
try {
@@ -1729,7 +1720,7 @@ public class DruidAdapter2IT {
+ " 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=[[+($1, $2), $0]], sort0=[0], dir0=[DESC])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1746,7 +1737,7 @@ public class DruidAdapter2IT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1763,7 +1754,7 @@ public class DruidAdapter2IT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1781,7 +1772,7 @@ public class DruidAdapter2IT {
+ " 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, $2)]], sort0=[1], dir0=[DESC])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1798,7 +1789,7 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63, $90]], groups=[{0}], aggs=[[SUM($1)]], "
+ "post_projects=[[$0, +($1, 100)]], sort0=[1], dir0=[DESC])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1817,7 +1808,7 @@ public class DruidAdapter2IT {
+ "'(-1 * (((\\'$f1\\' - \\'$f2\\') / (\\'$f3\\' * 3)) + \\'B\\'))'}]";
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, $90, $91, $89]], groups=[{0}], aggs=[[SUM($1), SUM($2), COUNT(), SUM($3)]], post_projects=[[$0, *(-1, +(/(-($1, $2), *($3, 3)), $4))]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.returnsOrdered("store_state=OR; C=-67660.31890435601",
"store_state=CA; C=-74749.30433035882",
"store_state=WA; C=-124367.29537914316")
@@ -1848,7 +1839,7 @@ public class DruidAdapter2IT {
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(=(";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains(plan)
.returnsOrdered("store_state=CA; brand_name=Bird Call; A=34.364599999999996",
"store_state=OR; brand_name=Bird Call; A=39.16359999999999",
@@ -1869,7 +1860,7 @@ public class DruidAdapter2IT {
+ "projects=[[$63, $90, $91]], "
+ "groups=[{0}], aggs=[[SUM($1), SUM($2)]], "
+ "post_projects=[[$0, 'Bird Call', -($1, $2)]])";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("store_state=CA; brand_name=Bird Call; A=34.364599999999996",
"store_state=OR; brand_name=Bird Call; A=39.16359999999999",
"store_state=WA; brand_name=Bird Call; A=53.742500000000014")
@@ -1886,7 +1877,7 @@ public class DruidAdapter2IT {
+ " 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), COUNT()]], post_projects=[[$0, /($1, $2)]], sort0=[1], dir0=[DESC])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1905,7 +1896,7 @@ public class DruidAdapter2IT {
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, $90, $91, $89]], groups=[{0}], aggs=[[SUM($1), SUM($2), SUM($3)]], post_projects=[[$0, /($1, $2), CASE(=($3, 0), 1.0:DECIMAL(19, 0), CAST($3):DECIMAL(19, 0))]], sort0=[1], dir0=[DESC])\n";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1925,7 +1916,7 @@ public class DruidAdapter2IT {
+ "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])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -1942,7 +1933,7 @@ public class DruidAdapter2IT {
+ " 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)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.returnsOrdered("store_state=CA; A=Infinity",
"store_state=OR; A=Infinity",
"store_state=WA; A=Infinity")
@@ -1960,7 +1951,7 @@ public class DruidAdapter2IT {
+ "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)
+ sql(sqlQuery)
.returnsOrdered("store_state=CA; A=-Infinity",
"store_state=OR; A=-Infinity",
"store_state=WA; A=-Infinity")
@@ -1977,7 +1968,7 @@ public class DruidAdapter2IT {
+ " 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, $1), 0)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.returnsOrdered("store_state=CA; A=NaN",
"store_state=OR; A=NaN",
"store_state=WA; A=NaN")
@@ -1993,7 +1984,7 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$63]], groups=[{0}], aggs=[[COUNT()]], "
+ "post_projects=[[$0, /(-($1, $1), 0)]], sort0=[1], dir0=[DESC])";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.explainContains(plan)
.throws_("Server returned HTTP response code: 500");
//@TODO It seems like calcite is not handling 500 error,
@@ -2012,7 +2003,7 @@ public class DruidAdapter2IT {
+ "\"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])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -2032,7 +2023,7 @@ public class DruidAdapter2IT {
+ "'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=[1], sort1=[0], dir0=[ASC], dir1=[ASC], fetch=[5])";
- CalciteAssert.AssertQuery q = sql(sqlQuery, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(postAggString));
Assumptions.assumeTrue(Bug.CALCITE_4204_FIXED, "CALCITE-4204");
@@ -2054,7 +2045,7 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1997-01-01T00:00:00.000Z/1997-09-01T00:00:00.000Z]], "
+ "projects=[[$90, $91, -($90, $91)]])";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.returnsOrdered("A=0.51; B=0.2448; C=0.2652",
"A=0.51; B=0.2397; C=0.2703",
"A=0.57; B=0.285; C=0.285",
@@ -2486,11 +2477,11 @@ public class DruidAdapter2IT {
* fields. */
@Test void testNotFilterForm() {
String sql = "select count(distinct \"the_month\") from "
- + "\"foodmart\" where \"the_month\" <> \'October\'";
+ + "\"foodmart\" where \"the_month\" <> 'October'";
String druidFilter = "'filter':{'type':'not',"
+ "'field':{'type':'selector','dimension':'the_month','value':'October'}}";
// Check that the filter actually worked, and that druid was responsible for the filter
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(new DruidChecker(druidFilter))
.returnsOrdered("EXPR$0=11");
}
@@ -2640,7 +2631,7 @@ public class DruidAdapter2IT {
+ "'aggregations':[{'type':'doubleSum','name':'A','fieldName':'store_cost'}],"
+ "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+ "'context':{'skipEmptyBuckets':false}}";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.explainContains(plan)
.queryContains(new DruidChecker(druidQuery))
.returnsUnordered("A=85.31639999999999");
@@ -2649,7 +2640,7 @@ public class DruidAdapter2IT {
+ "from \"foodmart\" "
+ "where cast(\"product_id\" as double) <= 1016.0 "
+ "and cast(\"product_id\" as double) >= 1016.0";
- sql(sqlQuery2, FOODMART)
+ sql(sqlQuery2)
.returnsUnordered("A=85.31639999999999");
}
@@ -2665,7 +2656,7 @@ public class DruidAdapter2IT {
+ "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.000Z/2992-01-10T00:00:00.000Z'],'context':{'skipEmptyBuckets':false}}";
- sql(sqlQuery, FOODMART)
+ sql(sqlQuery)
.explainContains(plan)
.returnsUnordered("A=225541.91720000014")
.queryContains(new DruidChecker(druidQuery));
@@ -2674,7 +2665,7 @@ public class DruidAdapter2IT {
+ "from \"foodmart\" "
+ "where cast(\"product_id\" as double) < 1016.0 "
+ "or cast(\"product_id\" as double) > 1016.0";
- sql(sqlQuery2, FOODMART)
+ sql(sqlQuery2)
.returnsUnordered("A=225541.91720000014");
}
@@ -2688,7 +2679,7 @@ public class DruidAdapter2IT {
+ "'aggregations':[{'type':'count','name':'C'}],"
+ "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+ "'context':{'skipEmptyBuckets':false}}";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(new DruidChecker(druidQuery))
.returnsUnordered("C=0")
.returnsCount(1);
@@ -2704,7 +2695,7 @@ public class DruidAdapter2IT {
+ "'aggregations':[{'type':'count','name':'C'}],"
+ "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],"
+ "'context':{'skipEmptyBuckets':false}}";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(new DruidChecker(druidQuery))
.returnsUnordered("C=86829");
}
@@ -2719,7 +2710,7 @@ public class DruidAdapter2IT {
final String druidQuery = "{'queryType':'scan','dataSource':'foodmart','intervals':"
+ "['1997-01-01T00:00:00.000Z/1997-04-01T00:00:00.000Z'],'virtualColumns':"
+ "[{'type':'expression','name':'vc','expression':'timestamp_floor(\\'__time\\'";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("T=1997-01-01 00:00:00", "T=1997-01-01 00:00:00")
.queryContains(
new DruidChecker(druidQuery));
@@ -2735,7 +2726,7 @@ public class DruidAdapter2IT {
+ "2992-01-10T00:00:00.000Z]], filter=[>=(FLOOR($0, FLAG(MONTH)), 1997-05-01 00:00:00)], "
+ "projects=[[FLOOR($0, FLAG(MONTH))]])";
- sql(sql, FOODMART).returnsOrdered("T=1997-05-01 00:00:00").explainContains(plan);
+ sql(sql).returnsOrdered("T=1997-05-01 00:00:00").explainContains(plan);
}
@Test void testTimeWithFilterOnFloorOnTimeAndCastToTimestamp() {
@@ -2746,7 +2737,7 @@ public class DruidAdapter2IT {
+ "['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z'],'filter':{'type':'bound',"
+ "'dimension':'__time','lower':'1997-05-01T00:00:00.000Z',"
+ "'lowerStrict':false,'ordering':'lexicographic','";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("T=1997-05-01 00:00:00")
.queryContains(new DruidChecker(druidQuery));
}
@@ -2758,7 +2749,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" "
+ "WHERE \"timestamp\" < CAST('1998-01-02' as TIMESTAMP) AND "
+ "EXTRACT(MONTH FROM \"timestamp\") = 01 AND EXTRACT(YEAR FROM \"timestamp\") = 1996 ";
- sql(sql, FOODMART)
+ sql(sql)
.runs()
.queryContains(new DruidChecker("{\"queryType\":\"timeseries\""));
}
@@ -2783,7 +2774,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsFilter() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where ABS(-EXP(LN(SQRT"
+ "(\"store_sales\")))) = 1";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(new DruidChecker("pow(\\\"store_sales\\\""))
.returnsUnordered("EXPR$0=32");
}
@@ -2791,14 +2782,14 @@ public class DruidAdapter2IT {
@Test void testExpressionsFilter2() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where CAST(SQRT(ABS(-\"store_sales\"))"
+ " /2 as INTEGER) = 1";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(new DruidChecker("(CAST((pow(abs((- \\\"store_sales\\\")),0.5) / 2),"))
.returnsUnordered("EXPR$0=62449");
}
@Test void testExpressionsLikeFilter() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where \"product_id\" LIKE '1%'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"like"))
.returnsUnordered("EXPR$0=36839");
@@ -2806,7 +2797,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsSTRLENFilter() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where CHAR_LENGTH(\"product_id\") = 2";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"expression\":\"(strlen(\\\"product_id\\\") == 2"))
.returnsUnordered("EXPR$0=4876");
@@ -2815,7 +2806,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsUpperLowerFilter() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where upper(lower(\"city\")) = "
+ "'SPOKANE'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"(upper"
+ "(lower(\\\"city\\\")) ==", "SPOKANE"))
@@ -2825,7 +2816,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsLowerUpperFilter() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where lower(upper(\"city\")) = "
+ "'spokane'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"(lower"
+ "(upper(\\\"city\\\")) ==", "spokane"))
@@ -2834,7 +2825,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsLowerFilterNotMatching() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where lower(\"city\") = 'Spokane'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"(lower"
+ "(\\\"city\\\") ==", "Spokane"))
@@ -2843,7 +2834,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsLowerFilterMatching() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where lower(\"city\") = 'spokane'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"(lower"
+ "(\\\"city\\\") ==", "spokane"))
@@ -2852,7 +2843,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsUpperFilterNotMatching() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where upper(\"city\") = 'Spokane'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"(upper"
+ "(\\\"city\\\") ==", "Spokane"))
@@ -2861,7 +2852,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsUpperFilterMatching() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where upper(\"city\") = 'SPOKANE'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\"(upper"
+ "(\\\"city\\\") ==", "SPOKANE"))
@@ -2871,7 +2862,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsConcatFilter() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where (\"city\" || '_extra') = "
+ "'Spokane_extra'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("{\"type\":\"expression\",\"expression\":\"(concat"
+ "(\\\"city\\\",", "Spokane_extra"))
@@ -2880,7 +2871,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsNotNull() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where (\"city\" || 'extra') IS NOT NULL";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("{\"type\":\"expression\",\"expression\":\"(concat"
+ "(\\\"city\\\",", "!= null"))
@@ -2890,7 +2881,7 @@ public class DruidAdapter2IT {
@Test void testComplexExpressionsIsNull() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where ( cast(null as INTEGER) + cast"
+ "(\"city\" as INTEGER)) IS NULL";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])")
.queryContains(
@@ -2905,7 +2896,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsConcatFilterMultipleColumns() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where (\"city\" || \"state_province\")"
+ " = 'SpokaneWA'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("(concat(\\\"city\\\",\\\"state_province\\\") ==", "SpokaneWA"))
.returnsUnordered("EXPR$0=7394");
@@ -2915,7 +2906,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where (\"city\" || \"state_province\")"
+ " = 'SpokaneWA' "
+ "AND \"state_province\" = 'WA'";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("(concat(\\\"city\\\",\\\"state_province\\\") ==",
"SpokaneWA",
@@ -2927,7 +2918,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where (\"city\" || \"state_province\")"
+ " = 'SpokaneWA' "
+ "OR (\"state_province\" = 'CA' AND \"city\" IS NOT NULL)";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("(concat(\\\"city\\\",\\\"state_province\\\") ==",
"SpokaneWA", "{\"type\":\"and\",\"fields\":[{\"type\":\"selector\","
@@ -2938,7 +2929,7 @@ public class DruidAdapter2IT {
@Test void testColumnAEqColumnB() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where \"city\" = \"state_province\"";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\""
+ "(\\\"city\\\" == \\\"state_province\\\")\"}"))
@@ -2947,7 +2938,7 @@ public class DruidAdapter2IT {
@Test void testColumnANotEqColumnB() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where \"city\" <> \"state_province\"";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\""
+ "(\\\"city\\\" != \\\"state_province\\\")\"}"))
@@ -2958,7 +2949,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where ((\"city\" || "
+ "\"state_province\") = 'SpokaneWA' OR (\"city\" || '_extra') = 'Spokane_extra') "
+ "AND \"state_province\" = 'WA'";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(OR(="
@@ -2974,7 +2965,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsFilterWithCast() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where CAST(( SQRT(\"store_sales\") - 1 "
+ ") / 3 + 1 AS INTEGER) > 1";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("(CAST((((pow(\\\"store_sales\\\",0.5) - 1) / 3) + 1)", "LONG"))
.returnsUnordered("EXPR$0=476");
@@ -2983,7 +2974,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsFilterWithCastTimeToDateToChar() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where CAST(CAST(\"timestamp\" as "
+ "DATE) as VARCHAR) = '1997-01-01'";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], "
@@ -2998,7 +2989,7 @@ public class DruidAdapter2IT {
@Test void testExpressionsFilterWithExtract() {
final String sql = "SELECT COUNT(*) FROM \"foodmart\" where CAST((EXTRACT(MONTH FROM "
+ "\"timestamp\") - 1 ) / 3 + 1 AS INTEGER) = 1";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker(",\"filter\":{\"type\":\"expression\",\"expression\":\"((("
+ "(timestamp_extract(\\\"__time\\\"", "MONTH", ") - 1) / 3) + 1) == 1"))
@@ -3044,7 +3035,7 @@ public class DruidAdapter2IT {
+ "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)
+ sql(sql)
.explainContains(plan)
.returnsOrdered("D=1997-01-01 00:00:00", "D=1997-01-02 00:00:00", "D=1997-01-03 00:00:00");
}
@@ -3054,7 +3045,7 @@ public class DruidAdapter2IT {
+ "from \"foodmart\" WHERE "
+ "CAST(('1997' || '-01' || '-01') AS DATE) = CAST(\"timestamp\" AS DATE) "
+ "GROUP BY \"timestamp\"";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("timestamp=1997-01-01 00:00:00; EXPR$1=117")
.queryContains(
new DruidChecker(
@@ -3068,7 +3059,7 @@ public class DruidAdapter2IT {
+ "from \"foodmart\" WHERE "
+ "CAST(('1997' || '-01' || '-01') AS TIMESTAMP) = CAST(\"timestamp\" AS TIMESTAMP) "
+ "GROUP BY \"timestamp\"";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("\"filter\":{\"type\":\"expression\",\"expression\":\""
+ "(timestamp_parse(concat(concat("))
@@ -3081,7 +3072,7 @@ public class DruidAdapter2IT {
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]],"
+ " filter=[=(FLOOR($90), 23)], groups=[{}], aggs=[[COUNT()]]";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=2")
.explainContains(plan)
.queryContains(new DruidChecker("\"queryType\":\"timeseries\""));
@@ -3090,7 +3081,7 @@ public class DruidAdapter2IT {
@Test void testExpressionFilterSimpleColumnAEqColumnB() {
final String sql = "SELECT count(*) from \"foodmart\" where \"product_id\" = \"city\"";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
@@ -3105,7 +3096,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM " + FOODMART_TABLE
+ "WHERE (CAST(\"product_id\" AS INTEGER) + 1 * \"store_sales\")/(\"store_cost\" - 5) "
+ "<= floor(\"store_sales\") * 25 + 2";
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker(
"\"filter\":{\"type\":\"expression\",\"expression\":\"(((CAST(\\\"product_id\\\", ",
@@ -3123,7 +3114,7 @@ public class DruidAdapter2IT {
@Test void testBooleanFilterExpressions() {
final String sql = "SELECT count(*) from " + FOODMART_TABLE
+ " WHERE (CAST((\"product_id\" <> '1') AS BOOLEAN)) IS TRUE";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], filter=[<>($1, '1')], groups=[{}], aggs=[[COUNT()]])")
@@ -3169,7 +3160,7 @@ public class DruidAdapter2IT {
+ "<($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)
+ sql(sql)
.returnsOrdered("EXPR$0=36")
.explainContains(plan)
.queryContains(
@@ -3191,7 +3182,7 @@ public class DruidAdapter2IT {
final String plan = "PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1997-01-01T00:00:00.001Z/"
+ "1997-01-04T00:00:00.001Z]], filter=[>(CEIL($90), 1)], groups=[{}], aggs=[[COUNT()]])";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains(plan)
.returnsOrdered("EXPR$0=408");
}
@@ -3210,7 +3201,7 @@ public class DruidAdapter2IT {
+ "EnumerableCalc(expr#0..1=[{inputs}], C=[$t1], EXPR$1=[$t0])\n"
+ " EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[AND(LIKE(SUBSTRING($1, 1, 4), '12%'), =(CHAR_LENGTH($1), 4), =(SUBSTRING($1, 3, 1), '2'), =(CAST(SUBSTRING($1, 2, 1)):INTEGER, 2), =(CAST(SUBSTRING($1, 4, 1)):INTEGER, 7), =(CAST(SUBSTRING($1, 4)):INTEGER, 7))], projects=[[SUBSTRING($1, 1, 4)]], groups=[{0}], aggs=[[COUNT()]])";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("C=60; EXPR$1=1227")
.explainContains(plan)
.queryContains(
@@ -3227,7 +3218,7 @@ public class DruidAdapter2IT {
+ " WHERE SUBSTRING(\"product_id\" from CAST(\"store_cost\" as INT)/1000 + 2 "
+ "for CAST(\"product_id\" as INT)) like '1%'";
- sql(sql, FOODMART).returnsOrdered("EXPR$0=10893")
+ sql(sql).returnsOrdered("EXPR$0=10893")
.queryContains(
new DruidChecker("\"queryType\":\"timeseries\"", "like(substring(\\\"product_id\\\""))
.explainContains(
@@ -3242,7 +3233,7 @@ public class DruidAdapter2IT {
+ FOODMART_TABLE
+ " WHERE SUBSTRING(\"product_id\" from CAST(\"store_cost\" as INT)/1000 + 1) like '1%'";
- sql(sql, FOODMART).returnsOrdered("EXPR$0=36839")
+ sql(sql).returnsOrdered("EXPR$0=36839")
.queryContains(new DruidChecker("like(substring(\\\"product_id\\\""))
.explainContains(
"PLAN=EnumerableInterpreter\n DruidQuery(table=[[foodmart, foodmart]], "
@@ -3278,12 +3269,12 @@ public class DruidAdapter2IT {
// After CALCITE-2302 the Druid query changed a bit and the type of the
// filter became an expression (instead of a bound filter) but it still
// seems correct.
- sql(sql, FOODMART).runs().queryContains(
+ sql(sql).runs().queryContains(
new DruidChecker(
false,
"\"filter\":{"
+ "\"type\":\"expression\","
- + "\"expression\":\"(CAST(\\\"product_id\\\", \'DOUBLE\') == 16.0)\""
+ + "\"expression\":\"(CAST(\\\"product_id\\\", 'DOUBLE') == 16.0)\""
+ "}"));
}
@@ -3292,7 +3283,7 @@ public class DruidAdapter2IT {
+ "SIN(\"store_cost\") > SIN(20) AND COS(\"store_sales\") > COS(20) "
+ "AND FLOOR(TAN(\"store_cost\")) = 2 "
+ "AND ABS(TAN(\"store_cost\") - SIN(\"store_cost\") / COS(\"store_cost\")) < 10e-7";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=2")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00"
@@ -3305,7 +3296,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM "
+ FOODMART_TABLE + " WHERE \"timestamp\" < CAST('1997-01-02' as TIMESTAMP)"
+ " AND EXTRACT(MONTH FROM \"timestamp\") / 4 + 1 = 1 ";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=117")
.queryContains(
new DruidChecker("{'queryType':'timeseries','dataSource':'foodmart',"
@@ -3323,13 +3314,13 @@ public class DruidAdapter2IT {
final String sql = "SELECT COUNT(*) FROM " + FOODMART_TABLE + "WHERE "
+ "(\"product_id\" = 1020 ) IS NOT TRUE AND (\"product_id\" = 1020 ) IS FALSE";
final String result = "EXPR$0=86773";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered(result)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[<>(CAST($1):INTEGER, 1020)], groups=[{}], aggs=[[COUNT()]])");
final String sql2 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + "WHERE "
+ "\"product_id\" <> 1020";
- sql(sql2, FOODMART).returnsOrdered(result);
+ sql(sql2).returnsOrdered(result);
}
// ADDING COMPLEX PROJECT PUSHDOWN
@@ -3338,7 +3329,7 @@ public class DruidAdapter2IT {
final String sql =
"SELECT COS(\"store_sales\") + 1, SIN(\"store_cost\"), EXTRACT(DAY from \"timestamp\") + 1 as D FROM "
+ FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3";
- sql(sql, FOODMART)
+ sql(sql)
.runs()
.returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; D=2\n"
+ "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2\n"
@@ -3354,7 +3345,7 @@ public class DruidAdapter2IT {
final String sql =
"SELECT COS(\"store_sales\" + \"store_cost\") + 1, EXTRACT(DAY from \"timestamp\") + 1 as D FROM "
+ FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3";
- sql(sql, FOODMART)
+ sql(sql)
.runs()
.returnsOrdered("EXPR$0=0.5357357987441458; D=2\n"
+ "EXPR$0=0.22760480207557643; D=2\n"
@@ -3368,7 +3359,7 @@ public class DruidAdapter2IT {
@Test void testSelectExtractMonth() {
final String sql = "SELECT EXTRACT(YEAR FROM \"timestamp\") FROM " + FOODMART_TABLE;
- sql(sql, FOODMART)
+ sql(sql)
.limit(1)
.returnsOrdered("EXPR$0=1997")
.explainContains("DruidQuery(table=[[foodmart, foodmart]], intervals="
@@ -3381,7 +3372,7 @@ public class DruidAdapter2IT {
@Test void testAggOnArithmeticProject() {
final String sql = "SELECT SUM(\"store_sales\" + 1) FROM " + FOODMART_TABLE;
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=652067.1299999984")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], "
@@ -3395,7 +3386,7 @@ public class DruidAdapter2IT {
@Test void testAggOnArithmeticProject2() {
final String sql = "SELECT SUM(-\"store_sales\" * 2) as S FROM " + FOODMART_TABLE
+ "Group by \"timestamp\" order by s LIMIT 2";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("S=-15918.020000000002\nS=-14115.959999999988")
.explainContains("BindableProject(S=[$1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3411,7 +3402,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT SUM(-\"store_sales\" * 2)-Max(\"store_cost\" * \"store_cost\") AS S,"
+ "Min(\"store_sales\" + \"store_cost\") as S2 FROM " + FOODMART_TABLE
+ "Group by \"timestamp\" order by s LIMIT 2";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("S=-16003.314460250002; S2=1.4768000000000001",
"S=-14181.569999999989; S2=0.8093999999999999")
.explainContains("PLAN=EnumerableInterpreter\n"
@@ -3433,7 +3424,7 @@ public class DruidAdapter2IT {
"SELECT \"product_id\" || '_' ||\"city\", SUM(\"store_sales\" + "
+ "CAST(\"cost\" AS DOUBLE)) as S FROM " + FOODMART_TABLE
+ "GROUP BY \"product_id\" || '_' || \"city\" LIMIT 2";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=1000_Albany; S=12385.21", "EXPR$0=1000_Altadena; S=8.07")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3450,7 +3441,7 @@ public class DruidAdapter2IT {
@Test void testCountOverVirtualColumn() {
final String sql = "SELECT COUNT(\"product_id\" || '_' || \"city\") FROM "
+ FOODMART_TABLE + "WHERE \"state_province\" = 'CA'";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=24441")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3466,7 +3457,7 @@ public class DruidAdapter2IT {
@Test void testAggOverStringToLong() {
final String sql = "SELECT SUM(cast(\"product_id\" AS INTEGER)) FROM " + FOODMART_TABLE;
- sql(sql, FOODMART)
+ sql(sql)
.queryContains(
new DruidChecker("{'queryType':'timeseries','dataSource':'foodmart',"
+ "'descending':false,'granularity':'all','aggregations':[{'type':'longSum',"
@@ -3476,7 +3467,7 @@ public class DruidAdapter2IT {
@Test void testAggOnTimeExtractColumn2() {
final String sql = "SELECT MAX(EXTRACT(MONTH FROM \"timestamp\")) FROM \"foodmart\"";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=12")
.queryContains(
new DruidChecker("{'queryType':'timeseries','dataSource':'foodmart',"
@@ -3498,7 +3489,7 @@ public class DruidAdapter2IT {
+ "{'type':'count','name':'EXPR$1'}],'intervals':['1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z'],'context':{'skipEmptyBuckets':false}}";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=24441; EXPR$1=86829")
.queryContains(new DruidChecker(query));
}
@@ -3506,7 +3497,7 @@ public class DruidAdapter2IT {
@Test void testCastOverPostAggregates() {
final String sql =
"SELECT CAST(COUNT(*) + SUM(\"store_sales\") as INTEGER) FROM " + FOODMART_TABLE;
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=652067")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3518,7 +3509,7 @@ public class DruidAdapter2IT {
final String sql =
"SELECT \"product_id\", SUBSTRING(\"product_id\" from 1 for 2) FROM " + FOODMART_TABLE
+ " GROUP BY \"product_id\"";
- sql(sql, FOODMART).limit(3).returnsOrdered(
+ sql(sql).limit(3).returnsOrdered(
"product_id=1; EXPR$1=1\nproduct_id=10; EXPR$1=10\nproduct_id=100; EXPR$1=10")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3537,7 +3528,7 @@ public class DruidAdapter2IT {
+ "\"timeZone\":\"UTC\",\"locale\":\"en-US\"}}";
final String extract_expression = "\"expression\":\"(((timestamp_extract(\\\"__time\\\",";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.queryContains(
new DruidChecker("\"queryType\":\"groupBy\"", extract_year, extract_expression))
.explainContains("PLAN=EnumerableInterpreter\n"
@@ -3557,7 +3548,7 @@ public class DruidAdapter2IT {
+ "FROM \"foodmart\"\n"
+ "GROUP BY (((YEAR(\"foodmart\".\"timestamp\") * 10000) + (MONTH(\"foodmart\".\"timestamp\")"
+ " * 100)) + EXTRACT(DAY FROM\"foodmart\".\"timestamp\"))) LIMIT 1";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("MD_T_TIMESTAMP_OK=19970101; SUM_T_OTHER_OK=706.34")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3575,7 +3566,7 @@ public class DruidAdapter2IT {
+ " AS hr_t_timestamp_ok2 FROM \"foodmart\" GROUP BY "
+ " CAST(SUBSTRING(CAST(\"foodmart\".\"timestamp\" AS VARCHAR) from 12 for 2 ) AS INT),"
+ " MINUTE(\"foodmart\".\"timestamp\"), EXTRACT(HOUR FROM \"timestamp\")) LIMIT 1";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains("BindableProject(HR_T_TIMESTAMP_OK=[$0], MI_T_TIMESTAMP_OK=[$1], "
+ "SUM_T_OTHER_OK=[$3], HR_T_TIMESTAMP_OK2=[$2])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3594,7 +3585,7 @@ public class DruidAdapter2IT {
+ "MINUTE(\"timestamp\") AS mi_t_timestamp_ok, SUM(\"store_sales\") AS sum_store_sales "
+ " FROM \"foodmart\" GROUP BY SECOND(\"timestamp\"), MINUTE(\"timestamp\"))"
+ " LIMIT_ZERO LIMIT 1";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[EXTRACT(FLAG(SECOND), $0), "
@@ -3608,7 +3599,7 @@ public class DruidAdapter2IT {
final String sql =
"SELECT CAST(COUNT(*) + SUM(\"store_sales\") as VARCHAR) || '_' || CAST(SUM(\"store_cost\") "
+ "AS VARCHAR) FROM " + FOODMART_TABLE;
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("EXPR$0=652067.1299999986_225627.2336000002")
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3620,7 +3611,7 @@ public class DruidAdapter2IT {
@Test void testHavingSpecs() {
final String sql = "SELECT \"product_id\" AS P, SUM(\"store_sales\") AS S FROM \"foodmart\" "
+ " GROUP BY \"product_id\" HAVING SUM(\"store_sales\") > 220 ORDER BY P LIMIT 2";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]], "
@@ -3636,7 +3627,7 @@ public class DruidAdapter2IT {
final String sql = "SELECT \"product_id\" AS P, SUM(\"store_sales\") AS S FROM \"foodmart\" "
+ " GROUP BY \"product_id\" HAVING SUM(\"store_sales\") > 220 AND \"product_id\" > '10'"
+ " ORDER BY P LIMIT 2";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], filter=[>($1, '10')], projects=[[$1, $90]], groups=[{0}],"
@@ -3652,7 +3643,7 @@ public class DruidAdapter2IT {
"SELECT \"product_id\" as prod_id1, \"product_id\" as prod_id2, "
+ "\"store_sales\" as S1, \"store_sales\" as S2 FROM " + FOODMART_TABLE
+ " order by prod_id1 LIMIT 1";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " BindableSort(sort0=[$0], dir0=[ASC], fetch=[1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3672,7 +3663,7 @@ public class DruidAdapter2IT {
"SELECT \"product_id\" as prod_id1, \"product_id\" as prod_id2, "
+ "\"store_sales\" as S1, \"store_sales\" as S2 FROM " + FOODMART_TABLE
+ " order by prod_id1 LIMIT 1";
- sql(sql, FOODMART)
+ sql(sql)
.explainContains("PLAN=EnumerableInterpreter\n"
+ " BindableSort(sort0=[$0], dir0=[ASC], fetch=[1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3692,7 +3683,7 @@ public class DruidAdapter2IT {
"SELECT \"product_id\" as prod_id1, \"product_id\" as prod_id2, "
+ "SUM(\"store_sales\") as S1, SUM(\"store_sales\") as S2 FROM " + FOODMART_TABLE
+ " GROUP BY \"product_id\" ORDER BY prod_id2 LIMIT 1";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.explainContains("BindableProject(PROD_ID1=[$0], PROD_ID2=[$0], S1=[$1], S2=[$1])\n"
+ " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/"
+ "2992-01-10T00:00:00.000Z]], projects=[[$1, $90]], groups=[{0}], aggs=[[SUM($1)]], "
@@ -3706,7 +3697,7 @@ public class DruidAdapter2IT {
@Test void testGroupBy1() {
final String sql = "SELECT SUM(\"store_sales\") FROM \"foodmart\" "
+ "GROUP BY 1 HAVING (COUNT(1) > 0)";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.queryContains(
new DruidChecker("{'queryType':'groupBy','dataSource':'foodmart','granularity':'all',"
+ "'dimensions':[{'type':'default','dimension':'vc','outputName':'vc','outputType':'LONG'}],"
@@ -3725,7 +3716,7 @@ public class DruidAdapter2IT {
+ FOODMART_TABLE
+ " GROUP BY floor(\"timestamp\" TO quarter)";
- sql(sql, FOODMART).queryContains(
+ sql(sql).queryContains(
new DruidChecker(
"{\"queryType\":\"timeseries\",\"dataSource\":\"foodmart\",\"descending\":false,"
+ "\"granularity\":{\"type\":\"period\",\"period\":\"P3M\",\"timeZone\":\"UTC\"},"
@@ -3739,7 +3730,7 @@ public class DruidAdapter2IT {
+ FOODMART_TABLE
+ " GROUP BY floor(\"timestamp\" TO quarter), \"product_id\"";
- sql(sql, FOODMART).queryContains(
+ sql(sql).queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\",\"dimensions\":"
+ "[{\"type\":\"extraction\",\"dimension\":\"__time\",\"outputName\":\"floor_quarter\",\"extractionFn\":{\"type\":\"timeFormat\"",
@@ -3757,7 +3748,7 @@ public class DruidAdapter2IT {
+ " WHERE \"product_id\" = 1"
+ " GROUP BY EXTRACT(quarter from \"timestamp\"), \"product_id\"";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\",\"dimensions\":"
@@ -3777,7 +3768,7 @@ public class DruidAdapter2IT {
+ FOODMART_TABLE
+ " GROUP BY EXTRACT(quarter from \"timestamp\")";
- CalciteAssert.AssertQuery q = sql(sql, FOODMART)
+ CalciteAssert.AssertQuery q = sql(sql)
.queryContains(
new DruidChecker(
"{\"queryType\":\"groupBy\",\"dataSource\":\"foodmart\",\"granularity\":\"all\","
@@ -3795,7 +3786,7 @@ public class DruidAdapter2IT {
final String sql = "Select cast(\"timestamp\" as varchar) as t"
+ " from \"foodmart\" order by t limit 1";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("T=1997-01-01 00:00:00")
.queryContains(
new DruidChecker("UTC"));
@@ -3805,7 +3796,7 @@ public class DruidAdapter2IT {
final String sql = "Select cast(cast(\"timestamp\" as timestamp) as varchar) as t"
+ " from \"foodmart\" order by t limit 1";
- sql(sql, FOODMART)
+ sql(sql)
.returnsOrdered("T=1997-01-01 00:00:00")
.queryContains(
new DruidChecker("UTC"));
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 be2b8fb..c16b77d 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -143,7 +143,7 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[wiki, wiki]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ "filter=[=($13, 'Jeremy Corbyn')], projects=[[$5]], groups=[{0}], aggs=[[]])\n";
- checkSelectDistinctWiki(WIKI, "wiki")
+ checkSelectDistinctWiki(WIKI)
.explainContains(explain);
}
@@ -153,7 +153,7 @@ public class DruidAdapterIT {
+ " DruidQuery(table=[[wiki, wiki]], "
+ "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+ "filter=[=($16, 'Jeremy Corbyn')], projects=[[$6]], groups=[{0}], aggs=[[]])\n";
- checkSelectDistinctWiki(WIKI_AUTO, "wiki")
+ checkSelectDistinctWiki(WIKI_AUTO)
.explainContains(explain);
}
@@ -217,11 +217,6 @@ public class DruidAdapterIT {
"PLAN=EnumerableInterpreter\n"
+ " DruidQuery(table=[[wiki, wikipedia]], intervals=[[1900-01-01T00:00:00.000Z/"
+ "3000-01-01T00:00:00.000Z]], projects=[[CAST($0):TIMESTAMP(0) NOT NULL]], fetch=[1])";
- final String druidQuery = "{'queryType':'scan',"
- + "'dataSource':'wikipedia',"
- + "'intervals':['1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z'],"
- + "'columns':['__time'],'granularity':'all',"
- + "'resultFormat':'compactedList','limit':1}";
sql(sql, WIKI_AUTO2)
.returnsUnordered("__time=2015-09-12 00:46:58")
@@ -288,9 +283,9 @@ public class DruidAdapterIT {
.queryContains(new DruidChecker(druidQuery));
}
- private CalciteAssert.AssertQuery checkSelectDistinctWiki(URL url, String tableName) {
+ private CalciteAssert.AssertQuery checkSelectDistinctWiki(URL url) {
final String sql = "select distinct \"countryName\"\n"
- + "from \"" + tableName + "\"\n"
+ + "from \"wiki\"\n"
+ "where \"page\" = 'Jeremy Corbyn'";
final String druidQuery = "{'queryType':'groupBy',"
+ "'dataSource':'wikipedia','granularity':'all',"
@@ -350,7 +345,7 @@ public class DruidAdapterIT {
.queryContains(new DruidChecker(subDruidQuery));
}
- @Test void testMetadataColumns() throws Exception {
+ @Test void testMetadataColumns() {
sql("values 1")
.withConnection(c -> {
try {
@@ -2820,7 +2815,7 @@ public class DruidAdapterIT {
*/
@Test void testNotFilterForm() {
String sql = "select count(distinct \"the_month\") from "
- + "\"foodmart\" where \"the_month\" <> \'October\'";
+ + "\"foodmart\" where \"the_month\" <> 'October'";
String druidFilter = "'filter':{'type':'not',"
+ "'field':{'type':'selector','dimension':'the_month','value':'October'}}";
// Check that the filter actually worked, and that druid was responsible for the filter
@@ -3907,7 +3902,7 @@ public class DruidAdapterIT {
false,
"\"filter\":{"
+ "\"type\":\"expression\","
- + "\"expression\":\"(CAST(\\\"product_id\\\", \'DOUBLE\') == 16.0)\""
+ + "\"expression\":\"(CAST(\\\"product_id\\\", 'DOUBLE') == 16.0)\""
+ "}"));
}
[calcite] 02/04: [CALCITE-4201] AssertionError when registering
Druid rules due to conflict in description
Posted by za...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zabetak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit c09c08076bdab92c6a8b2ea62b2eeeada4471b2b
Author: Stamatis Zampetakis <za...@gmail.com>
AuthorDate: Mon Aug 31 14:42:29 2020 +0300
[CALCITE-4201] AssertionError when registering Druid rules due to conflict in description
---
.../org/apache/calcite/adapter/druid/DruidRules.java | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
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 ef76a97..fa72dc3 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
@@ -89,42 +89,47 @@ public class DruidRules {
* {@link org.apache.calcite.rel.core.Project}. Useful to transform
* to complex Druid queries. */
public static final SortProjectTransposeRule SORT_PROJECT_TRANSPOSE =
- SortProjectTransposeRule.Config.DEFAULT
+ (SortProjectTransposeRule) SortProjectTransposeRule.Config.DEFAULT
.withOperandFor(Sort.class, Project.class, DruidQuery.class)
+ .withDescription("DruidSortProjectTransposeRule")
.toRule();
/** Rule to push a {@link org.apache.calcite.rel.core.Project}
* past a {@link org.apache.calcite.rel.core.Filter}
* when {@code Filter} is on top of a {@link DruidQuery}. */
public static final ProjectFilterTransposeRule PROJECT_FILTER_TRANSPOSE =
- ProjectFilterTransposeRule.Config.DEFAULT
+ (ProjectFilterTransposeRule) ProjectFilterTransposeRule.Config.DEFAULT
.withOperandFor(Project.class, Filter.class, DruidQuery.class)
+ .withDescription("DruidProjectFilterTransposeRule")
.toRule();
/** Rule to push a {@link org.apache.calcite.rel.core.Filter}
* past a {@link org.apache.calcite.rel.core.Project}
* when {@code Project} is on top of a {@link DruidQuery}. */
public static final FilterProjectTransposeRule FILTER_PROJECT_TRANSPOSE =
- FilterProjectTransposeRule.Config.DEFAULT
+ (FilterProjectTransposeRule) FilterProjectTransposeRule.Config.DEFAULT
.withOperandFor(Filter.class, Project.class, DruidQuery.class)
.withCopyFilter(true)
.withCopyProject(true)
+ .withDescription("DruidFilterProjectTransposeRule")
.toRule();
/** Rule to push an {@link org.apache.calcite.rel.core.Aggregate}
* past a {@link org.apache.calcite.rel.core.Filter}
* when {@code Filter} is on top of a {@link DruidQuery}. */
public static final AggregateFilterTransposeRule AGGREGATE_FILTER_TRANSPOSE =
- AggregateFilterTransposeRule.Config.DEFAULT
+ (AggregateFilterTransposeRule) AggregateFilterTransposeRule.Config.DEFAULT
.withOperandFor(Aggregate.class, Filter.class, DruidQuery.class)
+ .withDescription("DruidAggregateFilterTransposeRule")
.toRule();
/** Rule to push an {@link org.apache.calcite.rel.core.Filter}
* past an {@link org.apache.calcite.rel.core.Aggregate}
* when {@code Aggregate} is on top of a {@link DruidQuery}. */
public static final FilterAggregateTransposeRule FILTER_AGGREGATE_TRANSPOSE =
- FilterAggregateTransposeRule.Config.DEFAULT
+ (FilterAggregateTransposeRule) FilterAggregateTransposeRule.Config.DEFAULT
.withOperandFor(Filter.class, Aggregate.class, DruidQuery.class)
+ .withDescription("DruidFilterAggregateTransposeRule")
.toRule();
public static final DruidPostAggregationProjectRule POST_AGGREGATION_PROJECT =
@@ -135,8 +140,9 @@ public class DruidRules {
* {@link org.apache.calcite.adapter.druid.DruidQuery} based on the fields
* used in the aggregate. */
public static final AggregateExtractProjectRule PROJECT_EXTRACT_RULE =
- AggregateExtractProjectRule.Config.DEFAULT
+ (AggregateExtractProjectRule) AggregateExtractProjectRule.Config.DEFAULT
.withOperandFor(Aggregate.class, DruidQuery.class)
+ .withDescription("DruidAggregateExtractProjectRule")
.toRule();
public static final DruidHavingFilterRule DRUID_HAVING_FILTER_RULE =
[calcite] 01/04: [CALCITE-4200] ExceptionInInitializerError when
initializing DruidRules
Posted by za...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zabetak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 740444503fd26c7bc45d35b5e6d099d6954efecf
Author: Stamatis Zampetakis <za...@gmail.com>
AuthorDate: Mon Aug 31 13:29:10 2020 +0300
[CALCITE-4200] ExceptionInInitializerError when initializing DruidRules
Refactor DruidRules to conform with the RelRule API guidelines to
resolve the initialization error and homogenize the code.
Create Config.DEFAULT in Druid specific configurations and use that for
instantiating the rules.
Use Config.DEFAULT instead of RelRule.config to create rule extensions
for Druid to cut out dependency in CoreRules holder class.
---
.../apache/calcite/adapter/druid/DruidRules.java | 103 +++++++++++----------
1 file changed, 56 insertions(+), 47 deletions(-)
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 bb7a271..ef76a97 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
@@ -32,7 +32,6 @@ import org.apache.calcite.rel.core.Sort;
import org.apache.calcite.rel.logical.LogicalFilter;
import org.apache.calcite.rel.rules.AggregateExtractProjectRule;
import org.apache.calcite.rel.rules.AggregateFilterTransposeRule;
-import org.apache.calcite.rel.rules.CoreRules;
import org.apache.calcite.rel.rules.FilterAggregateTransposeRule;
import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
import org.apache.calcite.rel.rules.ProjectFilterTransposeRule;
@@ -70,8 +69,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import static org.apache.calcite.plan.RelRule.Config.EMPTY;
-
/**
* Rules and relational operators for {@link DruidQuery}.
*/
@@ -80,37 +77,13 @@ public class DruidRules {
protected static final Logger LOGGER = CalciteTrace.getPlannerTracer();
- public static final DruidFilterRule FILTER = EMPTY
- .withOperandSupplier(b0 ->
- b0.operand(Filter.class).oneInput(b1 ->
- b1.operand(DruidQuery.class).noInputs()))
- .as(DruidFilterRule.Config.class)
- .toRule();
- public static final DruidProjectRule PROJECT = EMPTY
- .withOperandSupplier(b0 ->
- b0.operand(Project.class).oneInput(b1 ->
- b1.operand(DruidQuery.class).noInputs()))
- .as(DruidProjectRule.Config.class)
- .toRule();
- public static final DruidAggregateRule AGGREGATE = EMPTY
- .withOperandSupplier(b0 ->
- b0.operand(Aggregate.class).oneInput(b1 ->
- b1.operand(DruidQuery.class).noInputs()))
- .as(DruidAggregateRule.Config.class)
- .toRule();
- public static final DruidAggregateProjectRule AGGREGATE_PROJECT = EMPTY
- .withOperandSupplier(b0 ->
- b0.operand(Aggregate.class).oneInput(b1 ->
- b1.operand(Project.class).oneInput(b2 ->
- b2.operand(DruidQuery.class).noInputs())))
- .as(DruidAggregateProjectRule.Config.class)
- .toRule();
- public static final DruidSortRule SORT = EMPTY
- .withOperandSupplier(b0 ->
- b0.operand(Sort.class).oneInput(b1 ->
- b1.operand(DruidQuery.class).noInputs()))
- .as(DruidSortRule.Config.class)
+ public static final DruidFilterRule FILTER = DruidFilterRule.Config.DEFAULT.toRule();
+ public static final DruidProjectRule PROJECT = DruidProjectRule.Config.DEFAULT.toRule();
+ public static final DruidAggregateRule AGGREGATE = DruidAggregateRule.Config.DEFAULT.toRule();
+ public static final DruidAggregateProjectRule AGGREGATE_PROJECT =
+ DruidAggregateProjectRule.Config.DEFAULT
.toRule();
+ public static final DruidSortRule SORT = DruidSortRule.Config.DEFAULT.toRule();
/** Rule to push an {@link org.apache.calcite.rel.core.Sort} through a
* {@link org.apache.calcite.rel.core.Project}. Useful to transform
@@ -132,7 +105,7 @@ public class DruidRules {
* past a {@link org.apache.calcite.rel.core.Project}
* when {@code Project} is on top of a {@link DruidQuery}. */
public static final FilterProjectTransposeRule FILTER_PROJECT_TRANSPOSE =
- CoreRules.FILTER_PROJECT_TRANSPOSE.config
+ FilterProjectTransposeRule.Config.DEFAULT
.withOperandFor(Filter.class, Project.class, DruidQuery.class)
.withCopyFilter(true)
.withCopyProject(true)
@@ -142,7 +115,7 @@ public class DruidRules {
* past a {@link org.apache.calcite.rel.core.Filter}
* when {@code Filter} is on top of a {@link DruidQuery}. */
public static final AggregateFilterTransposeRule AGGREGATE_FILTER_TRANSPOSE =
- CoreRules.AGGREGATE_FILTER_TRANSPOSE.config
+ AggregateFilterTransposeRule.Config.DEFAULT
.withOperandFor(Aggregate.class, Filter.class, DruidQuery.class)
.toRule();
@@ -150,32 +123,25 @@ public class DruidRules {
* past an {@link org.apache.calcite.rel.core.Aggregate}
* when {@code Aggregate} is on top of a {@link DruidQuery}. */
public static final FilterAggregateTransposeRule FILTER_AGGREGATE_TRANSPOSE =
- CoreRules.FILTER_AGGREGATE_TRANSPOSE.config
+ FilterAggregateTransposeRule.Config.DEFAULT
.withOperandFor(Filter.class, Aggregate.class, DruidQuery.class)
.toRule();
public static final DruidPostAggregationProjectRule POST_AGGREGATION_PROJECT =
- EMPTY.withOperandSupplier(b0 ->
- b0.operand(Project.class).oneInput(b1 ->
- b1.operand(DruidQuery.class).noInputs()))
- .as(DruidPostAggregationProjectRule.Config.class)
- .toRule();
+ DruidPostAggregationProjectRule.Config.DEFAULT.toRule();
/** Rule to extract a {@link org.apache.calcite.rel.core.Project} from
* {@link org.apache.calcite.rel.core.Aggregate} on top of
* {@link org.apache.calcite.adapter.druid.DruidQuery} based on the fields
* used in the aggregate. */
public static final AggregateExtractProjectRule PROJECT_EXTRACT_RULE =
- EMPTY.as(AggregateExtractProjectRule.Config.class)
+ AggregateExtractProjectRule.Config.DEFAULT
.withOperandFor(Aggregate.class, DruidQuery.class)
.toRule();
public static final DruidHavingFilterRule DRUID_HAVING_FILTER_RULE =
- EMPTY.withOperandSupplier(b0 ->
- b0.operand(Filter.class).oneInput(b1 ->
- b1.operand(DruidQuery.class).noInputs()))
- .as(DruidHavingFilterRule.Config.class)
- .toRule();
+ DruidHavingFilterRule.Config.DEFAULT
+ .toRule();
public static final List<RelOptRule> RULES =
ImmutableList.of(FILTER,
@@ -307,6 +273,12 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Filter.class).oneInput(b1 ->
+ b1.operand(DruidQuery.class).noInputs()))
+ .as(DruidFilterRule.Config.class);
+
@Override default DruidFilterRule toRule() {
return new DruidFilterRule(this);
}
@@ -343,6 +315,12 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Filter.class).oneInput(b1 ->
+ b1.operand(DruidQuery.class).noInputs()))
+ .as(DruidHavingFilterRule.Config.class);
+
@Override default DruidHavingFilterRule toRule() {
return new DruidHavingFilterRule(this);
}
@@ -435,6 +413,12 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Project.class).oneInput(b1 ->
+ b1.operand(DruidQuery.class).noInputs()))
+ .as(DruidProjectRule.Config.class);
+
@Override default DruidProjectRule toRule() {
return new DruidProjectRule(this);
}
@@ -491,6 +475,12 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Project.class).oneInput(b1 ->
+ b1.operand(DruidQuery.class).noInputs()))
+ .as(DruidPostAggregationProjectRule.Config.class);
+
@Override default DruidPostAggregationProjectRule toRule() {
return new DruidPostAggregationProjectRule(this);
}
@@ -539,6 +529,12 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Aggregate.class).oneInput(b1 ->
+ b1.operand(DruidQuery.class).noInputs()))
+ .as(DruidAggregateRule.Config.class);
+
@Override default DruidAggregateRule toRule() {
return new DruidAggregateRule(this);
}
@@ -775,6 +771,13 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Aggregate.class).oneInput(b1 ->
+ b1.operand(Project.class).oneInput(b2 ->
+ b2.operand(DruidQuery.class).noInputs())))
+ .as(DruidAggregateProjectRule.Config.class);
+
@Override default DruidAggregateProjectRule toRule() {
return new DruidAggregateProjectRule(this);
}
@@ -817,6 +820,12 @@ public class DruidRules {
/** Rule configuration. */
public interface Config extends RelRule.Config {
+ Config DEFAULT = EMPTY
+ .withOperandSupplier(b0 ->
+ b0.operand(Sort.class).oneInput(b1 ->
+ b1.operand(DruidQuery.class).noInputs()))
+ .as(DruidSortRule.Config.class);
+
@Override default DruidSortRule toRule() {
return new DruidSortRule(this);
}