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 2017/09/23 10:17:36 UTC

[05/13] kylin git commit: KYLIN-2718 use Guava Library to check overflow when calculating combination

KYLIN-2718 use Guava Library to check overflow when calculating combination

Signed-off-by: Li Yang <li...@apache.org>


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

Branch: refs/heads/pr70
Commit: 228b34aa10f3f89f9024bc2368cbe11a59894d28
Parents: 713e9f7
Author: Zhong <nj...@apache.org>
Authored: Sat Sep 23 15:11:49 2017 +0800
Committer: Li Yang <li...@apache.org>
Committed: Sat Sep 23 15:12:09 2017 +0800

----------------------------------------------------------------------
 .../kylin/cube/model/AggregationGroup.java      | 73 +++++++++++---------
 .../org/apache/kylin/cube/model/CubeDesc.java   |  2 -
 .../cube/model/TooManyCuboidException.java      |  1 +
 3 files changed, 41 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/228b34aa/core-cube/src/main/java/org/apache/kylin/cube/model/AggregationGroup.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/AggregationGroup.java b/core-cube/src/main/java/org/apache/kylin/cube/model/AggregationGroup.java
index d473858..74ac715 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/model/AggregationGroup.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/model/AggregationGroup.java
@@ -41,6 +41,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.common.math.LongMath;
 
 @SuppressWarnings("serial")
 @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@@ -300,42 +301,48 @@ public class AggregationGroup implements Serializable {
     public long calculateCuboidCombination() {
         long combination = 1;
 
-        if (this.getDimCap() > 0) {
-            CuboidScheduler cuboidScheduler = cubeDesc.getInitialCuboidScheduler();
-            combination = cuboidScheduler.calculateCuboidsForAggGroup(this).size();
-        } else {
-            Set<String> includeDims = new TreeSet<>(Arrays.asList(includes));
-            Set<String> mandatoryDims = new TreeSet<>(Arrays.asList(selectRule.mandatoryDims));
-
-            Set<String> hierarchyDims = new TreeSet<>();
-            for (String[] ss : selectRule.hierarchyDims) {
-                hierarchyDims.addAll(Arrays.asList(ss));
-                combination = combination * (ss.length + 1);
-            }
-
-            Set<String> jointDims = new TreeSet<>();
-            for (String[] ss : selectRule.jointDims) {
-                jointDims.addAll(Arrays.asList(ss));
-                combination = combination * 2;
-            }
-
-            Set<String> normalDims = new TreeSet<>();
-            normalDims.addAll(includeDims);
-            normalDims.removeAll(mandatoryDims);
-            normalDims.removeAll(hierarchyDims);
-            normalDims.removeAll(jointDims);
-
-            combination = combination * (1L << normalDims.size());
-
-            if (cubeDesc.getConfig().getCubeAggrGroupIsMandatoryOnlyValid() && !mandatoryDims.isEmpty()) {
-                combination += 1;
+        try {
+            if (this.getDimCap() > 0) {
+                CuboidScheduler cuboidScheduler = cubeDesc.getInitialCuboidScheduler();
+                combination = cuboidScheduler.calculateCuboidsForAggGroup(this).size();
+            } else {
+                Set<String> includeDims = new TreeSet<>(Arrays.asList(includes));
+                Set<String> mandatoryDims = new TreeSet<>(Arrays.asList(selectRule.mandatoryDims));
+    
+                Set<String> hierarchyDims = new TreeSet<>();
+                for (String[] ss : selectRule.hierarchyDims) {
+                    hierarchyDims.addAll(Arrays.asList(ss));
+                    combination = LongMath.checkedMultiply(combination, (ss.length + 1));
+                }
+    
+                Set<String> jointDims = new TreeSet<>();
+                for (String[] ss : selectRule.jointDims) {
+                    jointDims.addAll(Arrays.asList(ss));
+                }
+                combination = LongMath.checkedMultiply(combination, (1L << selectRule.jointDims.length));
+    
+                Set<String> normalDims = new TreeSet<>();
+                normalDims.addAll(includeDims);
+                normalDims.removeAll(mandatoryDims);
+                normalDims.removeAll(hierarchyDims);
+                normalDims.removeAll(jointDims);
+    
+                combination = LongMath.checkedMultiply(combination, (1L << normalDims.size()));
+    
+                if (cubeDesc.getConfig().getCubeAggrGroupIsMandatoryOnlyValid() && !mandatoryDims.isEmpty()) {
+                    combination += 1;
+                }
+                combination -= 1; // not include cuboid 0
             }
-            combination -= 1; // not include cuboid 0
+            
+            if (combination < 0)
+                throw new ArithmeticException();
+            
+        } catch (ArithmeticException ae) {
+            // long overflow, give max value
+            combination = Long.MAX_VALUE;
         }
 
-        if (combination < 0) { // overflow
-            combination = Long.MAX_VALUE - 1;
-        }
         return combination;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/228b34aa/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 2a902f3..712af43 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
@@ -660,8 +660,6 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware {
                             + ". Use 'mandatory'/'hierarchy'/'joint' to optimize; or update 'kylin.cube.aggrgroup.max-combination' to a bigger value.";
                     throw new TooManyCuboidException(msg);
                 }
-            } catch (TooManyCuboidException tmce) {
-                throw tmce;
             } catch (Exception e) {
                 throw new IllegalStateException("Unknown error while calculating cuboid number for " + //
                         "Aggregation group " + index + " of Cube Desc " + this.name, e);

http://git-wip-us.apache.org/repos/asf/kylin/blob/228b34aa/core-cube/src/main/java/org/apache/kylin/cube/model/TooManyCuboidException.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/TooManyCuboidException.java b/core-cube/src/main/java/org/apache/kylin/cube/model/TooManyCuboidException.java
index cfa41e4..57ea6ed 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/model/TooManyCuboidException.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/model/TooManyCuboidException.java
@@ -17,6 +17,7 @@
  */
 package org.apache.kylin.cube.model;
 
+@SuppressWarnings("serial")
 public class TooManyCuboidException extends RuntimeException {
 
     public TooManyCuboidException(String message) {