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

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

commit eacb62b8aa9c23a627ec5803d18b245420222f4c
Author: Pengfei Zhan <dethr...@gmail.com>
AuthorDate: Tue Sep 26 21:23:55 2023 +0800

    KYLIN-5838 Replace join expression with the name of computedColumn
---
 .../kylin/query/util/ConvertToComputedColumn.java  | 20 +++++++
 .../apache/kylin/query/util/CCOnRealModelTest.java | 68 ++++++++++------------
 2 files changed, 52 insertions(+), 36 deletions(-)

diff --git 
a/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java
 
b/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java
index 1c4fa5a287..8e4e7631b7 100644
--- 
a/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java
+++ 
b/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java
@@ -34,11 +34,13 @@ import javax.annotation.Nullable;
 import org.apache.calcite.avatica.util.Quoting;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.SqlAsOperator;
+import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlDataTypeSpec;
 import org.apache.calcite.sql.SqlDynamicParam;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlIntervalQualifier;
+import org.apache.calcite.sql.SqlJoin;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
@@ -100,12 +102,30 @@ public class ConvertToComputedColumn implements 
IQueryTransformer {
         List<SqlNode> inputNodes = new LinkedList<>();
         inputNodes.addAll(collectCandidateInputNodes(select.getSelectList(), 
select.getGroup()));
         inputNodes.addAll(collectCandidateInputNodes(select.getOrderList(), 
select.getGroup()));
+        if (select.getFrom() instanceof SqlJoin) {
+            SqlJoin join = (SqlJoin) select.getFrom();
+            collectJoinNodes(inputNodes, join);
+        }
         inputNodes.addAll(collectCandidateInputNode(select.getHaving(), 
select.getGroup()));
         inputNodes.addAll(getInputTreeNodes(select.getWhere()));
         inputNodes.addAll(getInputTreeNodes(select.getGroup()));
         return inputNodes;
     }
 
+    private static void collectJoinNodes(List<SqlNode> inputNodes, SqlJoin 
join) {
+        if (join.getLeft() instanceof SqlJoin) {
+            collectJoinNodes(inputNodes, (SqlJoin) join.getLeft());
+        }
+        SqlNode condition = join.getCondition();
+        if (condition.getKind() == SqlKind.EQUALS) {
+            SqlBasicCall call = (SqlBasicCall) condition;
+            inputNodes.addAll(call.getOperandList());
+        }
+        if (join.getRight() instanceof SqlJoin) {
+            collectJoinNodes(inputNodes, (SqlJoin) join.getRight());
+        }
+    }
+
     private static List<SqlNode> collectInputNodes(SqlOrderBy sqlOrderBy) {
         // if order list is not empty and query is a select
         // then collect order list with checking on group keys
diff --git 
a/src/query/src/test/java/org/apache/kylin/query/util/CCOnRealModelTest.java 
b/src/query/src/test/java/org/apache/kylin/query/util/CCOnRealModelTest.java
index 164810ad51..a299fbee9e 100644
--- a/src/query/src/test/java/org/apache/kylin/query/util/CCOnRealModelTest.java
+++ b/src/query/src/test/java/org/apache/kylin/query/util/CCOnRealModelTest.java
@@ -17,32 +17,20 @@
  */
 package org.apache.kylin.query.util;
 
-import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.apache.kylin.junit.annotation.MetadataInfo;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 
 /**
  * test against real models
  */
-public class CCOnRealModelTest extends NLocalFileMetadataTestCase {
-    private ConvertToComputedColumn converter;
-
-    @Before
-    public void setup() throws Exception {
-        
this.createTestMetadata("../core-metadata/src/test/resources/ut_meta/ccjointest");
-        converter = new ConvertToComputedColumn();
-    }
-
-    @After
-    public void after() throws Exception {
-        super.cleanupTestMetadata();
-    }
+@MetadataInfo(overlay = 
"../core-metadata/src/test/resources/ut_meta/ccjointest")
+class CCOnRealModelTest {
+    private final ConvertToComputedColumn converter = new 
ConvertToComputedColumn();
 
     @Test
-    public void testConvertSingleTableCC() {
+    void testConvertSingleTableCC() {
         {
             String originSql = "select count(*), sum (price * item_count) from 
test_kylin_fact f left join test_order o on f.ORDER_ID = o.ORDER_ID"
                     + " left join test_account a on o.buyer_id = a.account_id 
group by ACCOUNT_COUNTRY";
@@ -79,11 +67,10 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
             check(converter, originSql, ccSql);
 
         }
-
     }
 
     @Test
-    public void testConvertCrossTableCC() {
+    void testConvertCrossTableCC() {
         {
             //buyer
             String originSql = "select count(*), sum (price * item_count) from 
test_kylin_fact f left join test_order o on f.ORDER_ID = o.ORDER_ID"
@@ -112,9 +99,9 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
         }
     }
 
-    @Ignore("historic ignored")
+    @Disabled("historic ignored")
     @Test
-    public void testSubquery() {
+    void testSubquery() {
         {
             String originSql = "select count(*), sum (price * item_count) as 
DEAL_AMOUNT from test_kylin_fact f left join test_order o on f.ORDER_ID = 
o.ORDER_ID"
                     + " left join test_account a on o.buyer_id = a.account_id  
left join test_country c on a.account_country = c.country"
@@ -168,7 +155,7 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testMixModel() {
+    void testMixModel() {
         String originSql = "select count(*), sum (price * item_count) from 
test_kylin_fact f"
                 + " left join test_order o on f.ORDER_ID = o.ORDER_ID"
                 + " left join test_account a on o.buyer_id = a.account_id "
@@ -197,7 +184,7 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testJoinOnCC() {
+    void testJoinOnCC() {
         {
             String originSql = "select count(*) from TEST_KYLIN_FACT\n"
                     + "left join TEST_ORDER on TEST_KYLIN_FACT.ORDER_ID + 1 = 
TEST_ORDER.ORDER_ID + 1";
@@ -206,6 +193,16 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
             check(converter, originSql, ccSql);
         }
 
+        {
+            String originSql = "select LSTG_FORMAT_NAME, LEAF_CATEG_ID from 
TEST_KYLIN_FACT\n"
+                    + "left join TEST_ORDER on TEST_KYLIN_FACT.ORDER_ID + 1 = 
TEST_ORDER.ORDER_ID + 1\n"
+                    + "group by LSTG_FORMAT_NAME, LEAF_CATEG_ID";
+            String ccSql = "select LSTG_FORMAT_NAME, LEAF_CATEG_ID from 
TEST_KYLIN_FACT\n"
+                    + "left join TEST_ORDER on TEST_KYLIN_FACT.ORDER_ID_PLUS_1 
= TEST_ORDER.ID_PLUS_1\n"
+                    + "group by LSTG_FORMAT_NAME, LEAF_CATEG_ID";
+            check(converter, originSql, ccSql);
+        }
+
         {
             String originSql = "select count(*) from TEST_KYLIN_FACT\n"
                     + "left join TEST_ORDER on TEST_KYLIN_FACT.ORDER_ID + 1 = 
TEST_ORDER.ORDER_ID + 1\n"
@@ -230,13 +227,13 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testNoFrom() {
+    void testNoFrom() {
         check(converter, "select sum(price * item_count),(SELECT 1 as VERSION) 
from test_kylin_fact",
                 "select sum(TEST_KYLIN_FACT.DEAL_AMOUNT),(SELECT 1 as VERSION) 
from test_kylin_fact");
     }
 
     @Test
-    public void testFromValues() {
+    void testFromValues() {
         String originSql = "select sum(price * item_count),(SELECT 1 FROM 
(VALUES(1))) from test_kylin_fact";
         String ccSql = "select sum(TEST_KYLIN_FACT.DEAL_AMOUNT),(SELECT 1 FROM 
(VALUES(1))) from test_kylin_fact";
 
@@ -244,7 +241,7 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testNestedCC() {
+    void testNestedCC() {
         String ccSql = "select count(*), sum (F.NEST4) from test_kylin_fact F";
 
         {
@@ -269,14 +266,14 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testCcConvertedOnMultiModel() {
+    void testCcConvertedOnMultiModel() {
         String originSql = "select count(*), sum (price * item_count) from 
test_kylin_fact f";
         String ccSql = "select count(*), sum (F.DEAL_AMOUNT) from 
test_kylin_fact f";
         check(converter, originSql, ccSql);
     }
 
     @Test
-    public void testDateFamily() {
+    void testDateFamily() {
         String originSql = "select count( year(date0)), max(extract(year from 
date1)),\n"
                 + "       count( month(date0)), max(extract(month from 
date1)),\n"
                 + "       count( quarter(date0)), max(extract(quarter from 
date1)),\n"
@@ -303,7 +300,7 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testBasicTimestampAddAndDiff() {
+    void testBasicTimestampAddAndDiff() {
         String originSql = "select sum(timestampdiff(second, time0, time1) ) 
as c1,\n" //
                 + "count(distinct timestampadd(minute, 1, time1)) as c2,\n" //
                 + "max(timestampdiff(hour, time1, time0)) as c3,\n" //
@@ -328,7 +325,7 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testMoreTimestampAddAndDiff() {
+    void testMoreTimestampAddAndDiff() {
         String originSql, ccSql;
         originSql = "select sum((int1-int2)/(int1+int2)) as c1,\n"
                 + "sum((int1-int2)/timestampdiff(second, time0, time1) ) as 
c2,\n"
@@ -449,7 +446,7 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testExplicitCcNameToInnerName() {
+    void testExplicitCcNameToInnerName() {
 
         // case 1. explicit query name in inner-most sub-query
         String originSql = "select max(CALCS.CC_AUTO_17)\n" + " - 
min(CALCS.CC_AUTO_17)\n"
@@ -493,7 +490,6 @@ public class CCOnRealModelTest extends 
NLocalFileMetadataTestCase {
 
     private void check(ConvertToComputedColumn converter, String originSql, 
String ccSql, String project) {
         String transform = converter.transform(originSql, project, "DEFAULT");
-        Assert.assertEquals(ccSql, transform);
+        Assertions.assertEquals(ccSql, transform);
     }
-
 }

Reply via email to