KYLIN-1557 Enhance the check on aggregation group dimension number

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

Branch: refs/heads/1.5.x-HBase1.1.3
Commit: 6304e9474f441456d2f904fcbd6727cbb13eae66
Parents: 6fbdf87
Author: shaofengshi <shaofeng...@apache.org>
Authored: Tue Apr 5 11:42:34 2016 +0800
Committer: shaofengshi <shaofeng...@apache.org>
Committed: Tue Apr 5 11:43:02 2016 +0800

----------------------------------------------------------------------
 .../apache/kylin/common/KylinConfigBase.java    |  5 ++++
 .../org/apache/kylin/cube/model/CubeDesc.java   | 24 ++++++++++++--------
 .../org/apache/kylin/cube/CubeDescTest.java     |  6 ++---
 3 files changed, 23 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/6304e947/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java 
b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 6a0f860..9db3081 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -379,10 +379,15 @@ abstract public class KylinConfigBase implements 
Serializable {
         return 
Double.parseDouble(getOptional("kylin.cube.algorithm.auto.threshold", "8"));
     }
 
+    @Deprecated
     public int getCubeAggrGroupMaxSize() {
         return Integer.parseInt(getOptional("kylin.cube.aggrgroup.max.size", 
"12"));
     }
 
+    public int getCubeAggrGroupMaxCombination() {
+        return 
Integer.parseInt(getOptional("kylin.cube.aggrgroup.max.combination", "4096"));
+    }
+
     public String[] getCubeDimensionCustomEncodingFactories() {
         return 
getOptionalStringArray("kylin.cube.dimension.customEncodingFactories", new 
String[0]);
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/6304e947/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java 
b/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
index b103e4f..f9ec99e 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
@@ -557,20 +557,20 @@ public class CubeDesc extends RootPersistentEntity {
     }
 
     public void validate() {
-        int maxSize = config.getCubeAggrGroupMaxSize();
         int index = 0;
 
         for (AggregationGroup agg : getAggregationGroups()) {
             if (agg.getIncludes() == null) {
-                logger.error("Aggregation group " + index + " includes field 
not set");
+                logger.error("Aggregation group " + index + " 'includes' field 
not set");
                 throw new IllegalStateException("Aggregation group " + index + 
" includes field not set");
             }
 
             if (agg.getSelectRule() == null) {
-                logger.error("Aggregation group " + index + " includes field 
not set");
+                logger.error("Aggregation group " + index + " 'select_rule' 
field not set");
                 throw new IllegalStateException("Aggregation group " + index + 
" select rule field not set");
             }
 
+            int combination = 1;
             Set<String> includeDims = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
             getDims(includeDims, agg.getIncludes());
 
@@ -580,10 +580,17 @@ public class CubeDesc extends RootPersistentEntity {
             ArrayList<Set<String>> hierarchyDimsList = Lists.newArrayList();
             Set<String> hierarchyDims = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
             getDims(hierarchyDimsList, hierarchyDims, 
agg.getSelectRule().hierarchy_dims);
+            for (Set<String> hierarchy : hierarchyDimsList) {
+                combination = combination * (hierarchy.size() + 1);
+            }
 
             ArrayList<Set<String>> jointDimsList = Lists.newArrayList();
             Set<String> jointDims = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
             getDims(jointDimsList, jointDims, agg.getSelectRule().joint_dims);
+            if (jointDimsList.size() > 0) {
+                combination = combination * (1 << jointDimsList.size());
+            }
+
 
             if (!includeDims.containsAll(mandatoryDims) || 
!includeDims.containsAll(hierarchyDims) || !includeDims.containsAll(jointDims)) 
{
                 logger.error("Aggregation group " + index + " Include dims not 
containing all the used dims");
@@ -596,13 +603,12 @@ public class CubeDesc extends RootPersistentEntity {
             normalDims.removeAll(hierarchyDims);
             normalDims.removeAll(jointDims);
 
-            int normalDimSize = normalDims.size();
-            int hierarchyDimSize = hierarchyDimsList.size();
-            int jointDimSize = jointDimsList.size();
+            combination = combination * (1 << normalDims.size());
 
-            if (mandatoryDims.size() + normalDimSize + hierarchyDimSize + 
jointDimSize > maxSize) {
-                logger.error("Aggregation group " + index + " has too many 
dimensions");
-                throw new IllegalStateException("Aggregation group " + index + 
" has too many dimensions");
+            if (combination > config.getCubeAggrGroupMaxCombination()) {
+                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.";
+                logger.error(msg);
+                throw new IllegalStateException(msg);
             }
 
             if (CollectionUtils.containsAny(mandatoryDims, hierarchyDims)) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/6304e947/core-cube/src/test/java/org/apache/kylin/cube/CubeDescTest.java
----------------------------------------------------------------------
diff --git a/core-cube/src/test/java/org/apache/kylin/cube/CubeDescTest.java 
b/core-cube/src/test/java/org/apache/kylin/cube/CubeDescTest.java
index 141a22e..fb2e18b 100644
--- a/core-cube/src/test/java/org/apache/kylin/cube/CubeDescTest.java
+++ b/core-cube/src/test/java/org/apache/kylin/cube/CubeDescTest.java
@@ -95,14 +95,14 @@ public class CubeDescTest extends LocalFileMetadataTestCase 
{
     @Test
     public void testBadInit4() throws Exception {
         thrown.expect(IllegalStateException.class);
-        thrown.expectMessage("Aggregation group 0 has too many dimensions");
+        thrown.expectMessage("Aggregation group 0 has too many combinations, 
use 'mandatory'/'hierarchy'/'joint' to optimize; or update 
'kylin.cube.aggrgroup.max.combination' to a bigger value.");
 
         CubeDesc cubeDesc = 
CubeDescManager.getInstance(getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc");
         try {
-            System.setProperty("kylin.cube.aggrgroup.max.size", "3");
+            System.setProperty("kylin.cube.aggrgroup.max.combination", "8");
             cubeDesc.validate();
         } finally {
-            System.clearProperty("kylin.cube.aggrgroup.max.size");
+            System.clearProperty("kylin.cube.aggrgroup.max.combination");
         }
     }
 

Reply via email to