This is an automated email from the ASF dual-hosted git repository.

kfaraz 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 dc1703d  Change value of 
`druid.sql.planner.useGroupingSetForExactDistinct` in common.runtime.properties 
(#12182)
dc1703d is described below

commit dc1703d5f9723634bae123e9a11a6899b2abf05a
Author: Laksh Singla <[email protected]>
AuthorDate: Mon Jan 24 14:00:03 2022 +0530

    Change value of `druid.sql.planner.useGroupingSetForExactDistinct` in 
common.runtime.properties (#12182)
    
    This PR changes the value of the property 
`druid.sql.planner.useGroupingSetForExactDistinct` from `false` to `true` in 
the runtime.properties files, so that newer installations have this property as 
`true`, while the default still remains as `false`.
    
    The flag determines how queries which contain an aggregation over 
`DISTINCT` like `SELECT COUNT(DISTINCT foo.dim1) FILTER(WHERE foo.cnt = 1), 
SUM(foo.cnt) FROM druid.foo` get planned by Calcite. With the flag being set to 
false, it plans it via joins, whereas with it being set to true, the query is 
set using grouping sets.
    
    There is a known issue with Calcite 
(https://github.com/apache/druid/issues/7953), where an NPE is thrown while 
planning the above query with joins. There is no such issue while planning the 
query using grouping sets.
---
 .../cluster/_common/common.runtime.properties      |  3 +
 .../large/_common/common.runtime.properties        |  3 +
 .../medium/_common/common.runtime.properties       |  3 +
 .../_common/common.runtime.properties              |  3 +
 .../_common/common.runtime.properties              |  3 +
 .../small/_common/common.runtime.properties        |  3 +
 .../xlarge/_common/common.runtime.properties       |  3 +
 .../apache/druid/sql/calcite/CalciteQueryTest.java | 93 ++++++++++++++++++++++
 8 files changed, 114 insertions(+)

diff --git a/examples/conf/druid/cluster/_common/common.runtime.properties 
b/examples/conf/druid/cluster/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- a/examples/conf/druid/cluster/_common/common.runtime.properties
+++ b/examples/conf/druid/cluster/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
diff --git 
a/examples/conf/druid/single-server/large/_common/common.runtime.properties 
b/examples/conf/druid/single-server/large/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- a/examples/conf/druid/single-server/large/_common/common.runtime.properties
+++ b/examples/conf/druid/single-server/large/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
diff --git 
a/examples/conf/druid/single-server/medium/_common/common.runtime.properties 
b/examples/conf/druid/single-server/medium/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- a/examples/conf/druid/single-server/medium/_common/common.runtime.properties
+++ b/examples/conf/druid/single-server/medium/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
diff --git 
a/examples/conf/druid/single-server/micro-quickstart/_common/common.runtime.properties
 
b/examples/conf/druid/single-server/micro-quickstart/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- 
a/examples/conf/druid/single-server/micro-quickstart/_common/common.runtime.properties
+++ 
b/examples/conf/druid/single-server/micro-quickstart/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
diff --git 
a/examples/conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
 
b/examples/conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- 
a/examples/conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
+++ 
b/examples/conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
diff --git 
a/examples/conf/druid/single-server/small/_common/common.runtime.properties 
b/examples/conf/druid/single-server/small/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- a/examples/conf/druid/single-server/small/_common/common.runtime.properties
+++ b/examples/conf/druid/single-server/small/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
diff --git 
a/examples/conf/druid/single-server/xlarge/_common/common.runtime.properties 
b/examples/conf/druid/single-server/xlarge/_common/common.runtime.properties
index fbd790f..0fa2e40 100644
--- a/examples/conf/druid/single-server/xlarge/_common/common.runtime.properties
+++ b/examples/conf/druid/single-server/xlarge/_common/common.runtime.properties
@@ -139,6 +139,9 @@ 
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.
 #
 druid.sql.enable=true
 
+# Planning SQL query when there is aggregate distinct in the statement
+druid.sql.planner.useGroupingSetForExactDistinct=true
+
 #
 # Lookups
 #
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 3c77792..4c63b21 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
@@ -2144,6 +2144,99 @@ public class CalciteQueryTest extends 
BaseCalciteQueryTest
   }
 
   @Test
+  public void testExactCountDistinctWithFilter() throws Exception
+  {
+
+    final String sqlQuery = "SELECT COUNT(DISTINCT foo.dim1) FILTER(WHERE 
foo.cnt = 1), SUM(foo.cnt) FROM druid.foo";
+    // When useApproximateCountDistinct=true and 
useGroupingSetForExactDistinct=false, planning fails due
+    // to a bug in the Calcite's rule (AggregateExpandDistinctAggregatesRule)
+    try {
+      testQuery(
+          PLANNER_CONFIG_NO_HLL.withOverrides(ImmutableMap.of(
+              PlannerConfig.CTX_KEY_USE_GROUPING_SET_FOR_EXACT_DISTINCT,
+              "false"
+          )), // Enable exact count distinct
+          sqlQuery,
+          CalciteTests.REGULAR_USER_AUTH_RESULT,
+          ImmutableList.of(),
+          ImmutableList.of()
+      );
+      Assert.fail("query execution should fail");
+    }
+    catch (RuntimeException e) {
+      Assert.assertTrue(e.getMessage().contains("Error while applying rule 
AggregateExpandDistinctAggregatesRule"));
+    }
+
+    requireMergeBuffers(3);
+    testQuery(
+        PLANNER_CONFIG_NO_HLL.withOverrides(ImmutableMap.of(
+            PlannerConfig.CTX_KEY_USE_GROUPING_SET_FOR_EXACT_DISTINCT,
+            "true"
+        )),
+        sqlQuery,
+        CalciteTests.REGULAR_USER_AUTH_RESULT,
+        ImmutableList.of(
+            GroupByQuery.builder()
+                        .setDataSource(
+                            new QueryDataSource(
+                                GroupByQuery.builder()
+                                            
.setDataSource(CalciteTests.DATASOURCE1)
+                                            
.setInterval(querySegmentSpec(Filtration.eternity()))
+                                            .setGranularity(Granularities.ALL)
+                                            
.setVirtualColumns(expressionVirtualColumn(
+                                                "v0",
+                                                
NullHandling.replaceWithDefault()
+                                                ? "(\"cnt\" == 1)"
+                                                : "((\"cnt\" == 1) > 0)",
+                                                ColumnType.LONG
+                                            ))
+                                            .setDimensions(dimensions(
+                                                new 
DefaultDimensionSpec("dim1", "d0", ColumnType.STRING),
+                                                new DefaultDimensionSpec("v0", 
"d1", ColumnType.LONG)
+                                            ))
+                                            .setAggregatorSpecs(
+                                                aggregators(
+                                                    new 
LongSumAggregatorFactory("a0", "cnt"),
+                                                    new 
GroupingAggregatorFactory(
+                                                        "a1",
+                                                        Arrays.asList("dim1", 
"v0")
+                                                    )
+                                                )
+                                            )
+                                            .setSubtotalsSpec(
+                                                ImmutableList.of(
+                                                    ImmutableList.of("d0", 
"d1"),
+                                                    ImmutableList.of()
+                                                )
+                                            )
+                                            .build()
+                            )
+                        )
+                        .setInterval(querySegmentSpec(Filtration.eternity()))
+                        .setGranularity(Granularities.ALL)
+                        .setAggregatorSpecs(aggregators(
+                            new FilteredAggregatorFactory(
+                                new CountAggregatorFactory("_a0"),
+                                and(
+                                    not(selector("d0", null, null)),
+                                    selector("a1", "0", null)
+                                )
+                            ),
+                            new FilteredAggregatorFactory(
+                                new LongMinAggregatorFactory("_a1", "a0"),
+                                selector("a1", "3", null)
+                            )
+                        ))
+                        .setContext(QUERY_CONTEXT_DEFAULT)
+                        .build()
+        ),
+        ImmutableList.of(
+            new Object[]{NullHandling.replaceWithDefault() ? 5L : 6L, 6L}
+        )
+    );
+  }
+
+  @Test
   public void testHavingOnFloatSum() throws Exception
   {
     testQuery(

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to