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 5b41bca2aebfefdc7563ef19110c6ef7ec8c2dc6 Author: Dorris Zhang <ruixuan.zh...@kyligence.io> AuthorDate: Mon Dec 26 19:16:29 2022 +0800 KYLIN-5450 check if shard by columns included in col orders --- .../common/exception/code/ErrorCodeServer.java | 1 + .../resources/kylin_error_msg_conf_cn.properties | 1 + .../resources/kylin_error_msg_conf_en.properties | 1 + .../main/resources/kylin_errorcode_conf.properties | 1 + .../kylin/rest/controller/NIndexPlanController.java | 10 ++++++++++ .../rest/controller/IndexPlanControllerTest.java | 21 ++++++++++++++++++--- 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java b/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java index b5eb0fd98c..54f81183e7 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java @@ -107,6 +107,7 @@ public enum ErrorCodeServer implements ErrorCodeProducer { RULE_BASED_INDEX_METADATA_INCONSISTENT("KE-010012201"), INDEX_DUPLICATE("KE-010012202"), INDEX_PARAMETER_INVALID("KE-010012203"), + SHARD_BY_COLUMN_NOT_IN_INDEX("KE-010012204"), // 10043XX parameter check REQUEST_PARAMETER_EMPTY_OR_VALUE_EMPTY("KE-010043201"), diff --git a/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties b/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties index be8bca221a..2768232b9d 100644 --- a/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties +++ b/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties @@ -109,6 +109,7 @@ KE-010010205=可计算列名和表达式不能为空。请检查后重试。 KE-010012201=索引元数据不一致。请尝试刷新下列模型的所有 Segment:项目[%s],模型[%s]。 KE-010012202=因为存在相同的索引,无法新建该索引。请修改。 KE-010012203=参数 “%s” 仅支持 “%s”。 +KE-010012204=ShardBy 列不在索引包含的列中,请修改后重试。 ## 10043XX parameter check KE-010043201=请求参数 “%s” 为空或值为空。请检查请求参数是否正确填写。 diff --git a/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties b/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties index b44c0ef422..fc75aa0610 100644 --- a/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties +++ b/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties @@ -107,6 +107,7 @@ KE-010010205=Computed column names and expressions cannot be empty. Please check KE-010012201=Index metadata might be inconsistent. Please try refreshing all segments in the following model: Project [%s], Model [%s]. KE-010012202=Can't add this index, as the same index already exists. Please modify. KE-010012203=The parameter "%s" only supports "%s". +KE-010012204=The ShardBy column is not included in the index. Please fix and try again. ## 10043XX parameter check KE-010043201=Request parameter "%s" is empty or value is empty. Please check the request parameters. diff --git a/src/core-common/src/main/resources/kylin_errorcode_conf.properties b/src/core-common/src/main/resources/kylin_errorcode_conf.properties index 074fb6550e..976e342cc9 100644 --- a/src/core-common/src/main/resources/kylin_errorcode_conf.properties +++ b/src/core-common/src/main/resources/kylin_errorcode_conf.properties @@ -113,6 +113,7 @@ KE-010010205 KE-010012201 KE-010012202 KE-010012203 +KE-010012204 ## 10043XX parameter check KE-010043201 diff --git a/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NIndexPlanController.java b/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NIndexPlanController.java index 24124071a5..3bca9f0ecf 100644 --- a/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NIndexPlanController.java +++ b/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NIndexPlanController.java @@ -21,6 +21,7 @@ package org.apache.kylin.rest.controller; import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_JSON; import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_V4_PUBLIC_JSON; import static org.apache.kylin.common.exception.code.ErrorCodeServer.LAYOUT_LIST_EMPTY; +import static org.apache.kylin.common.exception.code.ErrorCodeServer.SHARD_BY_COLUMN_NOT_IN_INDEX; import java.util.List; import java.util.Set; @@ -143,10 +144,19 @@ public class NIndexPlanController extends NBasicController { checkRequiredArg(MODEL_ID, request.getModelId()); checkRequiredArg("id", request.getId()); modelService.validateCCType(request.getModelId(), request.getProject()); + List<String> shardByColumns = request.getShardByColumns(); + List<String> colOrder = request.getColOrder(); + checkShardbyCol(shardByColumns, colOrder); val response = fusionIndexService.updateTableIndex(request.getProject(), request); return new EnvelopeResponse<>(KylinException.CODE_SUCCESS, response, ""); } + private void checkShardbyCol(List<String> shardByColumns, List<String> colOrder) { + if (!colOrder.containsAll(shardByColumns)) { + throw new KylinException(SHARD_BY_COLUMN_NOT_IN_INDEX); + } + } + @Deprecated @ApiOperation(value = "deleteTableIndex", tags = { "AI" }, notes = "Update URL: {project}, Update Param: project") @DeleteMapping(value = "/table_index/{id:.+}") diff --git a/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/IndexPlanControllerTest.java b/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/IndexPlanControllerTest.java index 1acfb539ea..bcb9ef7ec1 100644 --- a/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/IndexPlanControllerTest.java +++ b/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/IndexPlanControllerTest.java @@ -18,21 +18,25 @@ package org.apache.kylin.rest.controller; import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_JSON; +import static org.apache.kylin.common.exception.code.ErrorCodeServer.SHARD_BY_COLUMN_NOT_IN_INDEX; +import org.apache.kylin.common.exception.KylinException; import org.apache.kylin.common.util.JsonUtil; -import org.apache.kylin.common.util.Pair; -import org.apache.kylin.rest.constant.Constant; -import org.apache.kylin.rest.response.DiffRuleBasedIndexResponse; import org.apache.kylin.common.util.NLocalFileMetadataTestCase; +import org.apache.kylin.common.util.Pair; import org.apache.kylin.metadata.cube.model.IndexEntity; import org.apache.kylin.metadata.cube.model.IndexPlan; +import org.apache.kylin.rest.constant.Constant; import org.apache.kylin.rest.request.CreateBaseIndexRequest; +import org.apache.kylin.rest.request.CreateTableIndexRequest; import org.apache.kylin.rest.request.UpdateRuleBasedCuboidRequest; import org.apache.kylin.rest.response.BuildIndexResponse; +import org.apache.kylin.rest.response.DiffRuleBasedIndexResponse; import org.apache.kylin.rest.service.FusionIndexService; import org.apache.kylin.rest.service.IndexPlanService; import org.apache.kylin.rest.service.ModelService; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; @@ -156,4 +160,15 @@ public class IndexPlanControllerTest extends NLocalFileMetadataTestCase { .accept(MediaType.parseMediaType(HTTP_VND_APACHE_KYLIN_JSON))) .andExpect(MockMvcResultMatchers.status().isOk()); } + + @Test + public void testUpdateTableIndex() { + CreateTableIndexRequest tableIndexRequest = CreateTableIndexRequest.builder().project("default") + .modelId("89af4ee2-2cdb-4b07-b39e-4c29856309aa").id(20000010000L) + .colOrder(Lists.newArrayList("1", "0", "2")).shardByColumns(Lists.newArrayList("4")) + .sortByColumns(Lists.newArrayList("0", "2")).build(); + Assert.assertThrows(SHARD_BY_COLUMN_NOT_IN_INDEX.getMsg(), KylinException.class, () -> { + indexPlanController.updateTableIndex(tableIndexRequest); + }); + } }