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 13bd871bdf9d18bb2431cba466b80b6244ba607f Author: Zhixiong Chen <c...@apache.org> AuthorDate: Fri Oct 14 12:56:10 2022 +0800 skip secondary index while modify column --- .../kyligence/kap/secondstorage/SecondStorageLockTest.java | 14 +++++++++++++- .../kap/clickhouse/database/ClickHouseQueryOperator.java | 8 ++++++-- .../management/SecondStorageScheduleService.java | 7 ++++++- .../kap/secondstorage/management/SecondStorageService.java | 6 ++++++ .../kap/secondstorage/database/QueryOperator.java | 3 ++- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/second-storage/clickhouse-it/src/test/java/io/kyligence/kap/secondstorage/SecondStorageLockTest.java b/src/second-storage/clickhouse-it/src/test/java/io/kyligence/kap/secondstorage/SecondStorageLockTest.java index 03c191ab16..ffb4340233 100644 --- a/src/second-storage/clickhouse-it/src/test/java/io/kyligence/kap/secondstorage/SecondStorageLockTest.java +++ b/src/second-storage/clickhouse-it/src/test/java/io/kyligence/kap/secondstorage/SecondStorageLockTest.java @@ -2867,7 +2867,7 @@ public class SecondStorageLockTest implements JobWaiter { int replica = 1; configClickhouseWith(clickhouse, replica, catalog, () -> { QueryOperator queryOperator = SecondStorageFactoryUtils.createQueryMetricOperator(getProject()); - queryOperator.modifyColumnByCardinality("default", "table"); + queryOperator.modifyColumnByCardinality("default", "table", Sets.newHashSet()); buildIncrementalLoadQuery("2012-01-02", "2012-01-03"); waitAllJobFinish(); @@ -2938,6 +2938,18 @@ public class SecondStorageLockTest implements JobWaiter { } } assertEquals(LOW_CARDINALITY_STRING, rows); + + queryOperator.modifyColumnByCardinality(database, destTableName, Sets.newHashSet(4)); + try (Connection connection = DriverManager.getConnection(clickhouse1.getJdbcUrl()); + val stmt = connection.createStatement()) { + val rs = stmt.executeQuery(String.format(Locale.ROOT, "desc %s.%s", database, destTableName)); + while (rs.next()) { + if ("c4".equals(rs.getString(1))) { + rows = rs.getString(2); + } + } + } + assertEquals(LOW_CARDINALITY_STRING, rows); return true; }); } diff --git a/src/second-storage/clickhouse/src/main/java/io/kyligence/kap/clickhouse/database/ClickHouseQueryOperator.java b/src/second-storage/clickhouse/src/main/java/io/kyligence/kap/clickhouse/database/ClickHouseQueryOperator.java index 7e0b37d3bd..ab214644ba 100644 --- a/src/second-storage/clickhouse/src/main/java/io/kyligence/kap/clickhouse/database/ClickHouseQueryOperator.java +++ b/src/second-storage/clickhouse/src/main/java/io/kyligence/kap/clickhouse/database/ClickHouseQueryOperator.java @@ -28,6 +28,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import io.kyligence.kap.secondstorage.ColumnMapping; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; @@ -166,7 +167,7 @@ public class ClickHouseQueryOperator implements QueryOperator { QueryMetrics.SOURCE_RESULT_COUNT, -1L); } - public void modifyColumnByCardinality(String database, String destTableName) { + public void modifyColumnByCardinality(String database, String destTableName, Set<Integer> secondaryIndex) { KylinConfig config = KylinConfig.getInstanceFromEnv(); List<NodeGroup> nodeGroups = SecondStorageUtil.listNodeGroup(config, project); Set<String> nodes = nodeGroups.stream() @@ -178,7 +179,10 @@ public class ClickHouseQueryOperator implements QueryOperator { return; ProjectInstance projectInstance = NProjectManager.getInstance(config).getProject(project); - List<ClickHouseSystemQuery.DescTable> modifyColumns = getFilterDescTable(maxRowsNode, database, destTableName, projectInstance.getConfig()); + val tableColumns = getFilterDescTable(maxRowsNode, database, destTableName, projectInstance.getConfig()); + val modifyColumns = tableColumns.stream() + .filter(col -> !secondaryIndex.contains(Integer.valueOf(ColumnMapping.secondStorageColumnToKapColumn(col.getColumn())))) + .collect(Collectors.toList()); if (CollectionUtils.isEmpty(modifyColumns)) return; diff --git a/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageScheduleService.java b/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageScheduleService.java index 97ac724418..eec15691e2 100644 --- a/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageScheduleService.java +++ b/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageScheduleService.java @@ -19,6 +19,8 @@ package io.kyligence.kap.secondstorage.management; import com.google.common.collect.Maps; +import io.kyligence.kap.secondstorage.metadata.TableEntity; +import io.kyligence.kap.secondstorage.metadata.TablePlan; import org.apache.kylin.metadata.cube.model.NDataflowManager; import org.apache.kylin.metadata.epoch.EpochManager; import org.apache.kylin.metadata.model.NDataModel; @@ -98,7 +100,10 @@ public class SecondStorageScheduleService { try { val database = NameUtil.getDatabase(df); val destTableName = NameUtil.getTable(df, SecondStorageUtil.getBaseIndex(df).getId()); - queryOperator.modifyColumnByCardinality(database, destTableName); + val tablePlanManager = SecondStorageUtil.tablePlanManager(config, project); + TablePlan tablePlan = tablePlanManager.get().get(model.getId()).get(); + TableEntity tableEntity = tablePlan.getEntity(SecondStorageUtil.getBaseIndex(df).getId()).orElse(null); + queryOperator.modifyColumnByCardinality(database, destTableName, tableEntity.getSecondaryIndexColumns()); } catch (Exception exception) { log.error("Failed to modify second storage low cardinality on model {}.", model.getId(), exception); } finally { diff --git a/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageService.java b/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageService.java index 460e40faed..b62b4e2376 100644 --- a/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageService.java +++ b/src/second-storage/core-ui/src/main/java/io/kyligence/kap/secondstorage/management/SecondStorageService.java @@ -1196,6 +1196,12 @@ public class SecondStorageService extends BasicService implements SecondStorageU if (StringUtils.isEmpty(colPrefix.get())) throw new KylinException(INVALID_PARAMETER, String.format("There is no column %s in model %s", column, df.getModel().getAlias())); + val tablePlanManager = SecondStorageUtil.tablePlanManager(config, project); + TablePlan tablePlan = tablePlanManager.get().get(model).get(); + TableEntity tableEntity = tablePlan.getEntity(SecondStorageUtil.getBaseIndex(df).getId()).orElse(null); + if (tableEntity.getSecondaryIndexColumns().contains(Integer.valueOf(ColumnMapping.secondStorageColumnToKapColumn(colPrefix.get())))) + throw new KylinException(INVALID_PARAMETER, String.format("The column %s is Secondary Index Column.", column)); + val destTableName = NameUtil.getTable(df, layout.getId()); queryOperator.modifyColumnByCardinality(database, destTableName, colPrefix.get(), datatype); } catch (Exception exception) { diff --git a/src/second-storage/core/src/main/java/io/kyligence/kap/secondstorage/database/QueryOperator.java b/src/second-storage/core/src/main/java/io/kyligence/kap/secondstorage/database/QueryOperator.java index a723e6f337..c0f04b65b6 100644 --- a/src/second-storage/core/src/main/java/io/kyligence/kap/secondstorage/database/QueryOperator.java +++ b/src/second-storage/core/src/main/java/io/kyligence/kap/secondstorage/database/QueryOperator.java @@ -19,11 +19,12 @@ package io.kyligence.kap.secondstorage.database; import java.util.Map; +import java.util.Set; public interface QueryOperator { Map<String, Object> getQueryMetric(String queryId); - void modifyColumnByCardinality(String database, String destTableName); + void modifyColumnByCardinality(String database, String destTableName, Set<Integer> secondaryIndex); void modifyColumnByCardinality(String database, String destTableName, String column, String datatype); }