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


With regards,
Apache Git Services

Reply via email to