This is an automated email from the ASF dual-hosted git repository. ccaominh pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push: new cbd587d Add parameterized Calcite tests for join queries (#9923) cbd587d is described below commit cbd587dbd64ea7e5b1a316d19752786f01e50dec Author: Suneet Saldanha <44787917+sunee...@users.noreply.github.com> AuthorDate: Thu May 28 19:10:26 2020 -0700 Add parameterized Calcite tests for join queries (#9923) * Add parameterized Calcite tests for join queries * new tests * review comments --- sql/pom.xml | 5 + .../druid/sql/calcite/BaseCalciteQueryTest.java | 14 +- .../apache/druid/sql/calcite/CalciteQueryTest.java | 369 ++++++++++++++++----- 3 files changed, 296 insertions(+), 92 deletions(-) diff --git a/sql/pom.xml b/sql/pom.xml index ef8d3f7..cd1c12e 100644 --- a/sql/pom.xml +++ b/sql/pom.xml @@ -185,6 +185,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>pl.pragmatists</groupId> + <artifactId>JUnitParams</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-core</artifactId> <type>test-jar</type> diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java index 4fc1e8e..39800c1 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java @@ -102,11 +102,19 @@ import java.util.stream.Collectors; public class BaseCalciteQueryTest extends CalciteTestBase { - public static final String NULL_STRING = NullHandling.defaultStringValue(); - public static final Float NULL_FLOAT = NullHandling.defaultFloatValue(); - public static final Long NULL_LONG = NullHandling.defaultLongValue(); + public static String NULL_STRING; + public static Float NULL_FLOAT; + public static Long NULL_LONG; public static final String HLLC_STRING = VersionOneHyperLogLogCollector.class.getName(); + @BeforeClass + public static void setupNullValues() + { + NULL_STRING = NullHandling.defaultStringValue(); + NULL_FLOAT = NullHandling.defaultFloatValue(); + NULL_LONG = NullHandling.defaultLongValue(); + } + public static final Logger log = new Logger(BaseCalciteQueryTest.class); public static final PlannerConfig PLANNER_CONFIG_DEFAULT = new PlannerConfig(); diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index 81cf68d..8033045 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -22,8 +22,11 @@ package org.apache.druid.sql.calcite; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; import org.apache.calcite.runtime.CalciteContextException; import org.apache.calcite.tools.ValidationException; +import org.apache.druid.annotations.UsedByJUnitParamsRunner; import org.apache.druid.common.config.NullHandling; import org.apache.druid.java.util.common.DateTimes; import org.apache.druid.java.util.common.IAE; @@ -105,6 +108,7 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.junit.internal.matchers.ThrowableMessageMatcher; +import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.Collections; @@ -112,6 +116,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +@RunWith(JUnitParamsRunner.class) public class CalciteQueryTest extends BaseCalciteQueryTest { private final boolean useDefault = NullHandling.replaceWithDefault(); @@ -6510,7 +6515,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testTopNFilterJoin() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testTopNFilterJoin(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -6530,6 +6536,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + ") t2 ON (t1.dim2 = t2.dim2)\n" + "GROUP BY t1.dim1\n" + "ORDER BY 1\n", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -6571,7 +6578,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest Integer.MAX_VALUE ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -6582,7 +6589,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testTopNFilterJoinWithProjection() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testTopNFilterJoinWithProjection(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -6602,6 +6610,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + " LIMIT 2\n" + ") t2 ON (t1.dim2 = t2.dim2)\n" + "GROUP BY SUBSTRING(t1.dim1, 1, 10)", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -6640,7 +6649,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) ) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -6651,8 +6660,9 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test + @Parameters(source = QueryContextForJoinProvider.class) @Ignore("Stopped working after the ability to join on subqueries was added to DruidJoinRule") - public void testRemovableLeftJoin() throws Exception + public void testRemovableLeftJoin(Map<String, Object> queryContext) throws Exception { // LEFT JOIN where the right-hand side can be ignored. @@ -6670,6 +6680,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + ") t2 ON (t1.dim2 = t2.dim2)\n" + "GROUP BY t1.dim1\n" + "ORDER BY 1\n", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource(CalciteTests.DATASOURCE1) @@ -6689,7 +6700,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest Integer.MAX_VALUE ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8075,7 +8086,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testFilterAndGroupByLookupUsingJoinOperatorAllowNulls() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testFilterAndGroupByLookupUsingJoinOperatorAllowNulls(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -8085,6 +8097,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "FROM foo LEFT JOIN lookup.lookyloo ON foo.dim2 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xa' OR lookyloo.v IS NULL\n" + "GROUP BY lookyloo.v", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -8101,7 +8114,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setDimFilter(or(not(selector("j0.v", "xa", null)), selector("j0.v", null, null))) .setDimensions(dimensions(new DefaultDimensionSpec("j0.v", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8112,7 +8125,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testFilterAndGroupByLookupUsingJoinOperatorBackwards() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testFilterAndGroupByLookupUsingJoinOperatorBackwards(Map<String, Object> queryContext) throws Exception { // Like "testFilterAndGroupByLookupUsingJoinOperator", but with the table and lookup reversed. @@ -8124,6 +8138,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "FROM lookup.lookyloo RIGHT JOIN foo ON foo.dim2 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xa'\n" + "GROUP BY lookyloo.v", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -8147,7 +8162,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("v", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8158,7 +8173,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testFilterAndGroupByLookupUsingJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testFilterAndGroupByLookupUsingJoinOperatorWithNotFilter(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -8168,6 +8184,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "FROM foo LEFT JOIN lookup.lookyloo ON foo.dim2 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xa'\n" + "GROUP BY lookyloo.v", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -8184,7 +8201,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("j0.v", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8195,19 +8212,17 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testFilterAndGroupByLookupUsingJoinOperatorWithValueFilterPushdown() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testFilterAndGroupByLookupUsingJoinOperator(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); - Map<String, Object> queryRewriteValueColumnFiltersContext = DEFAULT_QUERY_CONTEXT_BUILDER - .put(QueryContexts.JOIN_FILTER_REWRITE_VALUE_COLUMN_FILTERS_ENABLE_KEY, true) - .build(); testQuery( "SELECT lookyloo.k, COUNT(*)\n" + "FROM foo LEFT JOIN lookup.lookyloo ON foo.dim2 = lookyloo.k\n" + "WHERE lookyloo.v = 'xa'\n" + "GROUP BY lookyloo.k", - queryRewriteValueColumnFiltersContext, + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -8224,7 +8239,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("j0.k", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(queryRewriteValueColumnFiltersContext) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8234,7 +8249,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testFilterAndGroupByLookupUsingPostAggregationJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testFilterAndGroupByLookupUsingPostAggregationJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT base.dim2, lookyloo.v, base.cnt FROM (\n" @@ -8242,6 +8258,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + ") base\n" + "LEFT JOIN lookup.lookyloo ON base.dim2 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xa' OR lookyloo.v IS NULL", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8254,7 +8271,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("dim2", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), new LookupDataSource("lookyloo"), @@ -8282,7 +8299,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testGroupByInnerJoinOnLookupUsingJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testGroupByInnerJoinOnLookupUsingJoinOperator(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -8291,6 +8309,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT lookyloo.v, COUNT(*)\n" + "FROM foo INNER JOIN lookup.lookyloo ON foo.dim1 = lookyloo.k\n" + "GROUP BY lookyloo.v", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -8306,7 +8325,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("j0.v", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8316,11 +8335,13 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testSelectOnLookupUsingInnerJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testSelectOnLookupUsingInnerJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim2, lookyloo.*\n" + "FROM foo INNER JOIN lookup.lookyloo ON foo.dim2 = lookyloo.k\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8334,7 +8355,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("dim2", "j0.k", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8346,13 +8367,15 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testLeftJoinTwoLookupsUsingJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testLeftJoinTwoLookupsUsingJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1, dim2, l1.v, l2.v\n" + "FROM foo\n" + "LEFT JOIN lookup.lookyloo l1 ON foo.dim1 = l1.k\n" + "LEFT JOIN lookup.lookyloo l2 ON foo.dim2 = l2.k\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8372,7 +8395,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("_j0.v", "dim1", "dim2", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8387,7 +8410,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinTableLookupLookupWithFilterWithOuterLimit() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinTableLookupLookupWithFilterWithOuterLimit(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1\n" @@ -8396,6 +8420,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN lookup.lookyloo l2 ON foo.dim2 = l2.k\n" + "WHERE l.v = 'xa'\n" + "LIMIT 100\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8417,7 +8442,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .limit(100) .filters(selector("j0.v", "xa", null)) .columns("dim1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8428,7 +8453,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinTableLookupLookupWithFilterWithoutLimit() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinTableLookupLookupWithFilterWithoutLimit(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1\n" @@ -8436,6 +8462,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN lookup.lookyloo l ON foo.dim2 = l.k\n" + "INNER JOIN lookup.lookyloo l2 ON foo.dim2 = l2.k\n" + "WHERE l.v = 'xa'\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8456,7 +8483,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .filters(selector("j0.v", "xa", null)) .columns("dim1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8467,7 +8494,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinTableLookupLookupWithFilterWithOuterLimitWithAllColumns() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinTableLookupLookupWithFilterWithOuterLimitWithAllColumns(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT __time, cnt, dim1, dim2, dim3, m1, m2, unique_dim1\n" @@ -8476,6 +8504,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN lookup.lookyloo l2 ON foo.dim2 = l2.k\n" + "WHERE l.v = 'xa'\n" + "LIMIT 100\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8497,7 +8526,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .limit(100) .filters(selector("j0.v", "xa", null)) .columns("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8508,7 +8537,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinTableLookupLookupWithFilterWithoutLimitWithAllColumns() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinTableLookupLookupWithFilterWithoutLimitWithAllColumns(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT __time, cnt, dim1, dim2, dim3, m1, m2, unique_dim1\n" @@ -8516,6 +8546,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN lookup.lookyloo l ON foo.dim2 = l.k\n" + "INNER JOIN lookup.lookyloo l2 ON foo.dim2 = l2.k\n" + "WHERE l.v = 'xa'\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8536,7 +8567,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .filters(selector("j0.v", "xa", null)) .columns("__time", "cnt", "dim1", "dim2", "dim3", "m1", "m2", "unique_dim1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8547,7 +8578,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testManyManyInnerJoinOnManyManyLookup() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testManyManyInnerJoinOnManyManyLookup(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1\n" @@ -8572,6 +8604,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN lookup.lookyloo l18 ON foo.dim2 = l18.k\n" + "INNER JOIN lookup.lookyloo l19 ON foo.dim2 = l19.k\n" + "WHERE l.v = 'xa'\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8694,7 +8727,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .filters(selector("j0.v", "xa", null)) .columns("dim1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8705,7 +8738,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinQueryOfLookup() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinQueryOfLookup(Map<String, Object> queryContext) throws Exception { // Cannot vectorize the subquery. cannotVectorize(); @@ -8716,6 +8750,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN \n" + " (SELECT SUBSTRING(k, 1, 1) k, LATEST(v, 10) v FROM lookup.lookyloo GROUP BY 1) t1\n" + " ON foo.dim2 = t1.k", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8744,7 +8779,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("dim1", "dim2", "j0.a0") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8755,7 +8790,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinQueryOfLookupRemovable() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinQueryOfLookupRemovable(Map<String, Object> queryContext) throws Exception { // Like "testInnerJoinQueryOfLookup", but the subquery is removable. @@ -8765,6 +8801,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN \n" + " (SELECT k, SUBSTRING(v, 1, 3) sk FROM lookup.lookyloo) t1\n" + " ON foo.dim2 = t1.k", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -8779,7 +8816,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .virtualColumns(expressionVirtualColumn("v0", "substring(\"j0.v\", 0, 3)", ValueType.STRING)) .columns("dim1", "dim2", "v0") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -8791,7 +8828,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinTwoLookupsToTableUsingNumericColumn() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinTwoLookupsToTableUsingNumericColumn(Map<String, Object> queryContext) throws Exception { // Regression test for https://github.com/apache/druid/issues/9646. @@ -8803,6 +8841,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "FROM foo\n" + "INNER JOIN lookup.lookyloo l1 ON l1.k = foo.m1\n" + "INNER JOIN lookup.lookyloo l2 ON l2.k = l1.k", + queryContext, ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource( @@ -8850,7 +8889,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinTwoLookupsToTableUsingNumericColumnInReverse() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinTwoLookupsToTableUsingNumericColumnInReverse(Map<String, Object> queryContext) throws Exception { // Like "testInnerJoinTwoLookupsToTableUsingNumericColumn", but the tables are specified backwards. @@ -8861,6 +8901,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "FROM lookup.lookyloo l1\n" + "INNER JOIN lookup.lookyloo l2 ON l1.k = l2.k\n" + "INNER JOIN foo on l2.k = foo.m1", + queryContext, ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource( @@ -8904,7 +8945,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinLookupTableTable() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinLookupTableTable(Map<String, Object> queryContext) throws Exception { // Regression test for https://github.com/apache/druid/issues/9646. @@ -8917,6 +8959,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN druid.foo f on f.dim1 = l.k\n" + "INNER JOIN druid.numfoo nf on nf.dim1 = l.k\n" + "GROUP BY 1, 2 ORDER BY 2", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -8974,7 +9017,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest null ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -8984,7 +9027,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinLookupTableTableChained() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinLookupTableTableChained(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -8995,6 +9039,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "INNER JOIN druid.foo f on f.dim1 = l.k\n" + "INNER JOIN druid.numfoo nf on nf.dim1 = f.dim1\n" + "GROUP BY 1, 2 ORDER BY 2", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -9052,7 +9097,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest null ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -9141,7 +9186,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest // Unfortunately, we have disabled pushing down predicates (conditions and filters) due to https://github.com/apache/druid/pull/9773 // Hence, comma join will result in a cross join with filter on outermost @Test - public void testCommaJoinTableLookupTableMismatchedTypes() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testCommaJoinTableLookupTableMismatchedTypes(Map<String, Object> queryContext) throws Exception { // Regression test for https://github.com/apache/druid/issues/9646. @@ -9152,6 +9198,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT COUNT(*)\n" + "FROM foo, lookup.lookyloo l, numfoo\n" + "WHERE foo.cnt = l.k AND l.k = numfoo.cnt\n", + queryContext, ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource( @@ -9192,7 +9239,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testJoinTableLookupTableMismatchedTypesWithoutComma() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testJoinTableLookupTableMismatchedTypesWithoutComma(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -9202,6 +9250,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "FROM foo\n" + "INNER JOIN lookup.lookyloo l ON foo.cnt = l.k\n" + "INNER JOIN numfoo ON l.k = numfoo.cnt\n", + queryContext, ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource( @@ -9217,7 +9266,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) .columns("k", "v0") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), "j0.", @@ -9233,7 +9282,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) .columns("cnt") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), "_j0.", @@ -9255,7 +9304,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinCastLeft() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinCastLeft(Map<String, Object> queryContext) throws Exception { // foo.m1 is FLOAT, l.k is STRING. @@ -9263,6 +9313,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT foo.m1, l.k, l.v\n" + "FROM foo\n" + "INNER JOIN lookup.lookyloo l ON CAST(foo.m1 AS VARCHAR) = l.k\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9279,7 +9330,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("j0.k", "j0.v", "m1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of() @@ -9287,7 +9338,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinCastRight() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinCastRight(Map<String, Object> queryContext) throws Exception { // foo.m1 is FLOAT, l.k is STRING. @@ -9295,6 +9347,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT foo.m1, l.k, l.v\n" + "FROM foo\n" + "INNER JOIN lookup.lookyloo l ON foo.m1 = CAST(l.k AS FLOAT)\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9309,7 +9362,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) .columns("k", "v", "v0") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), "j0.", @@ -9319,7 +9372,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("j0.k", "j0.v", "m1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9329,7 +9382,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinMismatchedTypes() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinMismatchedTypes(Map<String, Object> queryContext) throws Exception { // foo.m1 is FLOAT, l.k is STRING. Comparing them generates a CAST. @@ -9337,6 +9391,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT foo.m1, l.k, l.v\n" + "FROM foo\n" + "INNER JOIN lookup.lookyloo l ON foo.m1 = l.k\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9351,7 +9406,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) .columns("k", "v", "v0") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), "j0.", @@ -9361,7 +9416,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("j0.k", "j0.v", "m1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9371,12 +9426,14 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinLeftFunction() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinLeftFunction(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT foo.dim1, foo.dim2, l.k, l.v\n" + "FROM foo\n" + "INNER JOIN lookup.lookyloo l ON SUBSTRING(foo.dim2, 1, 1) = l.k\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9393,7 +9450,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("dim1", "dim2", "j0.k", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9405,12 +9462,14 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInnerJoinRightFunction() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinRightFunction(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT foo.dim1, foo.dim2, l.k, l.v\n" + "FROM foo\n" + "INNER JOIN lookup.lookyloo l ON foo.dim2 = SUBSTRING(l.k, 1, 2)\n", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9425,7 +9484,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) .columns("k", "v", "v0") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), "j0.", @@ -9435,7 +9494,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("dim1", "dim2", "j0.k", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9446,13 +9505,15 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testLeftJoinLookupOntoLookupUsingJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testLeftJoinLookupOntoLookupUsingJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim2, l1.v, l2.v\n" + "FROM foo\n" + "LEFT JOIN lookup.lookyloo l1 ON foo.dim2 = l1.k\n" + "LEFT JOIN lookup.lookyloo l2 ON l1.k = l2.k", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9472,7 +9533,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("_j0.v", "dim2", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9487,7 +9548,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testLeftJoinThreeLookupsUsingJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testLeftJoinThreeLookupsUsingJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1, dim2, l1.v, l2.v, l3.v\n" @@ -9495,6 +9557,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "LEFT JOIN lookup.lookyloo l1 ON foo.dim1 = l1.k\n" + "LEFT JOIN lookup.lookyloo l2 ON foo.dim2 = l2.k\n" + "LEFT JOIN lookup.lookyloo l3 ON l2.k = l3.k", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9520,7 +9583,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) .intervals(querySegmentSpec(Filtration.eternity())) .columns("__j0.v", "_j0.v", "dim1", "dim2", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9535,12 +9598,14 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testSelectOnLookupUsingLeftJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testSelectOnLookupUsingLeftJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1, lookyloo.*\n" + "FROM foo LEFT JOIN lookup.lookyloo ON foo.dim1 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xxx' OR lookyloo.v IS NULL", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9555,7 +9620,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .filters(or(not(selector("j0.v", "xxx", null)), selector("j0.v", null, null))) .columns("dim1", "j0.k", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9570,12 +9635,14 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testSelectOnLookupUsingRightJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testSelectOnLookupUsingRightJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1, lookyloo.*\n" + "FROM foo RIGHT JOIN lookup.lookyloo ON foo.dim1 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xxx' OR lookyloo.v IS NULL", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9590,7 +9657,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .filters(or(not(selector("j0.v", "xxx", null)), selector("j0.v", null, null))) .columns("dim1", "j0.k", "j0.v") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9603,12 +9670,14 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testSelectOnLookupUsingFullJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testSelectOnLookupUsingFullJoinOperator(Map<String, Object> queryContext) throws Exception { testQuery( "SELECT dim1, m1, cnt, lookyloo.*\n" + "FROM foo FULL JOIN lookup.lookyloo ON foo.dim1 = lookyloo.k\n" + "WHERE lookyloo.v <> 'xxx' OR lookyloo.v IS NULL", + queryContext, ImmutableList.of( newScanQueryBuilder() .dataSource( @@ -9623,7 +9692,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Filtration.eternity())) .filters(or(not(selector("j0.v", "xxx", null)), selector("j0.v", null, null))) .columns("cnt", "dim1", "j0.k", "j0.v", "m1") - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), ImmutableList.of( @@ -9681,7 +9750,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testCountDistinctOfLookupUsingJoinOperator() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testCountDistinctOfLookupUsingJoinOperator(Map<String, Object> queryContext) throws Exception { // Cannot yet vectorize the JOIN operator. cannotVectorize(); @@ -9689,6 +9759,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest testQuery( "SELECT COUNT(DISTINCT lookyloo.v)\n" + "FROM foo LEFT JOIN lookup.lookyloo ON foo.dim1 = lookyloo.k", + queryContext, ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource( @@ -11206,7 +11277,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testUsingSubqueryAsPartOfAndFilter() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testUsingSubqueryAsPartOfAndFilter(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -11216,6 +11288,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + "WHERE dim2 IN (SELECT dim1 FROM druid.foo WHERE dim1 <> '')\n" + "AND dim1 <> 'xxx'\n" + "group by dim1, dim2 ORDER BY dim2", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -11255,7 +11328,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest Integer.MAX_VALUE ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -11265,7 +11338,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testUsingSubqueryAsPartOfOrFilter() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testUsingSubqueryAsPartOfOrFilter(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -11274,6 +11348,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT dim1, dim2, COUNT(*) FROM druid.foo\n" + "WHERE dim1 = 'xxx' OR dim2 IN (SELECT dim1 FROM druid.foo WHERE dim1 LIKE '%bc')\n" + "group by dim1, dim2 ORDER BY dim2", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -11307,7 +11382,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest new DefaultDimensionSpec("v0", "d1", ValueType.LONG) ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), "_j0.", @@ -11343,7 +11418,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest Integer.MAX_VALUE ) ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -11369,7 +11444,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testNestedGroupByOnInlineDataSourceWithFilterIsNotSupported() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testNestedGroupByOnInlineDataSourceWithFilterIsNotSupported(Map<String, Object> queryContext) throws Exception { try { testQuery( @@ -11385,6 +11461,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest + " group by 1" + ")" + "SELECT count(*) from def", + queryContext, ImmutableList.of( GroupByQuery .builder() @@ -11399,7 +11476,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Intervals.of("2001-01-02T00:00:00.000Z/146140482-04-24T15:36:27.903Z"))) .columns("dim1", "m2") .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), new QueryDataSource( @@ -11408,7 +11485,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .intervals(querySegmentSpec(Intervals.of("2001-01-02T00:00:00.000Z/146140482-04-24T15:36:27.903Z"))) .columns("dim1", "m2") .resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST) - .context(QUERY_CONTEXT_DEFAULT) + .context(queryContext) .build() ), "j0", @@ -11680,13 +11757,15 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testInAggregationSubquery() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testInAggregationSubquery(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); testQuery( "SELECT DISTINCT __time FROM druid.foo WHERE __time IN (SELECT MAX(__time) FROM druid.foo)", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -11712,7 +11791,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setInterval(querySegmentSpec(Filtration.eternity())) .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("__time", "d0", ValueType.LONG))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -11722,13 +11801,15 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testNotInAggregationSubquery() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testNotInAggregationSubquery(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); testQuery( "SELECT DISTINCT __time FROM druid.foo WHERE __time NOT IN (SELECT MAX(__time) FROM druid.foo)", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -11759,7 +11840,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) : new CountAggregatorFactory("_a1") ) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), "j0.", @@ -11790,7 +11871,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) ) .setDimensions(dimensions(new DefaultDimensionSpec("__time", "d0", ValueType.LONG))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -11804,7 +11885,8 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test - public void testUsingSubqueryWithExtractionFns() throws Exception + @Parameters(source = QueryContextForJoinProvider.class) + public void testUsingSubqueryWithExtractionFns(Map<String, Object> queryContext) throws Exception { // Cannot vectorize JOIN operator. cannotVectorize(); @@ -11813,6 +11895,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest "SELECT dim2, COUNT(*) FROM druid.foo " + "WHERE substring(dim2, 1, 1) IN (SELECT substring(dim1, 1, 1) FROM druid.foo WHERE dim1 <> '')" + "group by dim2", + queryContext, ImmutableList.of( GroupByQuery.builder() .setDataSource( @@ -11849,7 +11932,7 @@ public class CalciteQueryTest extends BaseCalciteQueryTest .setGranularity(Granularities.ALL) .setDimensions(dimensions(new DefaultDimensionSpec("dim2", "d0"))) .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) - .setContext(QUERY_CONTEXT_DEFAULT) + .setContext(queryContext) .build() ), ImmutableList.of( @@ -11860,6 +11943,79 @@ public class CalciteQueryTest extends BaseCalciteQueryTest } @Test + @Parameters(source = QueryContextForJoinProvider.class) + public void testInnerJoinWithIsNullFilter(Map<String, Object> queryContext) throws Exception + { + testQuery( + "SELECT dim1, l.v from druid.foo f inner join lookup.lookyloo l on f.dim1 = l.k where f.dim2 is null", + queryContext, + ImmutableList.of( + newScanQueryBuilder() + .dataSource( + join( + new TableDataSource(CalciteTests.DATASOURCE1), + new LookupDataSource("lookyloo"), + "j0.", + equalsCondition( + DruidExpression.fromColumn("dim1"), + DruidExpression.fromColumn("j0.k") + ), + JoinType.INNER + ) + ) + .intervals(querySegmentSpec(Filtration.eternity())) + .filters(selector("dim2", null, null)) + .columns("dim1", "j0.v") + .build() + ), + ImmutableList.of( + new Object[]{"abc", "xabc"} + ) + ); + } + + @Test + @Parameters(source = QueryContextForJoinProvider.class) + @Ignore // regression test for https://github.com/apache/druid/issues/9924 + public void testInnerJoinOnMultiValueColumn(Map<String, Object> queryContext) throws Exception + { + cannotVectorize(); + testQuery( + "SELECT dim3, l.v, count(*) from druid.foo f inner join lookup.lookyloo l on f.dim3 = l.k " + + "group by 1, 2", + queryContext, + ImmutableList.of( + GroupByQuery.builder() + .setDataSource( + join( + new TableDataSource(CalciteTests.DATASOURCE1), + new LookupDataSource("lookyloo"), + "j0.", + equalsCondition( + DruidExpression.fromColumn("dim3"), + DruidExpression.fromColumn("j0.k") + ), + JoinType.INNER + ) + ) + .setInterval(querySegmentSpec(Filtration.eternity())) + .setGranularity(Granularities.ALL) + .setAggregatorSpecs(aggregators(new CountAggregatorFactory("a0"))) + .setDimensions( + dimensions( + new DefaultDimensionSpec("dim3", "d0"), + new DefaultDimensionSpec("j0.v", "d1") + ) + ) + .build() + ), + ImmutableList.of( + new Object[]{"2", "x2", 1L} + ) + ); + } + + @Test public void testUsingSubqueryWithLimit() throws Exception { expectedException.expect(CannotBuildQueryException.class); @@ -13917,4 +14073,39 @@ public class CalciteQueryTest extends BaseCalciteQueryTest ) ); } + + /** + * This is a provider of query contexts that should be used by join tests. + * It tests various configs that can be passed to join queries. All the configs provided by this provider should + * have the join query engine return the same results. + */ + public static class QueryContextForJoinProvider + { + @UsedByJUnitParamsRunner + public static Object[] provideQueryContexts() + { + return new Object[] { + // default behavior + QUERY_CONTEXT_DEFAULT, + // filter value re-writes enabled + new ImmutableMap.Builder<String, Object>() + .putAll(QUERY_CONTEXT_DEFAULT) + .put(QueryContexts.JOIN_FILTER_REWRITE_VALUE_COLUMN_FILTERS_ENABLE_KEY, true) + .put(QueryContexts.JOIN_FILTER_REWRITE_ENABLE_KEY, true) + .build(), + // rewrite values enabled but filter re-writes disabled. + // This should be drive the same behavior as the previous config + new ImmutableMap.Builder<String, Object>() + .putAll(QUERY_CONTEXT_DEFAULT) + .put(QueryContexts.JOIN_FILTER_REWRITE_VALUE_COLUMN_FILTERS_ENABLE_KEY, true) + .put(QueryContexts.JOIN_FILTER_REWRITE_ENABLE_KEY, false) + .build(), + // filter re-writes disabled + new ImmutableMap.Builder<String, Object>() + .putAll(QUERY_CONTEXT_DEFAULT) + .put(QueryContexts.JOIN_FILTER_REWRITE_ENABLE_KEY, false) + .build(), + }; + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org For additional commands, e-mail: commits-h...@druid.apache.org