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 fb90074de24f60f7134c18da896e707e71d3241b
Author: Pengfei Zhan <dethr...@gmail.com>
AuthorDate: Thu Mar 2 15:03:34 2023 +0800

    KYLIN-5523 [FOLLOW UP] Fix using a computed column as the join key leads to 
a schema change failure
    
    KYLIN-5523 [FOLLOW UP] expression of computed column change will be treated 
as a significant change to the model
    KYLIN-5523 [FOLLOW UP] Table reloading cannot be affected by a damaged join 
key of computed column
---
 .../java/org/apache/kylin/metadata/model/ColumnDesc.java     | 12 +++++++++++-
 .../test/java/org/apache/kylin/event/SchemaChangeTest.java   |  5 +----
 .../java/org/apache/kylin/rest/service/ModelService.java     |  7 ++++++-
 .../main/java/org/apache/kylin/query/schema/OLAPTable.java   |  4 ++--
 4 files changed, 20 insertions(+), 8 deletions(-)

diff --git 
a/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java
 
b/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java
index 49094bf6a3..71cf9fedc4 100644
--- 
a/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java
+++ 
b/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java
@@ -272,7 +272,17 @@ public class ColumnDesc implements Serializable {
         } else if (!name.equals(other.name))
             return false;
 
-        return table == null ? other.table == null : 
table.getIdentity().equals(other.table.getIdentity());
+        boolean isSameTable = table == null ? other.table == null
+                : table.getIdentity().equals(other.table.getIdentity());
+        if (!isSameTable) {
+            return false;
+        }
+        if (this.isComputedColumn() && other.isComputedColumn()) {
+            // add a simple check of computed column's inner expression
+            return StringUtils.equals(computedColumnExpr, 
other.getComputedColumnExpr());
+        }
+
+        return !this.isComputedColumn() && !other.isComputedColumn();
     }
 
     @Override
diff --git 
a/src/kylin-it/src/test/java/org/apache/kylin/event/SchemaChangeTest.java 
b/src/kylin-it/src/test/java/org/apache/kylin/event/SchemaChangeTest.java
index 831bf2f6dd..00b58e7418 100644
--- a/src/kylin-it/src/test/java/org/apache/kylin/event/SchemaChangeTest.java
+++ b/src/kylin-it/src/test/java/org/apache/kylin/event/SchemaChangeTest.java
@@ -79,7 +79,6 @@ import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -94,7 +93,6 @@ import lombok.val;
 import lombok.var;
 import lombok.extern.slf4j.Slf4j;
 
-@Ignore("disable unstable test")
 @Slf4j
 public class SchemaChangeTest extends AbstractMVCIntegrationTestCase {
 
@@ -246,7 +244,6 @@ public class SchemaChangeTest extends 
AbstractMVCIntegrationTestCase {
         assertSqls();
     }
 
-    @Ignore("TODO: remove or adapt")
     @Test
     public void testChangeColumnType() throws Exception {
         changeColumns(TABLE_IDENTITY, Sets.newHashSet("SRC_ID"), columnDesc -> 
columnDesc.setDatatype("string"));
@@ -334,7 +331,7 @@ public class SchemaChangeTest extends 
AbstractMVCIntegrationTestCase {
 
     private void setupPushdownEnv() throws Exception {
         getTestConfig().setProperty("kylin.query.pushdown.runner-class-name",
-                "io.kyligence.kap.query.pushdown.PushDownRunnerJdbcImpl");
+                "org.apache.kylin.query.pushdown.PushDownRunnerJdbcImpl");
         getTestConfig().setProperty("kylin.query.pushdown-enabled", "true");
         // Load H2 Tables (inner join)
         Connection h2Connection = 
DriverManager.getConnection("jdbc:h2:mem:db_default;DB_CLOSE_DELAY=-1", "sa", 
"");
diff --git 
a/src/modeling-service/src/main/java/org/apache/kylin/rest/service/ModelService.java
 
b/src/modeling-service/src/main/java/org/apache/kylin/rest/service/ModelService.java
index 21d52c7956..d0073de148 100644
--- 
a/src/modeling-service/src/main/java/org/apache/kylin/rest/service/ModelService.java
+++ 
b/src/modeling-service/src/main/java/org/apache/kylin/rest/service/ModelService.java
@@ -128,6 +128,7 @@ import org.apache.kylin.common.util.JsonUtil;
 import org.apache.kylin.common.util.Pair;
 import org.apache.kylin.common.util.RandomUtil;
 import org.apache.kylin.common.util.StringHelper;
+import org.apache.kylin.common.util.ThreadUtil;
 import org.apache.kylin.engine.spark.utils.ComputedColumnEvalUtil;
 import org.apache.kylin.job.SecondStorageJobParamUtil;
 import org.apache.kylin.job.common.SegmentUtil;
@@ -3264,7 +3265,11 @@ public class ModelService extends AbstractModelService 
implements TableModelSupp
         val modelManager = getManager(NDataModelManager.class, project);
         val origin = modelManager.getDataModelDesc(modelRequest.getUuid());
         val copyModel = modelManager.copyForWrite(origin);
-        semanticUpdater.updateModelColumns(copyModel, modelRequest);
+        try {
+            semanticUpdater.updateModelColumns(copyModel, modelRequest);
+        } catch (Exception e) {
+            log.warn("Update existing model failed.{}", 
ThreadUtil.getKylinStackTrace());
+        }
         copyModel.setBrokenReason(NDataModel.BrokenReason.SCHEMA);
         copyModel.getAllNamedColumns().forEach(namedColumn -> {
             if (columnIds.contains(namedColumn.getId())) {
diff --git 
a/src/query-common/src/main/java/org/apache/kylin/query/schema/OLAPTable.java 
b/src/query-common/src/main/java/org/apache/kylin/query/schema/OLAPTable.java
index ff3ba69038..5b19ad4d4f 100644
--- 
a/src/query-common/src/main/java/org/apache/kylin/query/schema/OLAPTable.java
+++ 
b/src/query-common/src/main/java/org/apache/kylin/query/schema/OLAPTable.java
@@ -19,7 +19,7 @@
 package org.apache.kylin.query.schema;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -249,7 +249,7 @@ public class OLAPTable extends AbstractQueryableTable 
implements TranslatableTab
             }
         }
 
-        Collections.sort(tableColumns, (o1, o2) -> o1.getZeroBasedIndex() - 
o2.getZeroBasedIndex());
+        
tableColumns.sort(Comparator.comparingInt(ColumnDesc::getZeroBasedIndex));
         return Lists.newArrayList(Iterables.concat(tableColumns, 
metricColumns));
     }
 

Reply via email to