minor, refine relization cost calculation

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

Branch: refs/heads/master
Commit: bace2d20b515ef0d458b2579d1923a7fa19d12a8
Parents: 221caaa
Author: Roger Shi <rogershijich...@hotmail.com>
Authored: Fri Dec 8 21:42:31 2017 +0800
Committer: Roger Shi <rogershijich...@gmail.com>
Committed: Mon Dec 11 09:42:38 2017 +0800

----------------------------------------------------------------------
 .../java/org/apache/kylin/cube/CubeInstance.java | 10 +++++++++-
 .../kylin/metadata/realization/IRealization.java |  2 ++
 .../kylin/storage/hybrid/HybridInstance.java     |  9 +++++++++
 .../kylin/query/routing/RealizationChooser.java  | 19 +------------------
 .../rest/controller/CubeControllerTest.java      |  3 +--
 5 files changed, 22 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/bace2d20/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java 
b/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
index 17d8a03..d1c5166 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
@@ -92,6 +92,7 @@ public class CubeInstance extends RootPersistentEntity 
implements IRealization,
     private String descName;
     @JsonProperty("display_name")
     private String displayName;
+    // DEPRECATED: the cost should be calculated in runtime
     // Mark cube priority for query
     @JsonProperty("cost")
     private int cost = 50;
@@ -248,8 +249,15 @@ public class CubeInstance extends RootPersistentEntity 
implements IRealization,
         this.displayName = displayName;
     }
 
+    @Override
     public int getCost() {
-        return cost;
+        int countedDimensionNum = getRowKeyColumnCount();
+        int c = countedDimensionNum * COST_WEIGHT_DIMENSION + 
getMeasures().size() * COST_WEIGHT_MEASURE;
+        for (JoinTableDesc join : getModel().getJoinTables()) {
+            if (join.getJoin().isInnerJoin())
+                c += CubeInstance.COST_WEIGHT_INNER_JOIN;
+        }
+        return c;
     }
 
     public void setCost(int cost) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/bace2d20/core-metadata/src/main/java/org/apache/kylin/metadata/realization/IRealization.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/realization/IRealization.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/realization/IRealization.java
index aafc0f0..cc9f1af 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/realization/IRealization.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/realization/IRealization.java
@@ -63,4 +63,6 @@ public interface IRealization extends IStorageAware {
     public boolean supportsLimitPushDown();
 
     public KylinConfig getConfig();
+
+    public int getCost();
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/bace2d20/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
----------------------------------------------------------------------
diff --git 
a/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
 
b/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
index df68e10..14ef524 100644
--- 
a/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
+++ 
b/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
@@ -200,6 +200,15 @@ public class HybridInstance extends RootPersistentEntity 
implements IRealization
     }
 
     @Override
+    public int getCost() {
+        int c = Integer.MAX_VALUE;
+        for (IRealization realization : getRealizations()) {
+            c = Math.min(realization.getCost(), c);
+        }
+        return c;
+    }
+
+    @Override
     public RealizationType getType() {
         return RealizationType.HYBRID;
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/bace2d20/query/src/main/java/org/apache/kylin/query/routing/RealizationChooser.java
----------------------------------------------------------------------
diff --git 
a/query/src/main/java/org/apache/kylin/query/routing/RealizationChooser.java 
b/query/src/main/java/org/apache/kylin/query/routing/RealizationChooser.java
index 89859b2..1493c84 100644
--- a/query/src/main/java/org/apache/kylin/query/routing/RealizationChooser.java
+++ b/query/src/main/java/org/apache/kylin/query/routing/RealizationChooser.java
@@ -26,18 +26,15 @@ import java.util.TreeMap;
 
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.debug.BackdoorToggles;
-import org.apache.kylin.cube.CubeInstance;
 import org.apache.kylin.metadata.model.ColumnDesc;
 import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.model.JoinDesc;
-import org.apache.kylin.metadata.model.JoinTableDesc;
 import org.apache.kylin.metadata.model.JoinsTree;
 import org.apache.kylin.metadata.model.TableRef;
 import org.apache.kylin.metadata.model.TblColRef;
 import org.apache.kylin.metadata.project.ProjectManager;
 import org.apache.kylin.metadata.realization.IRealization;
 import org.apache.kylin.metadata.realization.NoRealizationFoundException;
-import org.apache.kylin.metadata.realization.RealizationType;
 import org.apache.kylin.query.relnode.OLAPContext;
 import org.apache.kylin.query.routing.rules.RemoveBlackoutRealizationsRule;
 import org.slf4j.Logger;
@@ -244,21 +241,7 @@ public class RealizationChooser {
         public RealizationCost(IRealization real) {
             // ref Candidate.PRIORITIES
             this.priority = Candidate.PRIORITIES.get(real.getType());
-
-            // ref CubeInstance.getCost()
-            int countedDimensionNum;
-            if (RealizationType.CUBE == real.getType()) {
-                countedDimensionNum = ((CubeInstance) 
real).getRowKeyColumnCount();
-            } else {
-                countedDimensionNum = real.getAllDimensions().size();
-            }
-            int c = countedDimensionNum * CubeInstance.COST_WEIGHT_DIMENSION
-                    + real.getMeasures().size() * 
CubeInstance.COST_WEIGHT_MEASURE;
-            for (JoinTableDesc join : real.getModel().getJoinTables()) {
-                if (join.getJoin().isInnerJoin())
-                    c += CubeInstance.COST_WEIGHT_INNER_JOIN;
-            }
-            this.cost = c;
+            this.cost = real.getCost();
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/kylin/blob/bace2d20/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
----------------------------------------------------------------------
diff --git 
a/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java 
b/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
index 8ee4342..697f4e6 100644
--- 
a/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
+++ 
b/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
@@ -119,14 +119,13 @@ public class CubeControllerTest extends ServiceTestBase {
         List<String> notifyList = Lists.newArrayList();
         notifyList.add("j...@example.com");
         cubeController.updateNotifyList(newCubeName, notifyList);
-        cubeController.updateCubeCost(newCubeName, 80);
 
         List<CubeInstanceResponse> cubeInstances = 
cubeController.getCubes(newCubeName, cube.getModelName(), "default",
                 1, 0);
 
         CubeInstance cubeInstance = 
cubeController.getCube(cubeInstances.get(0).getName());
         
Assert.assertTrue(cubeInstance.getDescriptor().getNotifyList().contains("j...@example.com"));
-        Assert.assertTrue(cubeInstance.getCost() == 80);
+        Assert.assertTrue(cubeInstance.getCost() == 495);
         cubeController.deleteCube(newCubeName);
     }
 

Reply via email to