Deep copy segment when duplicate cube instance (cherry picked from commit 4d5cf906fbe4cd840e2daf7333be8c52c7ccfb29)
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/73554fa7 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/73554fa7 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/73554fa7 Branch: refs/heads/sync Commit: 73554fa71cd4bb519b19dab3c9e4a19e19d33d1e Parents: ce1775a Author: Yifan Zhang <event.dim...@gmail.com> Authored: Wed Jan 24 18:45:34 2018 +0800 Committer: Li Yang <liy...@apache.org> Committed: Fri Jan 26 22:54:58 2018 +0800 ---------------------------------------------------------------------- .../org/apache/kylin/cube/CubeInstance.java | 9 +++++++- .../org/apache/kylin/cube/CubeInstanceTest.java | 22 +++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/73554fa7/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 6395abd..27918bc 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 @@ -191,6 +191,9 @@ public class CubeInstance extends RootPersistentEntity implements IRealization, } public CubeDesc getDescriptor() { + if (config == null) { + return null; + } return CubeDescManager.getInstance(config).getCubeDesc(descName); } @@ -297,6 +300,10 @@ public class CubeInstance extends RootPersistentEntity implements IRealization, @Override public int getCost() { + if (getDescriptor() == null) { + //in case not initialized + return 0; + } int countedDimensionNum = getRowKeyColumnCount(); int c = countedDimensionNum * COST_WEIGHT_DIMENSION + getMeasures().size() * COST_WEIGHT_MEASURE; DataModelDesc model = getModel(); @@ -348,7 +355,7 @@ public class CubeInstance extends RootPersistentEntity implements IRealization, } public void setSegments(Segments segments) { - this.segments = segments; + this.segments = new Segments<>(segments); } public CubeSegment getSegmentById(String segmentId) { http://git-wip-us.apache.org/repos/asf/kylin/blob/73554fa7/core-cube/src/test/java/org/apache/kylin/cube/CubeInstanceTest.java ---------------------------------------------------------------------- diff --git a/core-cube/src/test/java/org/apache/kylin/cube/CubeInstanceTest.java b/core-cube/src/test/java/org/apache/kylin/cube/CubeInstanceTest.java index 9e517b9..dd3b12b 100644 --- a/core-cube/src/test/java/org/apache/kylin/cube/CubeInstanceTest.java +++ b/core-cube/src/test/java/org/apache/kylin/cube/CubeInstanceTest.java @@ -18,17 +18,18 @@ package org.apache.kylin.cube; -import static org.junit.Assert.assertNotNull; - import java.io.DataInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.UUID; import org.apache.kylin.common.persistence.JsonSerializer; import org.apache.kylin.cube.cuboid.TreeCuboidScheduler; +import org.apache.kylin.metadata.model.SegmentStatusEnum; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -56,6 +57,21 @@ public class CubeInstanceTest { for (Long cuboid : cuboids) { System.out.println(cuboid + ":" + cuboidsWithRowCnt.get(cuboid)); } - assertNotNull(cuboidsWithRowCnt.get(255L)); + Assert.assertNotNull(cuboidsWithRowCnt.get(255L)); + } + + @Test + public void copyCubeSegmentTest() { + int origSegCount = cubeInstance.getSegments().size(); + CubeInstance newCubeInstance = CubeInstance.getCopyOf(cubeInstance); + + CubeSegment mockSeg = new CubeSegment(); + mockSeg.setUuid(UUID.randomUUID().toString()); + mockSeg.setStorageLocationIdentifier(UUID.randomUUID().toString()); + mockSeg.setStatus(SegmentStatusEnum.READY); + newCubeInstance.getSegments().add(mockSeg); + + Assert.assertEquals(origSegCount, cubeInstance.getSegments().size()); + Assert.assertEquals(origSegCount + 1, newCubeInstance.getSegments().size()); } }