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); }