You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2016/09/03 06:37:24 UTC

[17/50] [abbrv] kylin git commit: KYLIN-1965 Check duplicated measure name

KYLIN-1965 Check duplicated measure name

Signed-off-by: Hongbin Ma <ma...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/46be8055
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/46be8055
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/46be8055

Branch: refs/heads/1.5.x-HBase1.x
Commit: 46be80550e4cbd3403756d615d170dc244c97976
Parents: 1d04642
Author: kangkaisen <ka...@live.com>
Authored: Thu Aug 18 19:17:37 2016 +0800
Committer: Hongbin Ma <ma...@apache.org>
Committed: Sun Aug 28 14:19:07 2016 +0800

----------------------------------------------------------------------
 .../model/validation/rule/FunctionRule.java     | 20 ++++++
 .../model/validation/rule/FunctionRuleTest.java | 68 ++++++++++++++++++++
 webapp/app/js/controllers/cubeMeasures.js       | 16 +++++
 3 files changed, 104 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/46be8055/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
index 44b0be0..792f18d 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
@@ -62,6 +62,10 @@ public class FunctionRule implements IValidatorRule<CubeDesc> {
     public void validate(CubeDesc cube, ValidateContext context) {
         List<MeasureDesc> measures = cube.getMeasures();
 
+        if (validateMeasureNamesDuplicated(measures, context)) {
+            return;
+        }
+
         List<FunctionDesc> countFuncs = new ArrayList<FunctionDesc>();
 
         Iterator<MeasureDesc> it = measures.iterator();
@@ -185,4 +189,20 @@ public class FunctionRule implements IValidatorRule<CubeDesc> {
         }
 
     }
+
+    /**
+     * @param measures
+     */
+    private boolean validateMeasureNamesDuplicated(List<MeasureDesc> measures, ValidateContext context) {
+        Set<String> nameSet = new HashSet<>();
+        for (MeasureDesc measure: measures){
+            if (nameSet.contains(measure.getName())){
+                context.addResult(ResultLevel.ERROR, "There is duplicated measure's name: " + measure.getName());
+                return true;
+            } else {
+                nameSet.add(measure.getName());
+            }
+        }
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/46be8055/core-cube/src/test/java/org/apache/kylin/cube/model/validation/rule/FunctionRuleTest.java
----------------------------------------------------------------------
diff --git a/core-cube/src/test/java/org/apache/kylin/cube/model/validation/rule/FunctionRuleTest.java b/core-cube/src/test/java/org/apache/kylin/cube/model/validation/rule/FunctionRuleTest.java
new file mode 100644
index 0000000..48e01e3
--- /dev/null
+++ b/core-cube/src/test/java/org/apache/kylin/cube/model/validation/rule/FunctionRuleTest.java
@@ -0,0 +1,68 @@
+package org.apache.kylin.cube.model.validation.rule;
+
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.util.JsonUtil;
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.cube.model.CubeDesc;
+import org.apache.kylin.cube.model.validation.ValidateContext;
+import org.apache.kylin.metadata.MetadataManager;
+import org.apache.kylin.metadata.model.MeasureDesc;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class FunctionRuleTest extends LocalFileMetadataTestCase {
+    private static KylinConfig config;
+    private static MetadataManager metadataManager;
+
+    @Before
+    public void setUp() throws Exception {
+        this.createTestMetadata();
+        config = KylinConfig.getInstanceFromEnv();
+        metadataManager = MetadataManager.getInstance(config);
+    }
+
+    @After
+    public void after() throws Exception {
+        this.cleanupTestMetadata();
+    }
+
+    @Test
+    public void testGoodDesc() throws IOException {
+        FunctionRule rule = new FunctionRule();
+
+        File f = new File(LocalFileMetadataTestCase.LOCALMETA_TEST_DATA + "/cube_desc/ssb.json");
+        CubeDesc desc = JsonUtil.readValue(new FileInputStream(f), CubeDesc.class);
+        desc.init(config, metadataManager.getAllTablesMap());
+        ValidateContext vContext = new ValidateContext();
+        rule.validate(desc, vContext);
+        vContext.print(System.out);
+        assertTrue(vContext.getResults().length == 0);
+    }
+
+    @Test
+    public void testValidateMeasureNamesDuplicated() throws IOException {
+        FunctionRule rule = new FunctionRule();
+
+        File f = new File(LocalFileMetadataTestCase.LOCALMETA_TEST_DATA + "/cube_desc/ssb.json");
+        CubeDesc desc = JsonUtil.readValue(new FileInputStream(f), CubeDesc.class);
+
+        MeasureDesc measureDescDuplicated = desc.getMeasures().get(1);
+        desc.getMeasures().add(measureDescDuplicated);
+
+        desc.init(config, metadataManager.getAllTablesMap());
+        ValidateContext vContext = new ValidateContext();
+        rule.validate(desc, vContext);
+
+        vContext.print(System.out);
+        assertTrue(vContext.getResults().length >= 1);
+        assertEquals("There is duplicated measure's name: " + measureDescDuplicated.getName(), vContext.getResults()[0].getMessage());
+    }
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/46be8055/webapp/app/js/controllers/cubeMeasures.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeMeasures.js b/webapp/app/js/controllers/cubeMeasures.js
index 8db1356..9dec379 100644
--- a/webapp/app/js/controllers/cubeMeasures.js
+++ b/webapp/app/js/controllers/cubeMeasures.js
@@ -107,6 +107,12 @@ KylinApp.controller('CubeMeasuresCtrl', function ($scope, $modal,MetaModel,cubes
       SweetAlert.swal('', '[TOP_N] Group by Column is required', 'warning');
       return false;
     }
+
+    if ($scope.isNameDuplicated($scope.cubeMetaFrame.measures, $scope.newMeasure) == true) {
+      SweetAlert.swal('', 'The measure name: ' + $scope.newMeasure.name + ' is duplicated', 'warning');
+      return false;
+    }
+
     if($scope.nextPara.value!=="" && ($scope.newMeasure.function.expression == 'EXTENDED_COLUMN' || $scope.newMeasure.function.expression == 'TOP_N')){
       $scope.newMeasure.function.parameter.next_parameter = jQuery.extend(true,{},$scope.nextPara);
     }
@@ -117,12 +123,22 @@ KylinApp.controller('CubeMeasuresCtrl', function ($scope, $modal,MetaModel,cubes
     else {
       $scope.cubeMetaFrame.measures.push($scope.newMeasure);
     }
+
     $scope.newMeasure = null;
     $scope.initUpdateMeasureStatus();
     $scope.nextParameterInit();
     return true;
   };
 
+  $scope.isNameDuplicated = function (measures, newMeasure) {
+    var names = [];
+    for(var i = 0;i < measures.length; i++){
+        names.push(measures[i].name);
+    }
+    var index = names.indexOf(newMeasure.name);
+    return index > -1;
+  }
+
   $scope.nextParameterInit = function(){
     $scope.nextPara = {
       "type":"column",