Repository: kylin
Updated Branches:
  refs/heads/KYILN-2317 5b13287d8 -> 477bf75e8


add segment check


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

Branch: refs/heads/KYILN-2317
Commit: 477bf75e87685f953ed24d8485fe739839e169b1
Parents: 5b13287
Author: Billy Liu <billy...@apache.org>
Authored: Thu Dec 29 16:10:42 2016 +0800
Committer: Billy Liu <billy...@apache.org>
Committed: Thu Dec 29 16:10:42 2016 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/tool/HybridCubeCLI.java    | 27 ++++++++++++++++++++
 1 file changed, 27 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/477bf75e/tool/src/main/java/org/apache/kylin/tool/HybridCubeCLI.java
----------------------------------------------------------------------
diff --git a/tool/src/main/java/org/apache/kylin/tool/HybridCubeCLI.java 
b/tool/src/main/java/org/apache/kylin/tool/HybridCubeCLI.java
index 461daf9..b525c45 100644
--- a/tool/src/main/java/org/apache/kylin/tool/HybridCubeCLI.java
+++ b/tool/src/main/java/org/apache/kylin/tool/HybridCubeCLI.java
@@ -32,6 +32,7 @@ import org.apache.kylin.common.util.AbstractApplication;
 import org.apache.kylin.common.util.OptionsHelper;
 import org.apache.kylin.cube.CubeInstance;
 import org.apache.kylin.cube.CubeManager;
+import org.apache.kylin.cube.CubeSegment;
 import org.apache.kylin.metadata.MetadataManager;
 import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.project.ProjectManager;
@@ -144,6 +145,7 @@ public class HybridCubeCLI extends AbstractApplication {
     }
 
     private HybridInstance create(String hybridName, List<RealizationEntry> 
realizationEntries, String projectName, String owner) throws IOException {
+        checkSegmentOffset(realizationEntries);
         HybridInstance hybridInstance = HybridInstance.create(kylinConfig, 
hybridName, realizationEntries);
         store.putResource(hybridInstance.getResourcePath(), hybridInstance, 
HybridManager.HYBRID_SERIALIZER);
         
ProjectManager.getInstance(kylinConfig).moveRealizationToProject(RealizationType.HYBRID,
 hybridInstance.getName(), projectName, owner);
@@ -153,6 +155,7 @@ public class HybridCubeCLI extends AbstractApplication {
     }
 
     private void update(HybridInstance hybridInstance, List<RealizationEntry> 
realizationEntries, String projectName, String owner) throws IOException {
+        checkSegmentOffset(realizationEntries);
         hybridInstance.setRealizationEntries(realizationEntries);
         store.putResource(hybridInstance.getResourcePath(), hybridInstance, 
HybridManager.HYBRID_SERIALIZER);
         
ProjectManager.getInstance(kylinConfig).moveRealizationToProject(RealizationType.HYBRID,
 hybridInstance.getName(), projectName, owner);
@@ -166,4 +169,28 @@ public class HybridCubeCLI extends AbstractApplication {
         hybridManager.reloadAllHybridInstance();
         logger.info("HybridInstance was deleted at: " + 
hybridInstance.getResourcePath());
     }
+
+    private void checkSegmentOffset(List<RealizationEntry> realizationEntries) 
{
+        if (realizationEntries == null || realizationEntries.size() == 0)
+            throw new RuntimeException("No realization found");
+        long lastOffset = -1;
+        for (RealizationEntry entry : realizationEntries) {
+            if (entry.getType() != RealizationType.CUBE) {
+                throw new RuntimeException("Wrong realization type: " + 
entry.getType() + ", only cube supported. ");
+            }
+
+            CubeInstance cubeInstance = 
cubeManager.getCube(entry.getRealization());
+            CubeSegment segment = cubeInstance.getLastSegment();
+            if (segment == null)
+                continue;
+            if (lastOffset == -1) {
+                lastOffset = segment.getSourceOffsetEnd();
+            } else {
+                if (lastOffset > segment.getSourceOffsetStart()) {
+                    throw new RuntimeException("Segments has overlap, could 
not hybrid. Last Segment End: " + lastOffset + ", Next Segment Start: " + 
segment.getSourceOffsetStart());
+                }
+                lastOffset = segment.getSourceOffsetEnd();
+            }
+        }
+    }
 }

Reply via email to