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);