This is an automated email from the ASF dual-hosted git repository.

liyang pushed a commit to branch sync
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit a05a4d0058976f7a940fdf840643ab7c820ff6e4
Author: Jiatao Tao <245915...@qq.com>
AuthorDate: Tue Feb 27 16:56:50 2018 +0800

    KYLIN-3251, add a hook that can customize test_case_data and add 
MetadataCleanupJob UT.
    
    minor, refine test.
    
    minor, refine test.
---
 .../common/util/LocalFileMetadataTestCase.java     |  77 ++-
 .../org/apache/kylin/tool/MetadataCleanupJob.java  |  56 +-
 .../apache/kylin/tool/MetadataCleanupJobTest.java  |  76 +++
 tool/src/test/resources/test_meta/UUID             | Bin 0 -> 38 bytes
 .../test_meta/cube/ci_inner_join_cube.json         |  60 +++
 .../test_meta/cube_desc/ci_inner_join_cube.json    | 574 +++++++++++++++++++++
 .../04b6db34-b243-4780-855a-4c7ea4cee817.seq       | Bin 0 -> 2605183 bytes
 .../NAME/b58ce89d-3df6-46d1-8cff-2a9cfc8b7510.dict | Bin 0 -> 823 bytes
 .../NAME/64ca8fea-b859-4e63-aea3-bfb4c6ee0c9d.dict | Bin 0 -> 844 bytes
 .../execute/d861b8b7-c773-47ab-bb1e-c8782ae8d930   |  41 ++
 .../d861b8b7-c773-47ab-bb1e-c8782ae8d930           |  13 +
 .../d861b8b7-c773-47ab-bb1e-c8782ae8d930-00        |  13 +
 .../d861b8b7-c773-47ab-bb1e-c8782ae8d930-01        |  13 +
 tool/src/test/resources/test_meta/kylin.properties |   0
 .../test_meta/model_desc/ci_inner_join_model.json  | 231 +++++++++
 .../test/resources/test_meta/project/default.json  |  35 ++
 .../test_meta/table/DEFAULT.TEST_ACCOUNT.json      |  36 ++
 .../table/DEFAULT.TEST_CATEGORY_GROUPINGS.json     | 155 ++++++
 .../test_meta/table/DEFAULT.TEST_COUNTRY.json      |  26 +
 .../test_meta/table/DEFAULT.TEST_KYLIN_FACT.json   |  68 +++
 .../test_meta/table/DEFAULT.TEST_ORDER.json        |  35 ++
 .../resources/test_meta/table/EDW.TEST_CAL_DT.json | 413 +++++++++++++++
 .../test_meta/table/EDW.TEST_SELLER_TYPE_DIM.json  |  46 ++
 .../resources/test_meta/table/EDW.TEST_SITES.json  |  51 ++
 .../92456efe-9b79-4385-a5a3-e7f37b677bf7.snapshot  | Bin 0 -> 16063 bytes
 .../7ecdb07b-a8d0-49d8-892b-fe2dd75512ca.snapshot  | Bin 0 -> 16061 bytes
 26 files changed, 1968 insertions(+), 51 deletions(-)

diff --git 
a/core-common/src/test/java/org/apache/kylin/common/util/LocalFileMetadataTestCase.java
 
b/core-common/src/test/java/org/apache/kylin/common/util/LocalFileMetadataTestCase.java
index 5e6b840..20e1df7 100644
--- 
a/core-common/src/test/java/org/apache/kylin/common/util/LocalFileMetadataTestCase.java
+++ 
b/core-common/src/test/java/org/apache/kylin/common/util/LocalFileMetadataTestCase.java
@@ -27,37 +27,40 @@ import org.apache.kylin.common.persistence.ResourceStore;
 
 public class LocalFileMetadataTestCase extends AbstractKylinTestCase {
 
-    public static String LOCALMETA_TEST_DATA = 
"../examples/test_case_data/localmeta";
-    public static String LOCALMETA_TEMP_DATA = "../examples/test_metadata/";
+    public static final String LOCALMETA_TEST_DATA = 
"../examples/test_case_data/localmeta";
+    public static final String LOCALMETA_TEMP_DATA = 
"../examples/test_metadata/";
 
     @Override
     public void createTestMetadata(String... overlayMetadataDirs) {
-        //overlayMetadataDirs is useless yet
-        staticCreateTestMetadata(overlayMetadataDirs);
+        staticCreateTestMetadata(true, new 
OverlayMetaHook(overlayMetadataDirs));
     }
 
     public static void staticCreateTestMetadata(String... overlayMetadataDirs) 
{
-        String testDataFolder = LOCALMETA_TEST_DATA;
-        KylinConfig.destroyInstance();
+        staticCreateTestMetadata(true, new 
OverlayMetaHook(overlayMetadataDirs));
+    }
 
-        String tempTestMetadataUrl = LOCALMETA_TEMP_DATA;
+    public static void staticCreateTestMetadata(boolean useTestMeta, 
MetadataTestCaseHook hook) {
         try {
-            FileUtils.deleteDirectory(new File(tempTestMetadataUrl));
-            FileUtils.copyDirectory(new File(testDataFolder), new 
File(tempTestMetadataUrl));
+            KylinConfig.destroyInstance();
 
-            for (String overlay : overlayMetadataDirs) {
-                FileUtils.copyDirectory(new File(overlay), new 
File(tempTestMetadataUrl));
+            FileUtils.deleteDirectory(new File(LOCALMETA_TEMP_DATA));
+            if (useTestMeta) {
+                FileUtils.copyDirectory(new File(LOCALMETA_TEST_DATA), new 
File(LOCALMETA_TEMP_DATA));
             }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
 
-        if (System.getProperty(KylinConfig.KYLIN_CONF) == null && 
System.getenv(KylinConfig.KYLIN_CONF) == null)
-            System.setProperty(KylinConfig.KYLIN_CONF, tempTestMetadataUrl);
+            if (System.getProperty(KylinConfig.KYLIN_CONF) == null && 
System.getenv(KylinConfig.KYLIN_CONF) == null) {
+                System.setProperty(KylinConfig.KYLIN_CONF, 
LOCALMETA_TEMP_DATA);
+            }
 
-        KylinConfig config = KylinConfig.getInstanceFromEnv();
-        config.setMetadataUrl(tempTestMetadataUrl);
-        config.setProperty("kylin.env.hdfs-working-dir", "file:///tmp/kylin");
+            if (hook != null) {
+                hook.hook();
+            }
+            KylinConfig config = KylinConfig.getInstanceFromEnv();
+            config.setMetadataUrl(LOCALMETA_TEMP_DATA);
+            config.setProperty("kylin.env.hdfs-working-dir", 
"file:///tmp/kylin");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
     }
 
     public static void cleanAfterClass() {
@@ -90,4 +93,40 @@ public class LocalFileMetadataTestCase extends 
AbstractKylinTestCase {
     protected ResourceStore getStore() {
         return ResourceStore.getStore(KylinConfig.getInstanceFromEnv());
     }
+
+    public interface MetadataTestCaseHook {
+        void hook() throws IOException;
+    }
+
+    public static class OverlayMetaHook implements MetadataTestCaseHook {
+        private String[] overlayMetadataDirs;
+
+        public OverlayMetaHook(String... overlayMetadataDirs) {
+            this.overlayMetadataDirs = overlayMetadataDirs;
+        }
+
+        @Override
+        public void hook() throws IOException {
+            //some test cases may require additional metadata entries besides 
standard test metadata in test_case_data/localmeta
+            for (String overlay : overlayMetadataDirs) {
+                FileUtils.copyDirectory(new File(overlay), new 
File(LOCALMETA_TEMP_DATA));
+            }
+        }
+    }
+
+    public static class ExcludeMetaHook implements MetadataTestCaseHook {
+        private String[] excludeMetadataDirs;
+
+        public ExcludeMetaHook(String... excludeMetadataDirs) {
+            this.excludeMetadataDirs = excludeMetadataDirs;
+        }
+
+        @Override
+        public void hook() throws IOException {
+            //some test cases may want exclude metadata entries besides 
standard test metadata in test_case_data/localmeta
+            for (String exclude : excludeMetadataDirs) {
+                FileUtils.deleteQuietly(new File(exclude));
+            }
+        }
+    }
 }
diff --git a/tool/src/main/java/org/apache/kylin/tool/MetadataCleanupJob.java 
b/tool/src/main/java/org/apache/kylin/tool/MetadataCleanupJob.java
index 8e17645..d1c8423 100644
--- a/tool/src/main/java/org/apache/kylin/tool/MetadataCleanupJob.java
+++ b/tool/src/main/java/org/apache/kylin/tool/MetadataCleanupJob.java
@@ -41,30 +41,23 @@ import org.slf4j.LoggerFactory;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-/**
- */
 public class MetadataCleanupJob extends AbstractHadoopJob {
 
     @SuppressWarnings("static-access")
-    private static final Option OPTION_DELETE = 
OptionBuilder.withArgName("delete").hasArg().isRequired(false).withDescription("Delete
 the unused metadata").create("delete");
+    private static final Option OPTION_DELETE = 
OptionBuilder.withArgName("delete").hasArg().isRequired(false)
+            .withDescription("Delete the unused metadata").create("delete");
 
     @SuppressWarnings("static-access")
-    private static final Option OPTION_THRESHOLD_FOR_JOB = 
OptionBuilder.withArgName("jobThreshold").hasArg().isRequired(false).withDescription("Specify
 how many days of job metadata keeping. Default 30 
days").create("jobThreshold");
+    private static final Option OPTION_THRESHOLD_FOR_JOB = 
OptionBuilder.withArgName("jobThreshold").hasArg()
+            .isRequired(false).withDescription("Specify how many days of job 
metadata keeping. Default 30 days")
+            .create("jobThreshold");
 
     protected static final Logger logger = 
LoggerFactory.getLogger(MetadataCleanupJob.class);
-
-    boolean delete = false;
-
+    private boolean delete = false;
     private KylinConfig config = null;
-
     private static final long TIME_THREADSHOLD = 1 * 3600 * 1000L; // 1 hour
-    private static final int DEFAULT_DAY_THREADSHOLD_FOR_JOB = 30 ; // 30 days
+    private static final int DEFAULT_DAY_THREADSHOLD_FOR_JOB = 30; // 30 days
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.hadoop.util.Tool#run(java.lang.String[])
-     */
     @Override
     public int run(String[] args) throws Exception {
         Options options = new Options();
@@ -78,11 +71,10 @@ public class MetadataCleanupJob extends AbstractHadoopJob {
         logger.info("delete option value: '" + getOptionValue(OPTION_DELETE) + 
"'");
         logger.info("jobThreshold option value: '" + 
getOptionValue(OPTION_THRESHOLD_FOR_JOB) + "'");
         delete = Boolean.parseBoolean(getOptionValue(OPTION_DELETE));
-
-        config = KylinConfig.getInstanceFromEnv();
-
-        cleanup();
-
+        int jobThresholdDay = optionsHelper.hasOption(OPTION_THRESHOLD_FOR_JOB)
+                ? 
Integer.valueOf(optionsHelper.getOptionValue(OPTION_THRESHOLD_FOR_JOB))
+                : DEFAULT_DAY_THREADSHOLD_FOR_JOB;
+        cleanup(delete, jobThresholdDay);
         return 0;
     }
 
@@ -92,19 +84,17 @@ public class MetadataCleanupJob extends AbstractHadoopJob {
 
     private boolean isOlderThanThreshold(long resourceTime) {
         long currentTime = System.currentTimeMillis();
-
-        if (currentTime - resourceTime > TIME_THREADSHOLD)
-            return true;
-        return false;
+        return currentTime - resourceTime > TIME_THREADSHOLD;
     }
 
-    public void cleanup() throws Exception {
-        CubeManager cubeManager = CubeManager.getInstance(config);
-
+    public List<String> cleanup(boolean delete, int jobThresholdDay) throws 
Exception {
+        config = KylinConfig.getInstanceFromEnv();
+        CubeManager cubeManager = 
CubeManager.getInstance(KylinConfig.getInstanceFromEnv());
         List<String> toDeleteResource = Lists.newArrayList();
 
         // two level resources, snapshot tables and cube statistics
-        for (String resourceRoot : new String[] { 
ResourceStore.SNAPSHOT_RESOURCE_ROOT, ResourceStore.CUBE_STATISTICS_ROOT }) {
+        for (String resourceRoot : new 
String[]{ResourceStore.SNAPSHOT_RESOURCE_ROOT,
+                ResourceStore.CUBE_STATISTICS_ROOT}) {
             NavigableSet<String> snapshotTables = 
getStore().listResources(resourceRoot);
 
             if (snapshotTables != null) {
@@ -153,10 +143,11 @@ public class MetadataCleanupJob extends AbstractHadoopJob 
{
         for (ExecutablePO executable : allExecutable) {
             long lastModified = executable.getLastModified();
             ExecutableOutputPO output = 
executableDao.getJobOutput(executable.getUuid());
-            int jobThresholdDay = 
optionsHelper.hasOption(OPTION_THRESHOLD_FOR_JOB) ? 
Integer.valueOf(optionsHelper.getOptionValue(OPTION_THRESHOLD_FOR_JOB)) : 
DEFAULT_DAY_THREADSHOLD_FOR_JOB;
             long jobThresholdTime = jobThresholdDay * 24 * 3600 * 1000L;
 
-            if (System.currentTimeMillis() - lastModified > jobThresholdTime 
&& (ExecutableState.SUCCEED.toString().equals(output.getStatus()) || 
ExecutableState.DISCARDED.toString().equals(output.getStatus()))) {
+            if (System.currentTimeMillis() - lastModified > jobThresholdTime
+                    && 
(ExecutableState.SUCCEED.toString().equals(output.getStatus())
+                    || 
ExecutableState.DISCARDED.toString().equals(output.getStatus()))) {
                 toDeleteResource.add(ResourceStore.EXECUTE_RESOURCE_ROOT + "/" 
+ executable.getUuid());
                 
toDeleteResource.add(ResourceStore.EXECUTE_OUTPUT_RESOURCE_ROOT + "/" + 
executable.getUuid());
 
@@ -167,18 +158,19 @@ public class MetadataCleanupJob extends AbstractHadoopJob 
{
         }
 
         if (toDeleteResource.size() > 0) {
-            logger.info("The following resources have no reference or is too 
old, will be cleaned from metadata store: \n");
+            logger.info(
+                    "The following resources have no reference or is too old, 
will be cleaned from metadata store: \n");
 
             for (String s : toDeleteResource) {
                 logger.info(s);
-                if (delete == true) {
+                if (delete) {
                     getStore().deleteResource(s);
                 }
             }
         } else {
             logger.info("No resource to be cleaned up from metadata store;");
         }
-
+        return toDeleteResource;
     }
 
     public static void main(String[] args) throws Exception {
diff --git 
a/tool/src/test/java/org/apache/kylin/tool/MetadataCleanupJobTest.java 
b/tool/src/test/java/org/apache/kylin/tool/MetadataCleanupJobTest.java
new file mode 100644
index 0000000..ae3bef4
--- /dev/null
+++ b/tool/src/test/java/org/apache/kylin/tool/MetadataCleanupJobTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.tool;
+
+import static 
org.apache.kylin.common.util.LocalFileMetadataTestCase.LOCALMETA_TEMP_DATA;
+import static 
org.apache.kylin.common.util.LocalFileMetadataTestCase.cleanAfterClass;
+import static 
org.apache.kylin.common.util.LocalFileMetadataTestCase.staticCreateTestMetadata;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MetadataCleanupJobTest {
+
+    @After
+    public void after() throws Exception {
+        cleanAfterClass();
+    }
+
+    @Test
+    public void testCleanUp() throws Exception {
+        staticCreateTestMetadata(false, new ResetTimeHook(1, 
"src/test/resources/test_meta"));
+        MetadataCleanupJob metadataCleanupJob = new MetadataCleanupJob();
+        List<String> cleanupList = metadataCleanupJob.cleanup(false, 30);
+        Assert.assertEquals(7, cleanupList.size());
+    }
+
+    @Test
+    public void testNotCleanUp() throws Exception {
+        staticCreateTestMetadata(false, new 
ResetTimeHook(System.currentTimeMillis(), "src/test/resources/test_meta"));
+        MetadataCleanupJob metadataCleanupJob = new MetadataCleanupJob();
+        List<String> cleanupList = metadataCleanupJob.cleanup(false, 30);
+        Assert.assertEquals(0, cleanupList.size());
+    }
+
+    private class ResetTimeHook extends 
LocalFileMetadataTestCase.OverlayMetaHook {
+        private long lastModified;
+
+        ResetTimeHook(long lastModified, String... overlayMetadataDirs) {
+            super(overlayMetadataDirs);
+            this.lastModified = lastModified;
+        }
+
+        @Override
+        public void hook() throws IOException {
+            super.hook();
+            Collection<File> files = FileUtils.listFiles(new 
File(LOCALMETA_TEMP_DATA), null, true);
+            for (File file : files) {
+                file.setLastModified(lastModified);
+            }
+        }
+    }
+}
diff --git a/tool/src/test/resources/test_meta/UUID 
b/tool/src/test/resources/test_meta/UUID
new file mode 100644
index 0000000..981981c
Binary files /dev/null and b/tool/src/test/resources/test_meta/UUID differ
diff --git a/tool/src/test/resources/test_meta/cube/ci_inner_join_cube.json 
b/tool/src/test/resources/test_meta/cube/ci_inner_join_cube.json
new file mode 100644
index 0000000..0b074b6
--- /dev/null
+++ b/tool/src/test/resources/test_meta/cube/ci_inner_join_cube.json
@@ -0,0 +1,60 @@
+{
+  "uuid" : "8372c3b7-a33e-4b69-83dd-0bb8b1f8117e",
+  "last_modified" : 0,
+  "name" : "ci_inner_join_cube",
+  "owner" : null,
+  "descriptor" : "ci_inner_join_cube",
+  "display_name" : "ci_inner_join_cube",
+  "cost" : 50,
+  "status" : "READY",
+  "segments" : [{
+    "uuid" : "adb2275e-c1d5-498b-b8ea-0201586868aa",
+    "name" : "19700101000000_20220701000000",
+    "storage_location_identifier" : "KYLIN_J9TE08D9IA",
+    "date_range_start" : 0,
+    "date_range_end" : 1656633600000,
+    "source_offset_start" : 0,
+    "source_offset_end" : 0,
+    "status" : "READY",
+    "size_kb" : 78965,
+    "input_records" : 9911,
+    "input_records_size" : 3955601,
+    "last_build_time" : 1511364122982,
+    "last_build_job_id" : "b58ed952-3041-4431-b560-09b78fa1fca0",
+    "create_time_utc" : 1511363249614,
+    "cuboid_shard_nums" : {
+      "7864320" : 2,
+      "8847375" : 6,
+      "41943504" : 6,
+      "458784" : 2,
+      "3145728" : 2,
+      "8323104" : 4,
+      "2097152" : 2,
+      "8388608" : 2,
+      "16252928" : 6,
+      "25230848" : 6,
+      "3670016" : 2,
+      "67108863" : 6
+    },
+    "total_shards" : 0,
+    "blackout_cuboids" : [ ],
+    "binary_signature" : null,
+    "dictionaries" : {
+      "BUYER_COUNTRY.NAME" : 
"/dict/DEFAULT.TEST_COUNTRY/NAME/64ca8fea-b859-4e63-aea3-bfb4c6ee0c9d.dict"
+    },
+    "snapshots" : {
+      "DEFAULT.TEST_COUNTRY" : 
"/table_snapshot/DEFAULT.TEST_COUNTRY/7ecdb07b-a8d0-49d8-892b-fe2dd75512ca.snapshot"
+    },
+    "rowkey_stats" : [ [ "TEST_KYLIN_FACT.LEAF_CATEG_ID", 134, 1 ], [ 
"TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", 44, 1 ], [ 
"TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", 94, 1 ], [ 
"TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", 127, 1 ], [ 
"TEST_KYLIN_FACT.LSTG_SITE_ID", 8, 1 ], [ "TEST_KYLIN_FACT.SLR_SEGMENT_CD", 8, 
1 ], [ "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", 5, 1 ], [ 
"BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", 5, 1 ], [ 
"BUYER_ACCOUNT.ACCOUNT_COUNTRY", 8, 1 ], [ "BUYER_COUNTRY.NAME", 8, 1 ], [ "SE 
[...]
+    "additionalInfo" : {
+      "storageType" : "99",
+      "segmentPath" : 
"file:///Users/imad/mock_kylin/metastore/ci_cube/parquet/8372c3b7-a33e-4b69-83dd-0bb8b1f8117e/adb2275e-c1d5-498b-b8ea-0201586868aa/",
+      "storageFileCount" : "30",
+      "storageSizeBytes" : "80860160",
+      "tableIndexSegmentPath" : 
"file:///Users/imad/mock_kylin/metastore/ci_cube/parquet/2993d0d2-ee05-4e3a-8247-b121a1bdf7bc/adb2275e-c1d5-498b-b8ea-0201586868aa/",
+      "tableIndexFileCount" : "7",
+      "tableIndexStorageSizeBytes" : "8700293"
+    }
+  }],
+  "create_time" : null
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/cube_desc/ci_inner_join_cube.json 
b/tool/src/test/resources/test_meta/cube_desc/ci_inner_join_cube.json
new file mode 100644
index 0000000..809e188
--- /dev/null
+++ b/tool/src/test/resources/test_meta/cube_desc/ci_inner_join_cube.json
@@ -0,0 +1,574 @@
+{
+  "uuid": "3819ad72-3929-4dff-b59d-cd89a01238af",
+  "name": "ci_inner_join_cube",
+  "model_name": "ci_inner_join_model",
+  "description": null,
+  "dimensions": [
+    {
+      "name": "CAL_DT",
+      "table": "TEST_CAL_DT",
+      "column": "{FK}",
+      "derived": [
+        "WEEK_BEG_DT"
+      ]
+    },
+    {
+      "name": "ORDER_ID",
+      "table": "TEST_KYLIN_FACT",
+      "column": "ORDER_ID"
+    },
+    {
+      "name": "TEST_DATE_ENC",
+      "table": "TEST_ORDER",
+      "column": "TEST_DATE_ENC"
+    },
+    {
+      "name": "TEST_TIME_ENC",
+      "table": "TEST_ORDER",
+      "column": "TEST_TIME_ENC"
+    },
+    {
+      "name": "CATEGORY",
+      "table": "TEST_CATEGORY_GROUPINGS",
+      "column": "{FK}",
+      "derived": [
+        "USER_DEFINED_FIELD1",
+        "USER_DEFINED_FIELD3",
+        "UPD_DATE",
+        "UPD_USER"
+      ]
+    },
+    {
+      "name": "CATEGORY_HIERARCHY",
+      "table": "TEST_CATEGORY_GROUPINGS",
+      "column": "META_CATEG_NAME",
+      "derived": null
+    },
+    {
+      "name": "CATEGORY_HIERARCHY",
+      "table": "TEST_CATEGORY_GROUPINGS",
+      "column": "CATEG_LVL2_NAME",
+      "derived": null
+    },
+    {
+      "name": "CATEGORY_HIERARCHY",
+      "table": "TEST_CATEGORY_GROUPINGS",
+      "column": "CATEG_LVL3_NAME",
+      "derived": null
+    },
+    {
+      "name": "LSTG_FORMAT_NAME",
+      "table": "TEST_KYLIN_FACT",
+      "column": "LSTG_FORMAT_NAME",
+      "derived": null
+    },
+    {
+      "name": "SITE_ID",
+      "table": "TEST_SITES",
+      "column": "{FK}",
+      "derived": [
+        "SITE_NAME",
+        "CRE_USER"
+      ]
+    },
+    {
+      "name": "SELLER_TYPE_CD",
+      "table": "TEST_SELLER_TYPE_DIM",
+      "column": "{FK}",
+      "derived": [
+        "SELLER_TYPE_DESC"
+      ]
+    },
+    {
+      "name": "SELLER_ID",
+      "table": "TEST_KYLIN_FACT",
+      "column": "SELLER_ID"
+    },
+    {
+      "name": "SELLER_BUYER_LEVEL",
+      "table": "SELLER_ACCOUNT",
+      "column": "ACCOUNT_BUYER_LEVEL"
+    },
+    {
+      "name": "SELLER_SELLER_LEVEL",
+      "table": "SELLER_ACCOUNT",
+      "column": "ACCOUNT_SELLER_LEVEL"
+    },
+    {
+      "name": "SELLER_COUNTRY",
+      "table": "SELLER_ACCOUNT",
+      "column": "ACCOUNT_COUNTRY"
+    },
+    {
+      "name": "SELLER_COUNTRY_NAME",
+      "table": "SELLER_COUNTRY",
+      "column": "NAME"
+    },
+    {
+      "name": "BUYER_ID",
+      "table": "TEST_ORDER",
+      "column": "BUYER_ID"
+    },
+    {
+      "name": "BUYER_BUYER_LEVEL",
+      "table": "BUYER_ACCOUNT",
+      "column": "ACCOUNT_BUYER_LEVEL"
+    },
+    {
+      "name": "BUYER_SELLER_LEVEL",
+      "table": "BUYER_ACCOUNT",
+      "column": "ACCOUNT_SELLER_LEVEL"
+    },
+    {
+      "name": "BUYER_COUNTRY",
+      "table": "BUYER_ACCOUNT",
+      "column": "ACCOUNT_COUNTRY"
+    },
+    {
+      "name": "BUYER_COUNTRY_NAME",
+      "table": "BUYER_COUNTRY",
+      "column": "NAME"
+    }
+  ],
+  "measures": [
+    {
+      "name": "TRANS_CNT",
+      "function": {
+        "expression": "COUNT",
+        "parameter": {
+          "type": "constant",
+          "value": "1"
+        },
+        "returntype": "bigint"
+      }
+    },
+    {
+      "name": "ITEM_COUNT_SUM",
+      "function": {
+        "expression": "SUM",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.ITEM_COUNT"
+        },
+        "returntype": "bigint"
+      }
+    },
+    {
+      "name": "GMV_SUM",
+      "function": {
+        "expression": "SUM",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE"
+        },
+        "returntype": "decimal(19,4)"
+      }
+    },
+    {
+      "name": "GMV_MIN",
+      "function": {
+        "expression": "MIN",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE"
+        },
+        "returntype": "decimal(19,4)"
+      }
+    },
+    {
+      "name": "GMV_MAX",
+      "function": {
+        "expression": "MAX",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE"
+        },
+        "returntype": "decimal(19,4)"
+      }
+    },
+    {
+      "name": "SELLER_HLL",
+      "function": {
+        "expression": "COUNT_DISTINCT",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.SELLER_ID"
+        },
+        "returntype": "hllc(10)"
+      }
+    },
+    {
+      "name": "SELLER_FORMAT_HLL",
+      "function": {
+        "expression": "COUNT_DISTINCT",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+          "next_parameter": {
+            "type": "column",
+            "value": "TEST_KYLIN_FACT.SELLER_ID"
+          }
+        },
+        "returntype": "hllc(10)"
+      }
+    },
+    {
+      "name": "TOP_SELLER",
+      "function": {
+        "expression": "TOP_N",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE",
+          "next_parameter": {
+            "type": "column",
+            "value": "TEST_KYLIN_FACT.SELLER_ID"
+          }
+        },
+        "returntype": "topn(100, 4)",
+        "configuration": {
+          "topn.encoding.TEST_KYLIN_FACT.SELLER_ID": "int:4"
+        }
+      }
+    },
+    {
+      "name": "TEST_COUNT_DISTINCT_BITMAP",
+      "function": {
+        "expression": "COUNT_DISTINCT",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.TEST_COUNT_DISTINCT_BITMAP"
+        },
+        "returntype": "bitmap"
+      }
+    },
+    {
+      "name": "TEST_EXTENDED_COLUMN",
+      "function": {
+        "expression": "EXTENDED_COLUMN",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.ORDER_ID",
+          "next_parameter": {
+            "type": "column",
+            "value": "TEST_ORDER.TEST_EXTENDED_COLUMN"
+          }
+        },
+        "returntype": "extendedcolumn(100)"
+      }
+    },
+    {
+      "name": "BUYER_CONTACT",
+      "function": {
+        "expression": "EXTENDED_COLUMN",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_ORDER.BUYER_ID",
+          "next_parameter": {
+            "type": "column",
+            "value": "BUYER_ACCOUNT.ACCOUNT_CONTACT"
+          }
+        },
+        "returntype": "extendedcolumn(100)"
+      }
+    },
+    {
+      "name": "SELLER_CONTACT",
+      "function": {
+        "expression": "EXTENDED_COLUMN",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.SELLER_ID",
+          "next_parameter": {
+            "type": "column",
+            "value": "SELLER_ACCOUNT.ACCOUNT_CONTACT"
+          }
+        },
+        "returntype": "extendedcolumn(100)"
+      }
+    },
+    {
+      "name": "TRANS_ID_RAW",
+      "function": {
+        "expression": "RAW",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.TRANS_ID"
+        },
+        "returntype": "raw"
+      }
+    },
+    {
+      "name": "PRICE_RAW",
+      "function": {
+        "expression": "RAW",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE"
+        },
+        "returntype": "raw"
+      }
+    },
+    {
+      "name": "CAL_DT_RAW",
+      "function": {
+        "expression": "RAW",
+        "parameter": {
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.CAL_DT"
+        },
+        "returntype": "raw"
+      }
+    }
+  ],
+  "dictionaries": [
+    {
+      "column": "TEST_KYLIN_FACT.TEST_COUNT_DISTINCT_BITMAP",
+      "builder": "org.apache.kylin.dict.global.SegmentAppendTrieDictBuilder"
+    }
+  ],
+  "rowkey": {
+    "rowkey_columns": [
+      {
+        "column": "TEST_KYLIN_FACT.SELLER_ID",
+        "encoding": "int:4"
+      },
+      {
+        "column": "TEST_KYLIN_FACT.ORDER_ID",
+        "encoding": "int:4"
+      },
+      {
+        "column": "TEST_KYLIN_FACT.CAL_DT",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_KYLIN_FACT.LEAF_CATEG_ID",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+        "encoding": "fixed_length:12"
+      },
+      {
+        "column": "TEST_KYLIN_FACT.LSTG_SITE_ID",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_KYLIN_FACT.SLR_SEGMENT_CD",
+        "encoding": "dict"
+      },
+      {
+        "column": "TEST_ORDER.TEST_TIME_ENC",
+        "encoding": "time"
+      },
+      {
+        "column": "TEST_ORDER.TEST_DATE_ENC",
+        "encoding": "date"
+      },
+      {
+        "column": "TEST_ORDER.BUYER_ID",
+        "encoding": "int:4"
+      },
+      {
+        "column": "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL",
+        "encoding": "dict"
+      },
+      {
+        "column": "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL",
+        "encoding": "dict"
+      },
+      {
+        "column": "BUYER_ACCOUNT.ACCOUNT_COUNTRY",
+        "encoding": "dict"
+      },
+      {
+        "column": "BUYER_COUNTRY.NAME",
+        "encoding": "dict"
+      },
+      {
+        "column": "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL",
+        "encoding": "dict"
+      },
+      {
+        "column": "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL",
+        "encoding": "dict"
+      },
+      {
+        "column": "SELLER_ACCOUNT.ACCOUNT_COUNTRY",
+        "encoding": "dict"
+      },
+      {
+        "column": "SELLER_COUNTRY.NAME",
+        "encoding": "dict"
+      }
+    ]
+  },
+  "signature": null,
+  "last_modified": 1448959801311,
+  "null_string": null,
+  "hbase_mapping": {
+    "column_family": [
+      {
+        "name": "f1",
+        "columns": [
+          {
+            "qualifier": "m",
+            "measure_refs": [
+              "TRANS_CNT",
+              "ITEM_COUNT_SUM",
+              "GMV_SUM",
+              "GMV_MIN",
+              "GMV_MAX"
+            ]
+          }
+        ]
+      },
+      {
+        "name": "f2",
+        "columns": [
+          {
+            "qualifier": "m",
+            "measure_refs": [
+              "SELLER_HLL",
+              "SELLER_FORMAT_HLL",
+              "TOP_SELLER",
+              "TEST_COUNT_DISTINCT_BITMAP"
+            ]
+          }
+        ]
+      },
+      {
+        "name": "f3",
+        "columns": [
+          {
+            "qualifier": "m",
+            "measure_refs": [
+              "TEST_EXTENDED_COLUMN",
+              "BUYER_CONTACT",
+              "SELLER_CONTACT",
+              "TRANS_ID_RAW",
+              "PRICE_RAW",
+              "CAL_DT_RAW"
+            ]
+          }
+        ]
+      }
+    ]
+  },
+  "aggregation_groups": [
+    {
+      "includes": [
+        "TEST_KYLIN_FACT.CAL_DT",
+        "TEST_KYLIN_FACT.LEAF_CATEG_ID",
+        "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+        "TEST_KYLIN_FACT.LSTG_SITE_ID",
+        "TEST_KYLIN_FACT.SLR_SEGMENT_CD",
+        "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME",
+        "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME",
+        "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME"
+      ],
+      "select_rule": {
+        "hierarchy_dims": [
+          [
+            "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME",
+            "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME",
+            "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME",
+            "TEST_KYLIN_FACT.LEAF_CATEG_ID"
+          ]
+        ],
+        "mandatory_dims": [],
+        "joint_dims": [
+          [
+            "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+            "TEST_KYLIN_FACT.LSTG_SITE_ID",
+            "TEST_KYLIN_FACT.SLR_SEGMENT_CD"
+          ]
+        ],
+        "dim_cap": 3
+      }
+    },
+    {
+      "includes": [
+        "TEST_KYLIN_FACT.CAL_DT",
+        "TEST_KYLIN_FACT.LEAF_CATEG_ID",
+        "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+        "TEST_KYLIN_FACT.LSTG_SITE_ID",
+        "TEST_KYLIN_FACT.SLR_SEGMENT_CD",
+        "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME",
+        "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME",
+        "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME",
+        "TEST_KYLIN_FACT.SELLER_ID",
+        "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL",
+        "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL",
+        "SELLER_ACCOUNT.ACCOUNT_COUNTRY",
+        "SELLER_COUNTRY.NAME",
+        "TEST_KYLIN_FACT.ORDER_ID",
+        "TEST_ORDER.TEST_DATE_ENC",
+        "TEST_ORDER.TEST_TIME_ENC",
+        "TEST_ORDER.BUYER_ID",
+        "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL",
+        "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL",
+        "BUYER_ACCOUNT.ACCOUNT_COUNTRY",
+        "BUYER_COUNTRY.NAME"
+      ],
+      "select_rule": {
+        "hierarchy_dims": [],
+        "mandatory_dims": [
+          "TEST_KYLIN_FACT.CAL_DT"
+        ],
+        "joint_dims": [
+          [
+            "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME",
+            "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME",
+            "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME",
+            "TEST_KYLIN_FACT.LEAF_CATEG_ID"
+          ],
+          [
+            "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+            "TEST_KYLIN_FACT.LSTG_SITE_ID",
+            "TEST_KYLIN_FACT.SLR_SEGMENT_CD"
+          ],
+          [
+            "TEST_KYLIN_FACT.SELLER_ID",
+            "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL",
+            "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL",
+            "SELLER_ACCOUNT.ACCOUNT_COUNTRY",
+            "SELLER_COUNTRY.NAME"
+          ],
+          [
+            "TEST_KYLIN_FACT.ORDER_ID",
+            "TEST_ORDER.TEST_DATE_ENC",
+            "TEST_ORDER.TEST_TIME_ENC",
+            "TEST_ORDER.BUYER_ID",
+            "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL",
+            "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL",
+            "BUYER_ACCOUNT.ACCOUNT_COUNTRY",
+            "BUYER_COUNTRY.NAME"
+          ]
+        ],
+        "dim_cap": 5
+      }
+    }
+  ],
+  "notify_list": null,
+  "status_need_notify": [],
+  "auto_merge_time_ranges": null,
+  "retention_range": 0,
+  "engine_type": 4,
+  "storage_type": 2,
+  "override_kylin_properties": {
+    "kylin.cube.algorithm": "LAYER"
+  },
+  "partition_date_start": 0
+}
diff --git 
a/tool/src/test/resources/test_meta/cube_statistics/kylin_sales_cube/04b6db34-b243-4780-855a-4c7ea4cee817.seq
 
b/tool/src/test/resources/test_meta/cube_statistics/kylin_sales_cube/04b6db34-b243-4780-855a-4c7ea4cee817.seq
new file mode 100644
index 0000000..5dc08b8
Binary files /dev/null and 
b/tool/src/test/resources/test_meta/cube_statistics/kylin_sales_cube/04b6db34-b243-4780-855a-4c7ea4cee817.seq
 differ
diff --git 
a/tool/src/test/resources/test_meta/dict/DEFAULT.KYLIN_COUNTRY/NAME/b58ce89d-3df6-46d1-8cff-2a9cfc8b7510.dict
 
b/tool/src/test/resources/test_meta/dict/DEFAULT.KYLIN_COUNTRY/NAME/b58ce89d-3df6-46d1-8cff-2a9cfc8b7510.dict
new file mode 100644
index 0000000..7dcca2a
Binary files /dev/null and 
b/tool/src/test/resources/test_meta/dict/DEFAULT.KYLIN_COUNTRY/NAME/b58ce89d-3df6-46d1-8cff-2a9cfc8b7510.dict
 differ
diff --git 
a/tool/src/test/resources/test_meta/dict/DEFAULT.TEST_COUNTRY/NAME/64ca8fea-b859-4e63-aea3-bfb4c6ee0c9d.dict
 
b/tool/src/test/resources/test_meta/dict/DEFAULT.TEST_COUNTRY/NAME/64ca8fea-b859-4e63-aea3-bfb4c6ee0c9d.dict
new file mode 100644
index 0000000..86a5154
Binary files /dev/null and 
b/tool/src/test/resources/test_meta/dict/DEFAULT.TEST_COUNTRY/NAME/64ca8fea-b859-4e63-aea3-bfb4c6ee0c9d.dict
 differ
diff --git 
a/tool/src/test/resources/test_meta/execute/d861b8b7-c773-47ab-bb1e-c8782ae8d930
 
b/tool/src/test/resources/test_meta/execute/d861b8b7-c773-47ab-bb1e-c8782ae8d930
new file mode 100644
index 0000000..ed6d6fa
--- /dev/null
+++ 
b/tool/src/test/resources/test_meta/execute/d861b8b7-c773-47ab-bb1e-c8782ae8d930
@@ -0,0 +1,41 @@
+{
+  "uuid" : "d861b8b7-c773-47ab-bb1e-c8782ae8d930",
+  "last_modified" : 0,
+  "version" : "2.3.0.20500",
+  "name" : "BUILD CUBE - ss - FULL_BUILD - GMT+08:00 2017-10-13 10:57:22",
+  "tasks" : [ {
+"uuid" : "d861b8b7-c773-47ab-bb1e-c8782ae8d930-00",
+    "last_modified" : 0,
+    "version" : "2.3.0.20500",
+    "name" : "Create Intermediate Flat Hive Table",
+    "tasks" : null,
+    "type" : "org.apache.kylin.source.hive.CreateFlatHiveTableStep",
+    "params" : {
+      "HiveInit" : "USE default;\n",
+      "HiveRedistributeData" : "DROP TABLE IF EXISTS 
kylin_intermediate_ss_a110ac52_9a91_49fe_944a_346d61e54115;\nCREATE EXTERNAL 
TABLE IF NOT EXISTS 
kylin_intermediate_ss_a110ac52_9a91_49fe_944a_346d61e54115\n(\nKYLIN_SALES_LSTG_FORMAT_NAME
 string\n,KYLIN_SALES_PRICE decimal(19,4)\n)\nSTORED AS SEQUENCEFILE\nLOCATION 
'hdfs://sandbox.hortonworks.com:8020/Users/jiatao.tao/Documents/meta5/kylin-d861b8b7-c773-47ab-bb1e-c8782ae8d930/kylin_intermediate_ss_a110ac52_9a91_49fe_944a_346d61e54115'
 [...]
+      "cubeName" : "ss"
+    }
+  }, {
+    "uuid" : "d861b8b7-c773-47ab-bb1e-c8782ae8d930-01",
+    "last_modified" : 0,
+    "version" : "2.3.0.20500",
+    "name" : "Redistribute Flat Hive Table",
+    "tasks" : null,
+    "type" : 
"org.apache.kylin.source.hive.HiveMRInput$RedistributeFlatHiveTableStep",
+    "params" : {
+      "HiveInit" : "USE default;\n",
+      "HiveRedistributeData" : "INSERT OVERWRITE TABLE 
kylin_intermediate_ss_a110ac52_9a91_49fe_944a_346d61e54115 SELECT * FROM 
kylin_intermediate_ss_a110ac52_9a91_49fe_944a_346d61e54115 DISTRIBUTE BY 
RAND();\n",
+      "cubeName" : "ss",
+      "intermediateTable" : 
"kylin_intermediate_ss_a110ac52_9a91_49fe_944a_346d61e54115"
+    }
+  }],
+  "type" : "org.apache.kylin.engine.mr.CubingJob",
+  "params" : {
+    "submitter" : "ADMIN",
+    "envName" : "DEV",
+    "segmentId" : "a110ac52-9a91-49fe-944a-346d61e54115",
+    "notify_list" : "",
+    "projectName" : "learn_kylin",
+    "cubeName" : "ss"
+  }
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930
 
b/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930
new file mode 100644
index 0000000..fab62b5
--- /dev/null
+++ 
b/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930
@@ -0,0 +1,13 @@
+{
+  "uuid" : "d861b8b7-c773-47ab-bb1e-c8782ae8d930",
+  "last_modified" : 1507863555561,
+  "version" : "2.2.0.20500",
+  "content" : null,
+  "status" : "SUCCEED",
+  "info" : {
+    "startTime" : "1505914710093",
+    "mapReduceWaitTime" : "243712",
+    "algorithm" : "LAYER",
+    "endTime" : "1507863555561"
+  }
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930-00
 
b/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930-00
new file mode 100644
index 0000000..19e88f7
--- /dev/null
+++ 
b/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930-00
@@ -0,0 +1,13 @@
+{
+  "uuid" : "d861b8b7-c773-47ab-bb1e-c8782ae8d930-00",
+  "last_modified" : 1507863555561,
+  "version" : "2.2.0.20500",
+  "content" : null,
+  "status" : "SUCCEED",
+  "info" : {
+    "startTime" : "1505914710093",
+    "mapReduceWaitTime" : "243712",
+    "algorithm" : "LAYER",
+    "endTime" : "1507863555561"
+  }
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930-01
 
b/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930-01
new file mode 100644
index 0000000..0759ee3
--- /dev/null
+++ 
b/tool/src/test/resources/test_meta/execute_output/d861b8b7-c773-47ab-bb1e-c8782ae8d930-01
@@ -0,0 +1,13 @@
+{
+  "uuid" : "d861b8b7-c773-47ab-bb1e-c8782ae8d930-01",
+  "last_modified" : 1507863555561,
+  "version" : "2.2.0.20500",
+  "content" : null,
+  "status" : "SUCCEED",
+  "info" : {
+    "startTime" : "1505914710093",
+    "mapReduceWaitTime" : "243712",
+    "algorithm" : "LAYER",
+    "endTime" : "1507863555561"
+  }
+}
\ No newline at end of file
diff --git a/tool/src/test/resources/test_meta/kylin.properties 
b/tool/src/test/resources/test_meta/kylin.properties
new file mode 100644
index 0000000..e69de29
diff --git 
a/tool/src/test/resources/test_meta/model_desc/ci_inner_join_model.json 
b/tool/src/test/resources/test_meta/model_desc/ci_inner_join_model.json
new file mode 100644
index 0000000..a3c3c05
--- /dev/null
+++ b/tool/src/test/resources/test_meta/model_desc/ci_inner_join_model.json
@@ -0,0 +1,231 @@
+{
+  "uuid": "72ab4ee2-2cdb-4b07-b39e-4c298563ae27",
+  "name": "ci_inner_join_model",
+  "fact_table": "DEFAULT.TEST_KYLIN_FACT",
+  "join_tables": [
+    {
+      "table": "DEFAULT.TEST_ORDER",
+      "kind": "FACT",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "TEST_ORDER.ORDER_ID"
+        ],
+        "foreign_key": [
+          "TEST_KYLIN_FACT.ORDER_ID"
+        ]
+      }
+    },
+    {
+      "table": "DEFAULT.TEST_ACCOUNT",
+      "alias": "BUYER_ACCOUNT",
+      "kind": "FACT",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "BUYER_ACCOUNT.ACCOUNT_ID"
+        ],
+        "foreign_key": [
+          "TEST_ORDER.BUYER_ID"
+        ]
+      }
+    },
+    {
+      "table": "EDW.TEST_CAL_DT",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "TEST_CAL_DT.CAL_DT"
+        ],
+        "foreign_key": [
+          "TEST_KYLIN_FACT.CAL_DT"
+        ]
+      }
+    },
+    {
+      "table": "DEFAULT.TEST_CATEGORY_GROUPINGS",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID",
+          "TEST_CATEGORY_GROUPINGS.SITE_ID"
+        ],
+        "foreign_key": [
+          "TEST_KYLIN_FACT.LEAF_CATEG_ID",
+          "TEST_KYLIN_FACT.LSTG_SITE_ID"
+        ]
+      }
+    },
+    {
+      "table": "EDW.TEST_SITES",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "TEST_SITES.SITE_ID"
+        ],
+        "foreign_key": [
+          "TEST_KYLIN_FACT.LSTG_SITE_ID"
+        ]
+      }
+    },
+    {
+      "table": "EDW.TEST_SELLER_TYPE_DIM",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD"
+        ],
+        "foreign_key": [
+          "TEST_KYLIN_FACT.SLR_SEGMENT_CD"
+        ]
+      }
+    },
+    {
+      "table": "DEFAULT.TEST_COUNTRY",
+      "alias": "BUYER_COUNTRY",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "BUYER_COUNTRY.COUNTRY"
+        ],
+        "foreign_key": [
+          "BUYER_ACCOUNT.ACCOUNT_COUNTRY"
+        ]
+      }
+    },
+    {
+      "table": "DEFAULT.TEST_COUNTRY",
+      "alias": "SELLER_COUNTRY",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "SELLER_COUNTRY.COUNTRY"
+        ],
+        "foreign_key": [
+          "SELLER_ACCOUNT.ACCOUNT_COUNTRY"
+        ]
+      }
+    },
+    {
+      "table": "DEFAULT.TEST_ACCOUNT",
+      "alias": "SELLER_ACCOUNT",
+      "kind": "FACT",
+      "join": {
+        "type": "INNER",
+        "primary_key": [
+          "SELLER_ACCOUNT.ACCOUNT_ID"
+        ],
+        "foreign_key": [
+          "TEST_KYLIN_FACT.SELLER_ID"
+        ]
+      }
+    }
+  ],
+  "dimensions": [
+    {
+      "table": "TEST_KYLIN_FACT",
+      "columns": [
+        "TRANS_ID",
+        "ORDER_ID",
+        "CAL_DT",
+        "LSTG_FORMAT_NAME",
+        "LSTG_SITE_ID",
+        "LEAF_CATEG_ID",
+        "SLR_SEGMENT_CD",
+        "SELLER_ID",
+        "TEST_COUNT_DISTINCT_BITMAP"
+      ]
+    },
+    {
+      "table": "TEST_ORDER",
+      "columns": [
+        "ORDER_ID",
+        "BUYER_ID",
+        "TEST_DATE_ENC",
+        "TEST_TIME_ENC",
+        "TEST_EXTENDED_COLUMN"
+      ]
+    },
+    {
+      "table": "BUYER_ACCOUNT",
+      "columns": [
+        "ACCOUNT_ID",
+        "ACCOUNT_BUYER_LEVEL",
+        "ACCOUNT_SELLER_LEVEL",
+        "ACCOUNT_COUNTRY",
+        "ACCOUNT_CONTACT"
+      ]
+    },
+    {
+      "table": "SELLER_ACCOUNT",
+      "columns": [
+        "ACCOUNT_ID",
+        "ACCOUNT_BUYER_LEVEL",
+        "ACCOUNT_SELLER_LEVEL",
+        "ACCOUNT_COUNTRY",
+        "ACCOUNT_CONTACT"
+      ]
+    },
+    {
+      "table": "TEST_CATEGORY_GROUPINGS",
+      "columns": [
+        "LEAF_CATEG_ID",
+        "SITE_ID",
+        "META_CATEG_NAME",
+        "CATEG_LVL2_NAME",
+        "CATEG_LVL3_NAME",
+        "USER_DEFINED_FIELD1",
+        "USER_DEFINED_FIELD3",
+        "UPD_DATE",
+        "UPD_USER"
+      ]
+    },
+    {
+      "table": "TEST_SITES",
+      "columns": [
+        "SITE_ID",
+        "SITE_NAME",
+        "CRE_USER"
+      ]
+    },
+    {
+      "table": "TEST_SELLER_TYPE_DIM",
+      "columns": [
+        "SELLER_TYPE_CD",
+        "SELLER_TYPE_DESC"
+      ]
+    },
+    {
+      "table": "TEST_CAL_DT",
+      "columns": [
+        "CAL_DT",
+        "WEEK_BEG_DT"
+      ]
+    },
+    {
+      "table": "BUYER_COUNTRY",
+      "columns": [
+        "COUNTRY",
+        "NAME"
+      ]
+    },
+    {
+      "table": "SELLER_COUNTRY",
+      "columns": [
+        "COUNTRY",
+        "NAME"
+      ]
+    }
+  ],
+  "metrics": [
+    "TEST_KYLIN_FACT.PRICE",
+    "TEST_KYLIN_FACT.ITEM_COUNT"
+  ],
+  "last_modified": 1422435345352,
+  "filter_condition": null,
+  "partition_desc": {
+    "partition_date_column": "DEFAULT.TEST_KYLIN_FACT.CAL_DT",
+    "partition_date_start": 0,
+    "partition_type": "APPEND"
+  }
+}
diff --git a/tool/src/test/resources/test_meta/project/default.json 
b/tool/src/test/resources/test_meta/project/default.json
new file mode 100644
index 0000000..f2fd757
--- /dev/null
+++ b/tool/src/test/resources/test_meta/project/default.json
@@ -0,0 +1,35 @@
+{
+  "uuid": "1eaca32a-a33e-4b69-83dd-0bb8b1f8c91b",
+  "name": "default",
+  "realizations": [
+    {
+      "name": "ci_inner_join_cube",
+      "type": "CUBE",
+      "realization": "ci_inner_join_cube"
+    }
+  ],
+  "tables": [
+    "DEFAULT.TEST_KYLIN_FACT",
+    "DEFAULT.TEST_ORDER",
+    "DEFAULT.TEST_ACCOUNT",
+    "DEFAULT.TEST_COUNTRY",
+    "EDW.TEST_CAL_DT",
+    "DEFAULT.TEST_CATEGORY_GROUPINGS",
+    "EDW.TEST_SITES",
+    "EDW.TEST_SELLER_TYPE_DIM",
+    "DEFAULT.STREAMING_TABLE",
+    "SSB.CUSTOMER",
+    "SSB.DATES",
+    "SSB.PART",
+    "SSB.SUPPLIER",
+    "SSB.V_LINEORDER",
+    "DEFAULT.FIFTY_DIM",
+    "DEFAULT.WIDE_TABLE"
+  ],
+  "models": [
+    "ci_inner_join_model"
+  ],
+  "override_kylin_properties" :{
+    "kylin.storage.hbase.owner-tag": "ky...@kylin.apache.org"
+  }
+}
diff --git a/tool/src/test/resources/test_meta/table/DEFAULT.TEST_ACCOUNT.json 
b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_ACCOUNT.json
new file mode 100644
index 0000000..5945713
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_ACCOUNT.json
@@ -0,0 +1,36 @@
+{
+  "uuid" : "f386e39e-40d7-44c2-9eb3-41b365632231",
+ 
+  "name" : "TEST_ACCOUNT",
+  "data_gen" : "2000",
+  
+  "columns" : [ {
+    "id" : "1",
+    "name" : "ACCOUNT_ID",
+    "datatype" : "bigint",
+    "data_gen" : "ID|10000000",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "ACCOUNT_BUYER_LEVEL",
+    "datatype" : "int",
+    "data_gen" : "RAND||0|5"
+  }, {
+    "id" : "3",
+    "name" : "ACCOUNT_SELLER_LEVEL",
+    "datatype" : "int",
+    "data_gen" : "RAND||0|5"
+  }, {
+    "id" : "4",
+    "name" : "ACCOUNT_COUNTRY",
+    "datatype" : "string",
+    "data_gen" : "CN|FR|GB|GE|JP|IT|RU|US",
+    "index": "T"
+  }, {
+    "id" : "5",
+    "name" : "ACCOUNT_CONTACT",
+    "datatype" : "string"
+  } ],
+  "database" : "DEFAULT",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json 
b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json
new file mode 100644
index 0000000..adaf987
--- /dev/null
+++ 
b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json
@@ -0,0 +1,155 @@
+{
+ 
+  "uuid" : "952d11b5-69d9-45d1-92af-227489485e3f",
+  "name" : "TEST_CATEGORY_GROUPINGS",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "LEAF_CATEG_ID",
+    "datatype" : "bigint",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "LEAF_CATEG_NAME",
+    "datatype" : "string",
+    "index": "T"
+  }, {
+    "id" : "3",
+    "name" : "SITE_ID",
+    "datatype" : "int",
+    "index": "T"
+  }, {
+    "id" : "4",
+    "name" : "CATEG_BUSN_MGR",
+    "datatype" : "string"
+  }, {
+    "id" : "5",
+    "name" : "CATEG_BUSN_UNIT",
+    "datatype" : "string"
+  }, {
+    "id" : "6",
+    "name" : "REGN_CATEG",
+    "datatype" : "string"
+  }, {
+    "id" : "7",
+    "name" : "USER_DEFINED_FIELD1",
+    "datatype" : "string"
+  }, {
+    "id" : "8",
+    "name" : "USER_DEFINED_FIELD3",
+    "datatype" : "string"
+  }, {
+    "id" : "9",
+    "name" : "GROUPINGS_CRE_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "10",
+    "name" : "UPD_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "11",
+    "name" : "GROUPINGS_CRE_USER",
+    "datatype" : "string"
+  }, {
+    "id" : "12",
+    "name" : "UPD_USER",
+    "datatype" : "string"
+  }, {
+    "id" : "13",
+    "name" : "META_CATEG_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "14",
+    "name" : "META_CATEG_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "15",
+    "name" : "CATEG_LVL2_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "16",
+    "name" : "CATEG_LVL3_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "17",
+    "name" : "CATEG_LVL4_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "18",
+    "name" : "CATEG_LVL5_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "19",
+    "name" : "CATEG_LVL6_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "20",
+    "name" : "CATEG_LVL7_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "21",
+    "name" : "CATEG_LVL2_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "22",
+    "name" : "CATEG_LVL3_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "23",
+    "name" : "CATEG_LVL4_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "24",
+    "name" : "CATEG_LVL5_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "25",
+    "name" : "CATEG_LVL6_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "26",
+    "name" : "CATEG_LVL7_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "27",
+    "name" : "CATEG_FLAGS",
+    "datatype" : "decimal"
+  }, {
+    "id" : "28",
+    "name" : "ADULT_CATEG_YN",
+    "datatype" : "string"
+  }, {
+    "id" : "29",
+    "name" : "DOMAIN_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "30",
+    "name" : "USER_DEFINED_FIELD5",
+    "datatype" : "string"
+  }, {
+    "id" : "31",
+    "name" : "VCS_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "32",
+    "name" : "GCS_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "33",
+    "name" : "MOVE_TO",
+    "datatype" : "decimal"
+  }, {
+    "id" : "34",
+    "name" : "SAP_CATEGORY_ID",
+    "datatype" : "decimal"
+  }, {
+    "id" : "35",
+    "name" : "SRC_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "36",
+    "name" : "BSNS_VRTCL_NAME",
+    "datatype" : "string"
+  } ],
+  "database" : "DEFAULT",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git a/tool/src/test/resources/test_meta/table/DEFAULT.TEST_COUNTRY.json 
b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_COUNTRY.json
new file mode 100644
index 0000000..870cb2d
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_COUNTRY.json
@@ -0,0 +1,26 @@
+{
+  "uuid" : "e286e39e-40d7-44c2-8fa2-41b365632882",
+ 
+  "name" : "TEST_COUNTRY",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "COUNTRY",
+    "datatype" : "string",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "LATITUDE",
+    "datatype" : "double"
+  }, {
+    "id" : "3",
+    "name" : "LONGITUDE",
+    "datatype" : "double"
+  }, {
+    "id" : "4",
+    "name" : "NAME",
+    "datatype" : "string",
+    "index": "T"
+  } ],
+  "database" : "DEFAULT",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/table/DEFAULT.TEST_KYLIN_FACT.json 
b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_KYLIN_FACT.json
new file mode 100644
index 0000000..4be05f2
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_KYLIN_FACT.json
@@ -0,0 +1,68 @@
+{
+  "uuid" : "e286e39e-40d7-44c2-8fa2-41b365522771",
+  "name" : "TEST_KYLIN_FACT",
+  "data_gen" : "1",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "TRANS_ID",
+    "datatype" : "bigint",
+    "data_gen" : "ID"
+  }, {
+    "id" : "2",
+    "name" : "ORDER_ID",
+    "datatype" : "bigint",
+    "index": "T"
+  }, {
+    "id" : "3",
+    "name" : "CAL_DT",
+    "datatype" : "date",
+    "data_gen" : "FK,order",
+    "index": "T"
+  }, {
+    "id" : "4",
+    "name" : "LSTG_FORMAT_NAME",
+    "datatype" : "string",
+    "data_gen" : "FP-GTC|FP-non GTC|ABIN|Auction|Others",
+    "index": "T"
+  }, {
+    "id" : "5",
+    "name" : "LEAF_CATEG_ID",
+    "datatype" : "bigint",
+    "data_gen" : "FK,null,nullstr=0",
+    "index": "T"
+  }, {
+    "id" : "6",
+    "name" : "LSTG_SITE_ID",
+    "datatype" : "int",
+    "index": "T"
+  }, {
+    "id" : "7",
+    "name" : "SLR_SEGMENT_CD",
+    "datatype" : "smallint",
+    "data_gen" : "FK,pk=EDW.TEST_SELLER_TYPE_DIM_TABLE.SELLER_TYPE_CD",
+    "index": "T"
+  }, {
+    "id" : "8",
+    "name" : "SELLER_ID",
+    "datatype" : "int",
+    "data_gen" : "RAND||10000000|10001000",
+    "index": "T"
+  }, {
+    "id" : "9",
+    "name" : "PRICE",
+    "datatype" : "decimal",
+    "data_gen" : "RAND|.##|-100|1000"
+  }, {
+    "id" : "10",
+    "name" : "ITEM_COUNT",
+    "datatype" : "int",
+    "data_gen" : "RAND"
+  }, {
+    "id" : "11",
+    "name" : "TEST_COUNT_DISTINCT_BITMAP",
+    "datatype" : "string",
+    "data_gen" : "RAND"
+  } ],
+  "database" : "DEFAULT",
+  "last_modified" : 0
+}
diff --git a/tool/src/test/resources/test_meta/table/DEFAULT.TEST_ORDER.json 
b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_ORDER.json
new file mode 100644
index 0000000..7232492
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/DEFAULT.TEST_ORDER.json
@@ -0,0 +1,35 @@
+{
+  "uuid" : "f216e39e-40d7-44c2-8fa2-41b3656398ae",
+  "name" : "TEST_ORDER",
+  "data_gen" : "0.5",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "ORDER_ID",
+    "datatype" : "bigint",
+    "data_gen" : "ID",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "BUYER_ID",
+    "datatype" : "bigint",
+    "data_gen" : "RAND||10000500|10001500",
+    "index": "T"
+  }, {
+    "id" : "3",
+    "name" : "TEST_DATE_ENC",
+    "datatype" : "date",
+    "data_gen" : "RAND"
+  }, {
+    "id" : "4",
+    "name" : "TEST_TIME_ENC",
+    "datatype" : "timestamp",
+    "data_gen" : "RAND"
+  }, {
+    "id" : "5",
+    "name" : "TEST_EXTENDED_COLUMN",
+    "datatype" : "string",
+    "data_gen" : "RAND"
+  } ],
+  "database" : "DEFAULT",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git a/tool/src/test/resources/test_meta/table/EDW.TEST_CAL_DT.json 
b/tool/src/test/resources/test_meta/table/EDW.TEST_CAL_DT.json
new file mode 100644
index 0000000..1230649
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/EDW.TEST_CAL_DT.json
@@ -0,0 +1,413 @@
+{
+ 
+  "uuid" : "0ff420eb-79ad-40bd-bca9-12d8cd05c60a",
+  "name" : "TEST_CAL_DT",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "CAL_DT",
+    "datatype" : "date",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "YEAR_BEG_DT",
+    "datatype" : "date",
+    "index": "T"
+  }, {
+    "id" : "3",
+    "name" : "QTR_BEG_DT",
+    "datatype" : "date",
+    "index": "T"
+  }, {
+    "id" : "4",
+    "name" : "MONTH_BEG_DT",
+    "datatype" : "date",
+    "index": "T"
+  }, {
+    "id" : "5",
+    "name" : "WEEK_BEG_DT",
+    "datatype" : "date",
+    "index": "T"
+  }, {
+    "id" : "6",
+    "name" : "AGE_FOR_YEAR_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "7",
+    "name" : "AGE_FOR_QTR_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "8",
+    "name" : "AGE_FOR_MONTH_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "9",
+    "name" : "AGE_FOR_WEEK_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "10",
+    "name" : "AGE_FOR_DT_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "11",
+    "name" : "AGE_FOR_RTL_YEAR_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "12",
+    "name" : "AGE_FOR_RTL_QTR_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "13",
+    "name" : "AGE_FOR_RTL_MONTH_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "14",
+    "name" : "AGE_FOR_RTL_WEEK_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "15",
+    "name" : "AGE_FOR_CS_WEEK_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "16",
+    "name" : "DAY_OF_CAL_ID",
+    "datatype" : "int"
+  }, {
+    "id" : "17",
+    "name" : "DAY_OF_YEAR_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "18",
+    "name" : "DAY_OF_QTR_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "19",
+    "name" : "DAY_OF_MONTH_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "20",
+    "name" : "DAY_OF_WEEK_ID",
+    "datatype" : "int"
+  }, {
+    "id" : "21",
+    "name" : "WEEK_OF_YEAR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "22",
+    "name" : "WEEK_OF_CAL_ID",
+    "datatype" : "int"
+  }, {
+    "id" : "23",
+    "name" : "MONTH_OF_QTR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "24",
+    "name" : "MONTH_OF_YEAR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "25",
+    "name" : "MONTH_OF_CAL_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "26",
+    "name" : "QTR_OF_YEAR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "27",
+    "name" : "QTR_OF_CAL_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "28",
+    "name" : "YEAR_OF_CAL_ID",
+    "datatype" : "smallint"
+  }, {
+    "id" : "29",
+    "name" : "YEAR_END_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "30",
+    "name" : "QTR_END_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "31",
+    "name" : "MONTH_END_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "32",
+    "name" : "WEEK_END_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "33",
+    "name" : "CAL_DT_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "34",
+    "name" : "CAL_DT_DESC",
+    "datatype" : "string"
+  }, {
+    "id" : "35",
+    "name" : "CAL_DT_SHORT_NAME",
+    "datatype" : "string"
+  }, {
+    "id" : "36",
+    "name" : "YTD_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "37",
+    "name" : "QTD_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "38",
+    "name" : "MTD_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "39",
+    "name" : "WTD_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "40",
+    "name" : "SEASON_BEG_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "41",
+    "name" : "DAY_IN_YEAR_COUNT",
+    "datatype" : "smallint"
+  }, {
+    "id" : "42",
+    "name" : "DAY_IN_QTR_COUNT",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "43",
+    "name" : "DAY_IN_MONTH_COUNT",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "44",
+    "name" : "DAY_IN_WEEK_COUNT",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "45",
+    "name" : "RTL_YEAR_BEG_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "46",
+    "name" : "RTL_QTR_BEG_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "47",
+    "name" : "RTL_MONTH_BEG_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "48",
+    "name" : "RTL_WEEK_BEG_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "49",
+    "name" : "CS_WEEK_BEG_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "50",
+    "name" : "CAL_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "51",
+    "name" : "DAY_OF_WEEK",
+    "datatype" : "string"
+  }, {
+    "id" : "52",
+    "name" : "MONTH_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "53",
+    "name" : "PRD_DESC",
+    "datatype" : "string"
+  }, {
+    "id" : "54",
+    "name" : "PRD_FLAG",
+    "datatype" : "string"
+  }, {
+    "id" : "55",
+    "name" : "PRD_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "56",
+    "name" : "PRD_IND",
+    "datatype" : "string"
+  }, {
+    "id" : "57",
+    "name" : "QTR_DESC",
+    "datatype" : "string"
+  }, {
+    "id" : "58",
+    "name" : "QTR_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "59",
+    "name" : "QTR_IND",
+    "datatype" : "string"
+  }, {
+    "id" : "60",
+    "name" : "RETAIL_WEEK",
+    "datatype" : "string"
+  }, {
+    "id" : "61",
+    "name" : "RETAIL_YEAR",
+    "datatype" : "string"
+  }, {
+    "id" : "62",
+    "name" : "RETAIL_START_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "63",
+    "name" : "RETAIL_WK_END_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "64",
+    "name" : "WEEK_IND",
+    "datatype" : "string"
+  }, {
+    "id" : "65",
+    "name" : "WEEK_NUM_DESC",
+    "datatype" : "string"
+  }, {
+    "id" : "66",
+    "name" : "WEEK_BEG_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "67",
+    "name" : "WEEK_END_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "68",
+    "name" : "WEEK_IN_YEAR_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "69",
+    "name" : "WEEK_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "70",
+    "name" : "WEEK_BEG_END_DESC_MDY",
+    "datatype" : "string"
+  }, {
+    "id" : "71",
+    "name" : "WEEK_BEG_END_DESC_MD",
+    "datatype" : "string"
+  }, {
+    "id" : "72",
+    "name" : "YEAR_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "73",
+    "name" : "YEAR_IND",
+    "datatype" : "string"
+  }, {
+    "id" : "74",
+    "name" : "CAL_DT_MNS_1YEAR_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "75",
+    "name" : "CAL_DT_MNS_2YEAR_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "76",
+    "name" : "CAL_DT_MNS_1QTR_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "77",
+    "name" : "CAL_DT_MNS_2QTR_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "78",
+    "name" : "CAL_DT_MNS_1MONTH_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "79",
+    "name" : "CAL_DT_MNS_2MONTH_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "80",
+    "name" : "CAL_DT_MNS_1WEEK_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "81",
+    "name" : "CAL_DT_MNS_2WEEK_DT",
+    "datatype" : "string"
+  }, {
+    "id" : "82",
+    "name" : "CURR_CAL_DT_MNS_1YEAR_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "83",
+    "name" : "CURR_CAL_DT_MNS_2YEAR_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "84",
+    "name" : "CURR_CAL_DT_MNS_1QTR_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "85",
+    "name" : "CURR_CAL_DT_MNS_2QTR_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "86",
+    "name" : "CURR_CAL_DT_MNS_1MONTH_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "87",
+    "name" : "CURR_CAL_DT_MNS_2MONTH_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "88",
+    "name" : "CURR_CAL_DT_MNS_1WEEK_YN_IND",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "89",
+    "name" : "CURR_CAL_DT_MNS_2WEEK_YN_IND",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "90",
+    "name" : "RTL_MONTH_OF_RTL_YEAR_ID",
+    "datatype" : "string"
+  }, {
+    "id" : "91",
+    "name" : "RTL_QTR_OF_RTL_YEAR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "92",
+    "name" : "RTL_WEEK_OF_RTL_YEAR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "93",
+    "name" : "SEASON_OF_YEAR_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "94",
+    "name" : "YTM_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "95",
+    "name" : "YTQ_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "96",
+    "name" : "YTW_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "97",
+    "name" : "CAL_DT_CRE_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "98",
+    "name" : "CAL_DT_CRE_USER",
+    "datatype" : "string"
+  }, {
+    "id" : "99",
+    "name" : "CAL_DT_UPD_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "100",
+    "name" : "CAL_DT_UPD_USER",
+    "datatype" : "string"
+  } ],
+  "database" : "edw",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/table/EDW.TEST_SELLER_TYPE_DIM.json 
b/tool/src/test/resources/test_meta/table/EDW.TEST_SELLER_TYPE_DIM.json
new file mode 100644
index 0000000..136ae57
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/EDW.TEST_SELLER_TYPE_DIM.json
@@ -0,0 +1,46 @@
+{
+  "uuid" : "9ecc90c4-55df-436f-8602-2fbd4bca72e1",
+  "name" : "TEST_SELLER_TYPE_DIM",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "SELLER_TYPE_CD",
+    "datatype" : "smallint",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "SELLER_TYPE_DESC",
+    "datatype" : "string"
+  }, {
+    "id" : "3",
+    "name" : "GLBL_RPRT_SLR_SGMNT_CD",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "4",
+    "name" : "SELLER_GROUP_CD",
+    "datatype" : "tinyint",
+    "index": "T"
+  }, {
+    "id" : "5",
+    "name" : "SELLER_GROUP_DESC",
+    "datatype" : "string"
+  }, {
+    "id" : "6",
+    "name" : "DIM_CRE_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "7",
+    "name" : "DIM_CRE_USER",
+    "datatype" : "string"
+  }, {
+    "id" : "8",
+    "name" : "DIM_UPD_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "9",
+    "name" : "DIM_UPD_USER",
+    "datatype" : "string"
+  } ],
+  "database" : "edw",
+  "table_type" : "VIRTUAL_VIEW",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git a/tool/src/test/resources/test_meta/table/EDW.TEST_SITES.json 
b/tool/src/test/resources/test_meta/table/EDW.TEST_SITES.json
new file mode 100644
index 0000000..4c2d727
--- /dev/null
+++ b/tool/src/test/resources/test_meta/table/EDW.TEST_SITES.json
@@ -0,0 +1,51 @@
+{
+ 
+  "uuid" : "338a3325-a947-46d1-9ece-e079b3b8d4a6",
+  "name" : "TEST_SITES",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "SITE_ID",
+    "datatype" : "int",
+    "index": "T"
+  }, {
+    "id" : "2",
+    "name" : "SITE_NAME",
+    "datatype" : "string",
+    "index": "T"
+  }, {
+    "id" : "3",
+    "name" : "SITE_DOMAIN_CODE",
+    "datatype" : "string"
+  }, {
+    "id" : "4",
+    "name" : "DFAULT_LSTG_CURNCY",
+    "datatype" : "int"
+  }, {
+    "id" : "5",
+    "name" : "EOA_EMAIL_CSTMZBL_SITE_YN_ID",
+    "datatype" : "tinyint"
+  }, {
+    "id" : "6",
+    "name" : "SITE_CNTRY_ID",
+    "datatype" : "int",
+    "index": "T"
+  }, {
+    "id" : "7",
+    "name" : "CRE_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "8",
+    "name" : "SITES_UPD_DATE",
+    "datatype" : "string"
+  }, {
+    "id" : "9",
+    "name" : "CRE_USER",
+    "datatype" : "string"
+  }, {
+    "id" : "10",
+    "name" : "SITES_UPD_USER",
+    "datatype" : "string"
+  } ],
+  "database" : "edw",
+  "last_modified" : 0
+}
\ No newline at end of file
diff --git 
a/tool/src/test/resources/test_meta/table_snapshot/DEFAULT.KYLIN_COUNTRY/92456efe-9b79-4385-a5a3-e7f37b677bf7.snapshot
 
b/tool/src/test/resources/test_meta/table_snapshot/DEFAULT.KYLIN_COUNTRY/92456efe-9b79-4385-a5a3-e7f37b677bf7.snapshot
new file mode 100644
index 0000000..58ca104
Binary files /dev/null and 
b/tool/src/test/resources/test_meta/table_snapshot/DEFAULT.KYLIN_COUNTRY/92456efe-9b79-4385-a5a3-e7f37b677bf7.snapshot
 differ
diff --git 
a/tool/src/test/resources/test_meta/table_snapshot/DEFAULT.TEST_COUNTRY/7ecdb07b-a8d0-49d8-892b-fe2dd75512ca.snapshot
 
b/tool/src/test/resources/test_meta/table_snapshot/DEFAULT.TEST_COUNTRY/7ecdb07b-a8d0-49d8-892b-fe2dd75512ca.snapshot
new file mode 100644
index 0000000..4f24fe8
Binary files /dev/null and 
b/tool/src/test/resources/test_meta/table_snapshot/DEFAULT.TEST_COUNTRY/7ecdb07b-a8d0-49d8-892b-fe2dd75512ca.snapshot
 differ

-- 
To stop receiving notification emails like this one, please contact
liy...@apache.org.

Reply via email to