KYLIN-1182 Upgrade tool for DataModelDesc from 1.x to 2.0

Signed-off-by: honma <ho...@ebay.com>


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

Branch: refs/heads/2.0-rc
Commit: 3ecbfe72d94547d9cd3d4c90c98024c8fc915ce5
Parents: 1b6f1fe
Author: lidongsjtu <don...@ebay.com>
Authored: Thu Dec 3 11:44:59 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Fri Dec 4 16:14:52 2015 +0800

----------------------------------------------------------------------
 .../job/upgrade/CubeDescSignatureUpdate.java    |  66 ++++---
 .../job/upgrade/v2/DataModelDescUpgradeV2.java  | 170 +++++++++++++++++++
 .../kylin/metadata/model/DataModelDesc.java     |   8 +
 3 files changed, 217 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/3ecbfe72/core-job/src/main/java/org/apache/kylin/job/upgrade/CubeDescSignatureUpdate.java
----------------------------------------------------------------------
diff --git 
a/core-job/src/main/java/org/apache/kylin/job/upgrade/CubeDescSignatureUpdate.java
 
b/core-job/src/main/java/org/apache/kylin/job/upgrade/CubeDescSignatureUpdate.java
index 178f1b0..36784de 100644
--- 
a/core-job/src/main/java/org/apache/kylin/job/upgrade/CubeDescSignatureUpdate.java
+++ 
b/core-job/src/main/java/org/apache/kylin/job/upgrade/CubeDescSignatureUpdate.java
@@ -18,57 +18,40 @@
 
 package org.apache.kylin.job.upgrade;
 
-import com.google.common.collect.Lists;
+import java.util.List;
+
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.cube.CubeDescManager;
+import org.apache.kylin.cube.CubeManager;
 import org.apache.kylin.cube.model.CubeDesc;
+import org.apache.kylin.metadata.MetadataManager;
+import org.apache.kylin.metadata.project.ProjectManager;
 
-import java.util.List;
+import com.google.common.collect.Lists;
 
 /**
  * Created by dongli on 11/17/15.
  */
 public class CubeDescSignatureUpdate {
+    private static final Log logger = 
LogFactory.getLog(CubeDescSignatureUpdate.class);
     private KylinConfig config = null;
     private ResourceStore store;
     private String[] cubeNames;
     private List<String> updatedResources = Lists.newArrayList();
     private List<String> errorMsgs = Lists.newArrayList();
 
-    private static final Log logger = 
LogFactory.getLog(CubeDescSignatureUpdate.class);
-
     public CubeDescSignatureUpdate(String[] cubes) {
         config = KylinConfig.getInstanceFromEnv();
         store = ResourceStore.getStore(config);
         cubeNames = cubes;
     }
 
-    public void update() {
-        logger.info("Reloading Cube Metadata from store: " + 
store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT));
-        CubeDescManager cubeDescManager = CubeDescManager.getInstance(config);
-        List<CubeDesc> cubeDescs;
-        if (ArrayUtils.isEmpty(cubeNames)) {
-            cubeDescs = cubeDescManager.listAllDesc();
-        } else {
-            String[] names = cubeNames[0].split(",");
-            if (ArrayUtils.isEmpty(names))
-                return;
-            cubeDescs = Lists.newArrayListWithCapacity(names.length);
-            for (String name : names) {
-                cubeDescs.add(cubeDescManager.getCubeDesc(name));
-            }
-        }
-        for (CubeDesc cubeDesc : cubeDescs) {
-            updateCubeDesc(cubeDesc);
-        }
-    }
-
     public static void main(String args[]) {
-        if (args != null && args.length != 0 && args.length != 1) {
+        if (args != null && args.length > 1) {
             System.out.println("Usage: java CubeDescSignatureUpdate [Cubes]; 
e.g, cube1,cube2 ");
             return;
         }
@@ -100,11 +83,40 @@ public class CubeDescSignatureUpdate {
         
logger.info("=================================================================");
     }
 
+    public void update() {
+        logger.info("Reloading Cube Metadata from store: " + 
store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT));
+        CubeDescManager cubeDescManager = CubeDescManager.getInstance(config);
+        List<CubeDesc> cubeDescs;
+        if (ArrayUtils.isEmpty(cubeNames)) {
+            cubeDescs = cubeDescManager.listAllDesc();
+        } else {
+            String[] names = cubeNames[0].split(",");
+            if (ArrayUtils.isEmpty(names))
+                return;
+            cubeDescs = Lists.newArrayListWithCapacity(names.length);
+            for (String name : names) {
+                cubeDescs.add(cubeDescManager.getCubeDesc(name));
+            }
+        }
+        for (CubeDesc cubeDesc : cubeDescs) {
+            updateCubeDesc(cubeDesc);
+        }
+
+        verify();
+    }
+
+    private void verify() {
+        MetadataManager.getInstance(config).reload();
+        CubeDescManager.clearCache();
+        CubeDescManager.getInstance(config);
+        CubeManager.getInstance(config);
+        ProjectManager.getInstance(config);
+    }
+
     private void updateCubeDesc(CubeDesc cubeDesc) {
         try {
             String calculatedSign = cubeDesc.calculateSignature();
-            if (!cubeDesc.getSignature().equals(calculatedSign))
-            {
+            if (!cubeDesc.getSignature().equals(calculatedSign)) {
                 cubeDesc.setSignature(calculatedSign);
                 store.putResource(cubeDesc.getResourcePath(), cubeDesc, 
CubeDescManager.CUBE_DESC_SERIALIZER);
                 updatedResources.add(cubeDesc.getResourcePath());

http://git-wip-us.apache.org/repos/asf/kylin/blob/3ecbfe72/core-job/src/main/java/org/apache/kylin/job/upgrade/v2/DataModelDescUpgradeV2.java
----------------------------------------------------------------------
diff --git 
a/core-job/src/main/java/org/apache/kylin/job/upgrade/v2/DataModelDescUpgradeV2.java
 
b/core-job/src/main/java/org/apache/kylin/job/upgrade/v2/DataModelDescUpgradeV2.java
new file mode 100644
index 0000000..81b277d
--- /dev/null
+++ 
b/core-job/src/main/java/org/apache/kylin/job/upgrade/v2/DataModelDescUpgradeV2.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.kylin.job.upgrade.v2;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.persistence.ResourceStore;
+import org.apache.kylin.cube.CubeDescManager;
+import org.apache.kylin.cube.CubeManager;
+import org.apache.kylin.cube.model.CubeDesc;
+import org.apache.kylin.metadata.MetadataManager;
+import org.apache.kylin.metadata.model.DataModelDesc;
+import org.apache.kylin.metadata.model.DimensionDesc;
+import org.apache.kylin.metadata.model.MeasureDesc;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.project.ProjectManager;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * Created by dongli on 11/30/15.
+ *
+ * In v1.x, DataModelDesc doesn't include Dimensions and Measures, this tool 
is to fill them from CubeDesc.
+ */
+public class DataModelDescUpgradeV2 {
+    private static final Log logger = 
LogFactory.getLog(DataModelDescUpgradeV2.class);
+    private KylinConfig config = null;
+    private ResourceStore store;
+    private String[] models;
+    private List<String> updatedResources = Lists.newArrayList();
+    private List<String> errorMsgs = Lists.newArrayList();
+
+    public DataModelDescUpgradeV2(String[] models) {
+        this.config = KylinConfig.getInstanceFromEnv();
+        this.store = ResourceStore.getStore(config);
+        this.models = models;
+    }
+
+    public static void main(String args[]) throws Exception {
+        if (args != null && args.length > 1) {
+            System.out.println("Usage: java DataModelDescUpradeV2 [Models]; 
e.g, model1,model2 ");
+            return;
+        }
+
+        DataModelDescUpgradeV2 metadataUpgrade = new 
DataModelDescUpgradeV2(args);
+        metadataUpgrade.upgrade();
+
+        
logger.info("=================================================================");
+        logger.info("Run DataModelDescUpradeV2 completed;");
+
+        if (!metadataUpgrade.updatedResources.isEmpty()) {
+            logger.info("Following resources are updated successfully:");
+            for (String s : metadataUpgrade.updatedResources) {
+                logger.info(s);
+            }
+        } else {
+            logger.warn("No resource updated.");
+        }
+
+        if (!metadataUpgrade.errorMsgs.isEmpty()) {
+            logger.info("Here are the error/warning messages, you may need to 
check:");
+            for (String s : metadataUpgrade.errorMsgs) {
+                logger.warn(s);
+            }
+        } else {
+            logger.info("No error or warning messages; The update succeeds.");
+        }
+
+        
logger.info("=================================================================");
+    }
+
+    public void upgrade() {
+        logger.info("Reloading Cube Metadata from store: " + 
store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT));
+        CubeDescManager cubeDescManager = CubeDescManager.getInstance(config);
+        List<CubeDesc> cubeDescs = cubeDescManager.listAllDesc();
+        for (CubeDesc cubeDesc : cubeDescs) {
+            if (ArrayUtils.isEmpty(models) || ArrayUtils.contains(models, 
cubeDesc.getModelName())) {
+                upgradeDataModelDesc(cubeDesc);
+            }
+        }
+
+        verify();
+    }
+
+    private void verify() {
+        MetadataManager.getInstance(config).reload();
+        CubeDescManager.clearCache();
+        CubeDescManager.getInstance(config);
+        CubeManager.getInstance(config);
+        ProjectManager.getInstance(config);
+    }
+
+    private void upgradeDataModelDesc(CubeDesc cubeDesc) {
+        boolean upgrade = false;
+        DataModelDesc modelDesc = cubeDesc.getModel();
+        try {
+            if (modelDesc != null && modelDesc.getDimensions() == null && 
modelDesc.getMetrics() == null) {
+                List<org.apache.kylin.cube.model.DimensionDesc> 
cubeDimDescList = cubeDesc.getDimensions();
+                if (!CollectionUtils.isEmpty(cubeDimDescList)) {
+                    Map<String, HashSet<String>> modelDimMap = 
Maps.newHashMap();
+                    for (org.apache.kylin.cube.model.DimensionDesc cubeDimDesc 
: cubeDimDescList) {
+                        if (!modelDimMap.containsKey(cubeDimDesc.getTable())) {
+                            modelDimMap.put(cubeDimDesc.getTable(), new 
HashSet<String>());
+                        }
+                        
modelDimMap.get(cubeDimDesc.getTable()).addAll(Lists.newArrayList(cubeDimDesc.getDerived()
 != null ? cubeDimDesc.getDerived() : cubeDimDesc.getColumn()));
+                    }
+
+                    List<DimensionDesc> modelDimDescList = 
Lists.newArrayListWithCapacity(modelDimMap.size());
+                    for (Map.Entry<String, HashSet<String>> modelDimEntry : 
modelDimMap.entrySet()) {
+                        DimensionDesc dimDesc = new DimensionDesc();
+                        dimDesc.setTable(modelDimEntry.getKey());
+                        String[] columns = new 
String[modelDimEntry.getValue().size()];
+                        columns = modelDimEntry.getValue().toArray(columns);
+                        dimDesc.setColumns(columns);
+                        modelDimDescList.add(dimDesc);
+                    }
+                    DimensionDesc.capicalizeStrings(modelDimDescList);
+                    modelDesc.setDimensions(modelDimDescList);
+                    upgrade = true;
+                }
+
+                List<MeasureDesc> cubeMeasDescList = cubeDesc.getMeasures();
+                if (!CollectionUtils.isEmpty(cubeDimDescList)) {
+                    ArrayList<String> metrics = 
Lists.newArrayListWithExpectedSize(cubeMeasDescList.size());
+                    for (MeasureDesc cubeMeasDesc : cubeMeasDescList) {
+                        for (TblColRef tblColRef : 
cubeMeasDesc.getFunction().getParameter().getColRefs()) {
+                            metrics.add(tblColRef.getName());
+                        }
+                    }
+                    String[] metricsArray = new String[metrics.size()];
+                    modelDesc.setMetrics(metrics.toArray(metricsArray));
+                    upgrade = true;
+                }
+            }
+
+            if (upgrade) {
+                store.putResource(modelDesc.getResourcePath(), modelDesc, 
MetadataManager.MODELDESC_SERIALIZER);
+                updatedResources.add(modelDesc.getResourcePath());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            errorMsgs.add("Update DataModelDesc[" + modelDesc.getName() + "] 
failed: " + e.getLocalizedMessage());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/3ecbfe72/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
index 66581c0..db53bc5 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
@@ -322,4 +322,12 @@ public class DataModelDesc extends RootPersistentEntity {
     public String[] getMetrics() {
         return metrics;
     }
+
+    public void setDimensions(List<DimensionDesc> dimensions) {
+        this.dimensions = dimensions;
+    }
+
+    public void setMetrics(String[] metrics) {
+        this.metrics = metrics;
+    }
 }

Reply via email to