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

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 4a971ae0912ea399cb032787d7ebda8d1fdd19f0
Author: Dorris Zhang <ruixuan.zh...@kyligence.io>
AuthorDate: Wed Nov 9 19:29:31 2022 +0800

    KYLIN-5400 fix query distinct aggregation not supported
---
 .../kylin/rest/service/QueryServiceTest.java       | 26 ++++++++++++++++++++++
 .../org/apache/kylin/query/engine/QueryExec.java   |  6 +++++
 2 files changed, 32 insertions(+)

diff --git 
a/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
 
b/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
index 49e8eac47c..4dd8eff89f 100644
--- 
a/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
+++ 
b/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
@@ -31,6 +31,7 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -50,6 +51,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import org.apache.calcite.rel.RelNode;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.security.UserGroupInformation;
@@ -2672,4 +2674,28 @@ public class QueryServiceTest extends 
NLocalFileMetadataTestCase {
         List<String> modelColumns2 = 
queryService.getTargetModelColumns("nmodel_basic", dataModels, project);
         Assert.assertEquals(172, modelColumns2.size());
     }
+
+    @Test
+    public void testDistinctAggregationInSql() throws Exception {
+        final String project = "default";
+        String sql1 = "SELECT COUNT(DISTINCT TEST_BANK_INCOME.INCOME) FROM 
TEST_BANK_INCOME inner join TEST_BANK_LOCATION on TEST_BANK_INCOME.COUNTRY = 
TEST_BANK_LOCATION.COUNTRY WHERE \n"
+                + "1 = 1\n" + "and TEST_BANK_INCOME.DT = '2021-11-02'\n"
+                + "and TEST_BANK_INCOME.COUNTRY = 'INDONESIA'\n" + "and 
TEST_BANK_INCOME.COUNTRY = 'KENYA'";
+        QueryExec queryExec = new QueryExec(project, getTestConfig());
+        Class<? extends QueryExec> clazz = queryExec.getClass();
+        Method isCalciteEngineCapable = 
clazz.getDeclaredMethod("isCalciteEngineCapable", RelNode.class);
+        isCalciteEngineCapable.setAccessible(true);
+        RelNode rel1 = queryExec.parseAndOptimize(sql1);
+        QueryResult queryResult1 = queryExec.executeQuery(sql1);
+        Assert.assertEquals(1, queryResult1.getColumns().size());
+        Object routeToCalcite1 = isCalciteEngineCapable.invoke(queryExec, 
rel1);
+        Assert.assertEquals(false, routeToCalcite1);
+
+        String sql2 = "SELECT COUNT(*) FROM TEST_BANK_INCOME inner join 
TEST_BANK_LOCATION on TEST_BANK_INCOME.COUNTRY = TEST_BANK_LOCATION.COUNTRY 
WHERE \n"
+                + "1 = 1\n" + "and TEST_BANK_INCOME.DT = '2021-11-02'\n"
+                + "and TEST_BANK_INCOME.COUNTRY = 'INDONESIA'\n" + "and 
TEST_BANK_INCOME.COUNTRY = 'KENYA'";
+        RelNode rel2 = queryExec.parseAndOptimize(sql2);
+        Object routeToCalcite2 = isCalciteEngineCapable.invoke(queryExec, 
rel2);
+        Assert.assertEquals(true, routeToCalcite2);
+    }
 }
diff --git 
a/src/query/src/main/java/org/apache/kylin/query/engine/QueryExec.java 
b/src/query/src/main/java/org/apache/kylin/query/engine/QueryExec.java
index 463ac8d997..b781e3a25d 100644
--- a/src/query/src/main/java/org/apache/kylin/query/engine/QueryExec.java
+++ b/src/query/src/main/java/org/apache/kylin/query/engine/QueryExec.java
@@ -37,8 +37,10 @@ import org.apache.calcite.prepare.CalciteCatalogReader;
 import org.apache.calcite.prepare.Prepare;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelRoot;
+import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.core.TableScan;
+import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rel.type.RelDataTypeSystem;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexExecutorImpl;
@@ -419,6 +421,10 @@ public class QueryExec {
                     aggCall -> 
FunctionDesc.FUNC_BITMAP_BUILD.equalsIgnoreCase(aggCall.getAggregation().getName())))
 {
                 return false;
             }
+            if (aggregateRel.getInput() instanceof Values
+                    && 
aggregateRel.getAggCallList().stream().anyMatch(AggregateCall::isDistinct)) {
+                return false;
+            }
         }
 
         return rel.getInputs().stream().allMatch(this::isCalciteEngineCapable);

Reply via email to