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/10/21 10:07:51 UTC

[3/8] kylin git commit: KYLIN-2086 Still report error when there is more than 12 dimensions in one agg group

KYLIN-2086 Still report error when there is more than 12 dimensions in one agg group


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

Branch: refs/heads/KYLIN-1971
Commit: 325803d2ff47f8b2b7e9e326cc7d1781fa9877d5
Parents: 5aa0ae3
Author: shaofengshi <sh...@apache.org>
Authored: Fri Oct 21 14:28:49 2016 +0800
Committer: shaofengshi <sh...@apache.org>
Committed: Fri Oct 21 14:28:49 2016 +0800

----------------------------------------------------------------------
 .../validation/rule/AggregationGroupRule.java   | 34 +++++++-------------
 .../kylin/cube/AggregationGroupRuleTest.java    |  8 ++---
 2 files changed, 16 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/325803d2/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/AggregationGroupRule.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/AggregationGroupRule.java b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/AggregationGroupRule.java
index defe898..7b90782 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/AggregationGroupRule.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/AggregationGroupRule.java
@@ -23,7 +23,6 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.cube.model.AggregationGroup;
 import org.apache.kylin.cube.model.CubeDesc;
 import org.apache.kylin.cube.model.validation.IValidatorRule;
@@ -41,16 +40,7 @@ public class AggregationGroupRule implements IValidatorRule<CubeDesc> {
         inner(cube, context);
     }
 
-    private int count(String[][] input) {
-        if (input == null) {
-            return 0;
-        } else {
-            return input.length;
-        }
-    }
-
     private void inner(CubeDesc cube, ValidateContext context) {
-        int maxSize = getMaxAgrGroupSize();
 
         int index = 0;
         for (AggregationGroup agg : cube.getAggregationGroups()) {
@@ -64,6 +54,7 @@ public class AggregationGroupRule implements IValidatorRule<CubeDesc> {
                 continue;
             }
 
+            int combination = 1;
             Set<String> includeDims = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
             if (agg.getIncludes() != null) {
                 for (String include : agg.getIncludes()) {
@@ -84,6 +75,7 @@ public class AggregationGroupRule implements IValidatorRule<CubeDesc> {
                     for (String s : ss) {
                         hierarchyDims.add(s);
                     }
+                    combination = combination * (ss.length + 1);
                 }
             }
 
@@ -93,6 +85,7 @@ public class AggregationGroupRule implements IValidatorRule<CubeDesc> {
                     for (String s : ss) {
                         jointDims.add(s);
                     }
+                    combination = combination * 2;
                 }
             }
 
@@ -107,15 +100,7 @@ public class AggregationGroupRule implements IValidatorRule<CubeDesc> {
             normalDims.removeAll(hierarchyDims);
             normalDims.removeAll(jointDims);
 
-            int normalDimSize = normalDims.size();
-            int hierarchySize = count(agg.getSelectRule().hierarchy_dims);
-            int jointSize = count(agg.getSelectRule().joint_dims);
-            int mandatorySize = mandatoryDims.size() > 0 ? 1 : 0;
-
-            if (mandatorySize + normalDimSize + hierarchySize + jointSize > maxSize) {
-                context.addResult(ResultLevel.ERROR, "Aggregation group " + index + " has too many dimensions");
-                continue;
-            }
+            combination = combination * (1 << normalDims.size());
 
             if (CollectionUtils.containsAny(mandatoryDims, hierarchyDims)) {
                 context.addResult(ResultLevel.ERROR, "Aggregation group " + index + " mandatory dims overlap with hierarchy dims");
@@ -169,12 +154,17 @@ public class AggregationGroupRule implements IValidatorRule<CubeDesc> {
                 }
             }
 
+            if (combination > getMaxCombinations(cube)) {
+                String msg = "Aggregation group " + index + " has too many combinations, use 'mandatory'/'hierarchy'/'joint' to optimize; or update 'kylin.cube.aggrgroup.max.combination' to a bigger value.";
+                context.addResult(ResultLevel.ERROR, msg);
+                continue;
+            }
+
             index++;
         }
     }
 
-    @SuppressWarnings("deprecation")
-    protected int getMaxAgrGroupSize() {
-        return KylinConfig.getInstanceFromEnv().getCubeAggrGroupMaxSize();
+    protected int getMaxCombinations(CubeDesc cubeDesc) {
+        return cubeDesc.getConfig().getCubeAggrGroupMaxCombination();
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/325803d2/core-cube/src/test/java/org/apache/kylin/cube/AggregationGroupRuleTest.java
----------------------------------------------------------------------
diff --git a/core-cube/src/test/java/org/apache/kylin/cube/AggregationGroupRuleTest.java b/core-cube/src/test/java/org/apache/kylin/cube/AggregationGroupRuleTest.java
index 6c3d544..a06ce1b 100644
--- a/core-cube/src/test/java/org/apache/kylin/cube/AggregationGroupRuleTest.java
+++ b/core-cube/src/test/java/org/apache/kylin/cube/AggregationGroupRuleTest.java
@@ -53,7 +53,7 @@ public class AggregationGroupRuleTest {
     public void testGoodBecomeBadDesc() throws IOException {
         AggregationGroupRule rule = new AggregationGroupRule() {
             @Override
-            protected int getMaxAgrGroupSize() {
+            protected int getMaxCombinations(CubeDesc cubeDesc) {
                 return 2;
             }
         };
@@ -65,7 +65,7 @@ public class AggregationGroupRuleTest {
             rule.validate(desc, vContext);
             vContext.print(System.out);
             assertTrue(vContext.getResults().length > 0);
-            assertEquals("Aggregation group 0 has too many dimensions", (vContext.getResults()[0].getMessage()));
+            assertEquals("Aggregation group 0 has too many combinations, use 'mandatory'/'hierarchy'/'joint' to optimize; or update 'kylin.cube.aggrgroup.max.combination' to a bigger value.", (vContext.getResults()[0].getMessage()));
         }
     }
 
@@ -118,8 +118,8 @@ public class AggregationGroupRuleTest {
     public AggregationGroupRule getAggregationGroupRule() {
         AggregationGroupRule rule = new AggregationGroupRule() {
             @Override
-            protected int getMaxAgrGroupSize() {
-                return 20;
+            protected int getMaxCombinations(CubeDesc cubeDesc) {
+                return 4096;
             }
         };