[ https://issues.apache.org/jira/browse/KYLIN-3720?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16722721#comment-16722721 ]
ASF GitHub Bot commented on KYLIN-3720: --------------------------------------- shaofengshi closed pull request #399: KYLIN-3720 add column family check when save/update cube desc URL: https://github.com/apache/kylin/pull/399 This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java index b76f7b9268..dcaa259e19 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java @@ -41,6 +41,8 @@ import org.apache.kylin.cube.model.CubeBuildTypeEnum; import org.apache.kylin.cube.model.CubeDesc; import org.apache.kylin.cube.model.CubeJoinedFlatTableDesc; +import org.apache.kylin.cube.model.HBaseColumnDesc; +import org.apache.kylin.cube.model.HBaseColumnFamilyDesc; import org.apache.kylin.cube.model.RowKeyColDesc; import org.apache.kylin.dimension.DimensionEncodingFactory; import org.apache.kylin.engine.mr.common.CuboidStatsReaderUtil; @@ -49,6 +51,7 @@ import org.apache.kylin.job.exception.JobException; import org.apache.kylin.metadata.model.IJoinedFlatTableDesc; import org.apache.kylin.metadata.model.ISourceAware; +import org.apache.kylin.metadata.model.MeasureDesc; import org.apache.kylin.metadata.model.SegmentRange; import org.apache.kylin.metadata.model.SegmentRange.TSRange; import org.apache.kylin.metadata.project.ProjectInstance; @@ -589,6 +592,8 @@ public CubeRequest saveCubeDesc(@RequestBody CubeRequest cubeRequest) { throw new BadRequestException("Invalid Cube name, only letters, numbers and underscore supported."); } + validateColumnFamily(desc); + try { desc.setUuid(RandomUtil.randomUUID().toString()); String projectName = (null == cubeRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME @@ -608,6 +613,27 @@ public CubeRequest saveCubeDesc(@RequestBody CubeRequest cubeRequest) { return cubeRequest; } + //column family metrics may not match the real metrics when editing cube by json,see MTHDP-5091 + private void validateColumnFamily(CubeDesc cubeDesc) { + Set<String> columnFamilyMetricsSet = Sets.newHashSet(); + for (HBaseColumnFamilyDesc hBaseColumnFamilyDesc : cubeDesc.getHbaseMapping().getColumnFamily()) { + for (HBaseColumnDesc hBaseColumnDesc : hBaseColumnFamilyDesc.getColumns()) { + for (String columnName : hBaseColumnDesc.getMeasureRefs()) { + columnFamilyMetricsSet.add(columnName); + } + } + } + for (MeasureDesc measureDesc : cubeDesc.getMeasures()) { + if (!columnFamilyMetricsSet.contains(measureDesc.getName())) { + throw new BadRequestException("column family lack measure:" + measureDesc.getName()); + } + } + if (cubeDesc.getMeasures().size() != columnFamilyMetricsSet.size()) { + throw new BadRequestException( + "the number of input measure and the number of measure defined in cubedesc are not consistent"); + } + } + /** * update CubDesc * @@ -635,6 +661,8 @@ public CubeRequest updateCubeDesc(@RequestBody CubeRequest cubeRequest) throws J return cubeRequest; } + validateColumnFamily(desc); + //cube renaming is not allowed if (!cube.getDescriptor().getName().equalsIgnoreCase(desc.getName())) { String error = "Cube Desc renaming is not allowed: desc.getName(): " + desc.getName() ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > add column family check when save/update cube desc > -------------------------------------------------- > > Key: KYLIN-3720 > URL: https://issues.apache.org/jira/browse/KYLIN-3720 > Project: Kylin > Issue Type: Improvement > Reporter: WangBo > Assignee: WangBo > Priority: Major > Attachments: KYLIN-3720.patch > > > when update or create cube desc by editing json,it may cause query failed > when the input column of column family is invalid.So checking user input > column with columns defined in cube desc can aovid it. > {code:java} > // query failed error > Caused by: java.lang.IllegalStateException > at > org.apache.kylin.gridtable.GTInfo.validateColumnBlocks(GTInfo.java:198) > at org.apache.kylin.gridtable.GTInfo.validate(GTInfo.java:167) > at org.apache.kylin.gridtable.GTInfo$Builder.build(GTInfo.java:269) > at > org.apache.kylin.cube.gridtable.CubeGridTable.newGTInfo(CubeGridTable.java:35) > at > org.apache.kylin.storage.gtrecord.CubeScanRangePlanner.<init>(CubeScanRangePlanner.java:89) > at > org.apache.kylin.storage.gtrecord.CubeSegmentScanner.<init>(CubeSegmentScanner.java:73) > at > org.apache.kylin.storage.gtrecord.GTCubeStorageQueryBase.search(GTCubeStorageQueryBase.java:89) > at > org.apache.kylin.query.enumerator.OLAPEnumerator.queryStorage(OLAPEnumerator.java:120) > at > org.apache.kylin.query.enumerator.OLAPEnumerator.moveNext(OLAPEnumerator.java:64){code} > > -- This message was sent by Atlassian JIRA (v7.6.3#76005)