APACHE-KYLIN-2783: move method isValid from Cuboid to CuboidScheduler
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/b6ec7e93 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/b6ec7e93 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/b6ec7e93 Branch: refs/heads/yaho-cube-planner Commit: b6ec7e93dec0efc01ba67916a928b289d3d67280 Parents: 9b67d58 Author: Zhong <[email protected]> Authored: Thu Aug 17 21:13:51 2017 +0800 Committer: Zhong <[email protected]> Committed: Fri Sep 8 11:31:38 2017 +0800 ---------------------------------------------------------------------- .../org/apache/kylin/cube/cuboid/Cuboid.java | 13 +---- .../org/apache/kylin/cube/cuboid/CuboidCLI.java | 15 +++--- .../kylin/cube/cuboid/CuboidScheduler.java | 3 ++ .../cube/cuboid/DefaultCuboidScheduler.java | 13 ++++- .../kylin/cube/cuboid/TreeCuboidScheduler.java | 11 +++- .../kylin/cube/cuboid/CuboidSchedulerTest.java | 4 +- .../apache/kylin/cube/cuboid/CuboidTest.java | 54 ++++++++++---------- 7 files changed, 61 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/main/java/org/apache/kylin/cube/cuboid/Cuboid.java ---------------------------------------------------------------------- diff --git a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/Cuboid.java b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/Cuboid.java index b2cf339..fa83775 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/Cuboid.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/Cuboid.java @@ -118,17 +118,13 @@ public class Cuboid implements Comparable<Cuboid>, Serializable { } Cuboid cuboid = cubeCache.get(cuboidID); if (cuboid == null) { - long validCuboidID = translateToValidCuboid(cuboidScheduler, cuboidID); + long validCuboidID = cuboidScheduler.findBestMatchCuboid(cuboidID); cuboid = new Cuboid(cuboidScheduler.getCubeDesc(), cuboidID, validCuboidID); cubeCache.put(cuboidID, cuboid); } return cuboid; } - public static boolean isValid(CuboidScheduler cuboidScheduler, long cuboidID) { - return cuboidScheduler.getAllCuboidIds().contains(cuboidID); - } - public static long getBaseCuboidId(CubeDesc cube) { return cube.getRowkey().getFullMask(); } @@ -137,13 +133,6 @@ public class Cuboid implements Comparable<Cuboid>, Serializable { return findForMandatory(cube, getBaseCuboidId(cube)); } - static long translateToValidCuboid(CuboidScheduler cuboidScheduler, long cuboidID) { - if (isValid(cuboidScheduler, cuboidID)) { - return cuboidID; - } - return cuboidScheduler.findBestMatchCuboid(cuboidID); - } - // ============================================================================ private CubeDesc cubeDesc; http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidCLI.java ---------------------------------------------------------------------- diff --git a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidCLI.java b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidCLI.java index d27ca7a..4300a6c 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidCLI.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidCLI.java @@ -88,29 +88,28 @@ public class CuboidCLI { //check all valid and invalid for (long i = 0; i < baseCuboid; ++i) { if (cuboidSet.contains(i)) { - if (!Cuboid.isValid(cubeDesc.getInitialCuboidScheduler(), i)) { + if (!cubeDesc.getInitialCuboidScheduler().isValid(i)) { throw new RuntimeException(); } - if (Cuboid.translateToValidCuboid(cubeDesc.getInitialCuboidScheduler(), i) != i) { + if (cubeDesc.getInitialCuboidScheduler().findBestMatchCuboid(i) != i) { throw new RuntimeException(); } } else { - if (Cuboid.isValid(cubeDesc.getInitialCuboidScheduler(), i)) { + if (cubeDesc.getInitialCuboidScheduler().isValid(i)) { throw new RuntimeException(); } - long corrected = Cuboid.translateToValidCuboid(cubeDesc.getInitialCuboidScheduler(), i); + long corrected = cubeDesc.getInitialCuboidScheduler().findBestMatchCuboid(i); if (corrected == i) { throw new RuntimeException(); } - if (!Cuboid.isValid(cubeDesc.getInitialCuboidScheduler(), corrected)) { + if (!cubeDesc.getInitialCuboidScheduler().isValid(corrected)) { throw new RuntimeException(); } - if (Cuboid.translateToValidCuboid(cubeDesc.getInitialCuboidScheduler(), - corrected) != corrected) { + if (cubeDesc.getInitialCuboidScheduler().findBestMatchCuboid(corrected) != corrected) { throw new RuntimeException(); } } @@ -126,7 +125,7 @@ public class CuboidCLI { long baseCuboid = Cuboid.getBaseCuboidId(cube); TreeSet<Long> expectedCuboids = new TreeSet<Long>(); for (long cuboid = 0; cuboid <= baseCuboid; cuboid++) { - if (Cuboid.isValid(cube.getInitialCuboidScheduler(), cuboid)) { + if (cube.getInitialCuboidScheduler().isValid(cuboid)) { expectedCuboids.add(cuboid); } } http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidScheduler.java ---------------------------------------------------------------------- diff --git a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidScheduler.java b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidScheduler.java index c08b9db..cef0f77 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidScheduler.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/CuboidScheduler.java @@ -63,6 +63,9 @@ abstract public class CuboidScheduler { /** Returns a cuboid on the tree that best matches the request cuboid. */ abstract public long findBestMatchCuboid(long requestCuboid); + /** Returns whether requestCuboid is valid or not*/ + abstract public boolean isValid(long requestCuboid); + /** Returns the key for what this cuboid scheduler responsible for*/ abstract public String getResponsibleKey(); http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/main/java/org/apache/kylin/cube/cuboid/DefaultCuboidScheduler.java ---------------------------------------------------------------------- diff --git a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/DefaultCuboidScheduler.java b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/DefaultCuboidScheduler.java index c756079..d05786e 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/DefaultCuboidScheduler.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/DefaultCuboidScheduler.java @@ -87,6 +87,11 @@ public class DefaultCuboidScheduler extends CuboidScheduler { return Sets.newHashSet(allCuboidIds); } + @Override + public boolean isValid(long requestCuboid) { + return allCuboidIds.contains(requestCuboid); + } + /** * Collect cuboid from bottom up, considering all factor including black list * Build tree steps: @@ -205,6 +210,10 @@ public class DefaultCuboidScheduler extends CuboidScheduler { } public long findBestMatchCuboid1(long cuboid) { + if (isValid(cuboid)) { + return cuboid; + } + List<Long> onTreeCandidates = Lists.newArrayList(); for (AggregationGroup agg : cubeDesc.getAggregationGroups()) { Long candidate = translateToOnTreeCuboid(agg, cuboid); @@ -218,7 +227,7 @@ public class DefaultCuboidScheduler extends CuboidScheduler { } long onTreeCandi = Collections.min(onTreeCandidates, Cuboid.cuboidSelectComparator); - if (allCuboidIds.contains(onTreeCandi)) { + if (isValid(onTreeCandi)) { return onTreeCandi; } @@ -228,7 +237,7 @@ public class DefaultCuboidScheduler extends CuboidScheduler { public long doFindBestMatchCuboid1(long cuboid) { long parent = getOnTreeParent(cuboid); while (parent > 0) { - if (allCuboidIds.contains(parent)) { + if (isValid(parent)) { break; } parent = getOnTreeParent(parent); http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/main/java/org/apache/kylin/cube/cuboid/TreeCuboidScheduler.java ---------------------------------------------------------------------- diff --git a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/TreeCuboidScheduler.java b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/TreeCuboidScheduler.java index 73f4824..414fc4a 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/cuboid/TreeCuboidScheduler.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/cuboid/TreeCuboidScheduler.java @@ -69,6 +69,11 @@ public class TreeCuboidScheduler extends CuboidScheduler { return cuboidTree.findBestMatchCuboid(cuboidId); } + @Override + public boolean isValid(long requestCuboid) { + return cuboidTree.isValid(requestCuboid); + } + public static class CuboidTree { private int treeLevels; @@ -129,13 +134,17 @@ public class TreeCuboidScheduler extends CuboidScheduler { public long findBestMatchCuboid(long cuboidId) { // exactly match - if (index.containsKey(cuboidId)) { + if (isValid(cuboidId)) { return cuboidId; } return findBestParent(cuboidId).cuboidId; } + public boolean isValid(long cuboidId) { + return index.containsKey(cuboidId); + } + private int getCuboidCount(long cuboidId) { int r = 1; for (Long child : getSpanningCuboid(cuboidId)) { http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidSchedulerTest.java ---------------------------------------------------------------------- diff --git a/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidSchedulerTest.java b/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidSchedulerTest.java index 3992ef9..3f3a7c4 100644 --- a/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidSchedulerTest.java +++ b/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidSchedulerTest.java @@ -115,7 +115,7 @@ public class CuboidSchedulerTest extends LocalFileMetadataTestCase { System.out.println("Spanning result for " + cuboidId + "(" + Long.toBinaryString(cuboidId) + "): " + toString(spannings)); for (long child : spannings) { - assertTrue(Cuboid.isValid(scheduler, child)); + assertTrue(scheduler.isValid(child)); } } @@ -335,7 +335,7 @@ public class CuboidSchedulerTest extends LocalFileMetadataTestCase { CuboidScheduler scheduler = cube.getInitialCuboidScheduler(); Cuboid baseCuboid = Cuboid.getBaseCuboid(cube); - assertTrue(Cuboid.isValid(scheduler, baseCuboid.getId())); + assertTrue(scheduler.isValid(baseCuboid.getId())); List<Long> spanningChild = scheduler.getSpanningCuboid(baseCuboid.getId()); assertTrue(spanningChild.size() > 0); http://git-wip-us.apache.org/repos/asf/kylin/blob/b6ec7e93/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidTest.java ---------------------------------------------------------------------- diff --git a/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidTest.java b/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidTest.java index ab0c666..8dc944b 100644 --- a/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidTest.java +++ b/core-cube/src/test/java/org/apache/kylin/cube/cuboid/CuboidTest.java @@ -76,23 +76,23 @@ public class CuboidTest extends LocalFileMetadataTestCase { CuboidScheduler cuboidScheduler = cube.getInitialCuboidScheduler(); // base - assertEquals(false, Cuboid.isValid(cuboidScheduler, 0)); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("111111111"))); + assertEquals(false, cuboidScheduler.isValid(0)); + assertEquals(true, cuboidScheduler.isValid(toLong("111111111"))); // mandatory column - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("011111110"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("100000000"))); + assertEquals(false, cuboidScheduler.isValid(toLong("011111110"))); + assertEquals(false, cuboidScheduler.isValid(toLong("100000000"))); // zero tail - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("111111000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("111111000"))); // aggregation group & zero tail - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("110000111"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("110111000"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("111110111"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("111110001"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("111110100"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("110000100"))); + assertEquals(true, cuboidScheduler.isValid(toLong("110000111"))); + assertEquals(true, cuboidScheduler.isValid(toLong("110111000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("111110111"))); + assertEquals(false, cuboidScheduler.isValid(toLong("111110001"))); + assertEquals(false, cuboidScheduler.isValid(toLong("111110100"))); + assertEquals(false, cuboidScheduler.isValid(toLong("110000100"))); } @Test @@ -127,25 +127,25 @@ public class CuboidTest extends LocalFileMetadataTestCase { CubeDesc cube = getTestKylinCubeWithoutSeller(); CuboidScheduler cuboidScheduler = cube.getInitialCuboidScheduler(); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("111111111"))); + assertEquals(false, cuboidScheduler.isValid(toLong("111111111"))); // base - assertEquals(false, Cuboid.isValid(cuboidScheduler, 0)); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("11111111"))); + assertEquals(false, cuboidScheduler.isValid(0)); + assertEquals(true, cuboidScheduler.isValid(toLong("11111111"))); // aggregation group & zero tail - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10000111"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("10001111"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("11001111"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10000001"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10000101"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10000111"))); + assertEquals(false, cuboidScheduler.isValid(toLong("10001111"))); + assertEquals(false, cuboidScheduler.isValid(toLong("11001111"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10000001"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10000101"))); // hierarchy - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10100000"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10110000"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10111000"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("10001000"))); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("10011000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10100000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10110000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10111000"))); + assertEquals(false, cuboidScheduler.isValid(toLong("10001000"))); + assertEquals(false, cuboidScheduler.isValid(toLong("10011000"))); } @Test @@ -153,11 +153,11 @@ public class CuboidTest extends LocalFileMetadataTestCase { CubeDesc cube = getSSBCubeDesc(); CuboidScheduler cuboidScheduler = cube.getInitialCuboidScheduler(); - assertEquals(false, Cuboid.isValid(cuboidScheduler, toLong("10000000000"))); + assertEquals(false, cuboidScheduler.isValid(toLong("10000000000"))); // the 4th is mandatory and isMandatoryOnlyValid is true - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("10000001000"))); - assertEquals(true, Cuboid.isValid(cuboidScheduler, toLong("00000001000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("10000001000"))); + assertEquals(true, cuboidScheduler.isValid(toLong("00000001000"))); } @Test
