From 0aa2836d5961228bb432de7b7c756ad2462fe315 Mon Sep 17 00:00:00 2001 From: wangbo <506340561@qq.com> Date: Sat, 15 Dec 2018 15:45:44 +0800 Subject: [PATCH] KYLIN-3720 add column family check when save/update cube desc --- .../kylin/rest/controller/CubeController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) 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 b76f7b926..88136cd25 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.cuboid.TreeCuboidScheduler; 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.JoinedFlatTable; 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 class CubeController extends BasicController { 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,26 @@ public class CubeController extends BasicController { return cubeRequest; } + //column family metrics may not match the real metrics when editing cube by json + private void validateColumnFamily(CubeDesc cubeDesc){ + Set 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 +660,8 @@ public class CubeController extends BasicController { 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() -- 2.19.1