You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2023/07/20 08:41:15 UTC

[kylin] 03/35: KYLIN-5632 fix some unstable ut, add some ignored ut, move some ut to the module of kylin-it

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

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

commit 745f113c08e25481b105eb4105a08857ba7b1ceb
Author: Pengfei Zhan <de...@gmail.com>
AuthorDate: Fri Mar 31 18:08:08 2023 +0800

    KYLIN-5632 fix some unstable ut, add some ignored ut, move some ut to the module of kylin-it
---
 .../cube/model/NDataLoadingRangeManagerTest.java   |  113 +-
 .../kylin/metadata/cube/model/NDataflowTest.java   |   80 +-
 .../apache/kylin/metadata/MetadataPerfTest.java    |    9 +-
 .../org/apache/kylin/newten/ExactlyMatchTest.java  |  183 ++
 .../routing/HeterogeneousSegmentPruningTest.java   |  620 ++++
 .../routing/NDataflowCapabilityCheckerTest.java    |  110 +
 .../query/routing/QueryLayoutChooserTest.java      |  842 +++++
 .../kylin/query/routing/QueryLayoutFilterTest.java |  125 +
 .../query/routing/RealizationChooserTest.java      |  134 +
 .../query/routing/SegmentPruningRuleTest.java      |  356 +++
 .../routing/TableIndexAnswerSelectStarTest.java    |  228 ++
 .../metadata/_global/project/agg_match.json        |    6 +
 .../c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json      |   13 +
 .../c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json      |   50 +
 .../c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json      |   81 +
 .../agg_match/table/DEFAULT.TEST_KYLIN_FACT.json   |   74 +
 .../_global/project/joins_graph_left_or_inner.json |   35 +
 .../b780e4e4-69af-449e-b09f-05c90dfa04b7.json      |   81 +
 .../0db919f3-1359-496c-aab5-b6f3951adc1e.json      |  533 ++++
 .../b780e4e4-69af-449e-b09f-05c90dfa04b7.json      |   40 +
 .../b780e4e4-69af-449e-b09f-05c90dfa04b7.json      |  137 +
 .../table/DEFAULT.TEST_BANK_INCOME.json            |   37 +
 .../table/DEFAULT.TEST_BANK_LOCATION.json          |   31 +
 .../_global/project/multi_partition_date_type.json |   35 +
 .../00a91916-d31e-ed40-b1ba-4a86765072f6.json      | 3148 ++++++++++++++++++
 .../3718b614-5191-2254-77e9-f4c5ca64e309.json      | 1812 +++++++++++
 .../3718b614-5191-2254-77e9-f4c5ca64e310.json      | 1835 +++++++++++
 .../3718b614-5191-2254-77e9-f4c5ca64e311.json      | 1835 +++++++++++
 .../3718b614-5191-2254-77e9-f4c5ca64e312.json      | 1835 +++++++++++
 .../cdf17c7b-18e3-9a09-23d1-4e82b7bc9123.json      | 3347 ++++++++++++++++++++
 .../00a91916-d31e-ed40-b1ba-4a86765072f6.json      |   63 +
 .../3718b614-5191-2254-77e9-f4c5ca64e309.json      |   63 +
 .../3718b614-5191-2254-77e9-f4c5ca64e310.json      |  177 ++
 .../3718b614-5191-2254-77e9-f4c5ca64e311.json      |  177 ++
 .../3718b614-5191-2254-77e9-f4c5ca64e312.json      |  177 ++
 .../cdf17c7b-18e3-9a09-23d1-4e82b7bc9123.json      |   63 +
 .../00a91916-d31e-ed40-b1ba-4a86765072f6.json      |  685 ++++
 .../3718b614-5191-2254-77e9-f4c5ca64e309.json      |  422 +++
 .../3718b614-5191-2254-77e9-f4c5ca64e310.json      |  507 +++
 .../3718b614-5191-2254-77e9-f4c5ca64e311.json      |  507 +++
 .../3718b614-5191-2254-77e9-f4c5ca64e312.json      |  507 +++
 .../cdf17c7b-18e3-9a09-23d1-4e82b7bc9123.json      |  845 +++++
 .../table/TEST_DB.DATE_TIMESTAMP_TABLE.json        |   95 +
 .../table/TEST_DB.TEST_FACT_13_10W.json            |   95 +
 .../table/TEST_DB.TEST_FACT_24_2W.json             |  150 +
 .../table/TEST_DB.TEST_FACT_30_3W.json             |  180 ++
 .../project/tableindex_answer_selectstart.json     |   35 +
 .../baa44f37-8481-e78b-5cac-faa7d76767db.json      |   87 +
 .../c7a44f37-8481-e78b-5cac-faa7d76767db.json      |   87 +
 .../ccb82d81-1497-ca6d-f226-3258a0f0ba4f.json      |  116 +
 .../bad65498-b922-225c-1db7-13de001beba8.json      |   34 +
 .../87d65498-b922-225c-1db7-13de001beba8.json      |   34 +
 .../81b6caa7-50b4-81e9-4d46-0f5f11bfc8a2.json      |   47 +
 .../baa44f37-8481-e78b-5cac-faa7d76767db.json      |   63 +
 .../c7a44f37-8481-e78b-5cac-faa7d76767db.json      |   63 +
 .../ccb82d81-1497-ca6d-f226-3258a0f0ba4f.json      |   84 +
 .../baa44f37-8481-e78b-5cac-faa7d76767db.json      |  270 ++
 .../c7a44f37-8481-e78b-5cac-faa7d76767db.json      |  270 ++
 .../ccb82d81-1497-ca6d-f226-3258a0f0ba4f.json      |  342 ++
 .../table/DEFAULT.KYLIN_SALES.json                 |   98 +
 .../table/DEFAULT.TEST_KYLIN_FACT.json             |   88 +
 .../kylin/rest/service/QueryServiceTest.java       |    9 +-
 .../kylin/query/routing/CandidateSortTest.java     |    8 +-
 .../kylin/query/routing/RealizationCheckTest.java  |   53 -
 .../query/routing/SegmentPruningRuleTest.java}     |   20 +-
 .../kap/secondstorage/SecondStorageTest.scala      |    8 +-
 .../spark/utils/ComputedColumnEvalUtilTest.java    |  117 +-
 .../engine/spark/builder/TestCreateFlatTable.scala |    8 +-
 .../kylin/engine/spark/builder/TestDFChooser.scala |   12 +-
 .../engine/spark/job/TestRDSegmentBuildExec.scala  |    5 +-
 70 files changed, 24235 insertions(+), 201 deletions(-)

diff --git a/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataLoadingRangeManagerTest.java b/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataLoadingRangeManagerTest.java
index dbb5c30287..dad5d97bfc 100644
--- a/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataLoadingRangeManagerTest.java
+++ b/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataLoadingRangeManagerTest.java
@@ -18,16 +18,11 @@
 
 package org.apache.kylin.metadata.cube.model;
 
-import java.io.IOException;
-
 import org.apache.kylin.common.util.DateFormat;
-import org.apache.kylin.metadata.model.SegmentRange;
-import org.apache.kylin.metadata.model.SegmentStatusEnum;
-import org.apache.kylin.metadata.model.Segments;
-import org.apache.kylin.metadata.realization.RealizationStatusEnum;
 import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
 import org.apache.kylin.junit.TimeZoneTestRunner;
 import org.apache.kylin.metadata.model.AutoMergeTimeEnum;
+import org.apache.kylin.metadata.model.SegmentRange;
 import org.apache.kylin.metadata.project.NProjectManager;
 import org.junit.After;
 import org.junit.Assert;
@@ -67,7 +62,7 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testAppendSegRangeErrorCase() throws IOException {
+    public void testAppendSegRangeErrorCase() {
         String tableName = "DEFAULT.TEST_KYLIN_FACT";
         String columnName = "TEST_KYLIN_FACT.CAL_DT";
         NDataLoadingRange dataLoadingRange = new NDataLoadingRange();
@@ -89,7 +84,7 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testCreateAndUpdateDataLoadingRange() throws IOException {
+    public void testCreateAndUpdateDataLoadingRange() {
 
         String tableName = "DEFAULT.TEST_KYLIN_FACT";
         String columnName = "TEST_KYLIN_FACT.CAL_DT";
@@ -97,11 +92,11 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
         dataLoadingRange.setTableName(tableName);
         dataLoadingRange.setColumnName(columnName);
         NDataLoadingRange savedDataLoadingRange = dataLoadingRangeManager.createDataLoadingRange(dataLoadingRange);
-        Assert.assertTrue(savedDataLoadingRange.getProject().equals(DEFAULT_PROJECT));
+        Assert.assertEquals(DEFAULT_PROJECT, savedDataLoadingRange.getProject());
     }
 
     @Test
-    public void testCreateDataLoadingRange_StringColumn() throws IOException {
+    public void testCreateDataLoadingRange_StringColumn() {
 
         String tableName = "DEFAULT.TEST_KYLIN_FACT";
         String columnName = "TEST_KYLIN_FACT.LSTG_FORMAT_NAME";
@@ -111,12 +106,12 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
         dataLoadingRange.setColumnName(columnName);
         NDataLoadingRange savedDataLoadingRange = dataLoadingRangeManager.createDataLoadingRange(dataLoadingRange);
 
-        Assert.assertTrue(savedDataLoadingRange.getProject().equals(DEFAULT_PROJECT));
-        Assert.assertTrue(savedDataLoadingRange.getColumnName().equals(columnName));
+        Assert.assertEquals(DEFAULT_PROJECT, savedDataLoadingRange.getProject());
+        Assert.assertEquals(savedDataLoadingRange.getColumnName(), columnName);
     }
 
     @Test
-    public void testCreateDataLoadingRange_IntegerColumn() throws IOException {
+    public void testCreateDataLoadingRange_IntegerColumn() {
 
         String tableName = "DEFAULT.TEST_KYLIN_FACT";
         String columnName = "TEST_KYLIN_FACT.LEAF_CATEG_ID";
@@ -125,8 +120,8 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
         dataLoadingRange.setPartitionDateFormat("YYYY");
         dataLoadingRange.setColumnName(columnName);
         NDataLoadingRange savedDataLoadingRange = dataLoadingRangeManager.createDataLoadingRange(dataLoadingRange);
-        Assert.assertTrue(savedDataLoadingRange.getProject().equals(DEFAULT_PROJECT));
-        Assert.assertTrue(savedDataLoadingRange.getColumnName().equals(columnName));
+        Assert.assertEquals(DEFAULT_PROJECT, savedDataLoadingRange.getProject());
+        Assert.assertEquals(savedDataLoadingRange.getColumnName(), columnName);
     }
 
     @Test
@@ -260,7 +255,7 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testGetQuerableSegmentRange_NoModel() {
+    public void testGetQueryableSegmentRange_NoModel() {
         String start = "2010-12-24 20:33:39.000";
         String end = "2012-01-04 20:33:39.000";
         val loadingRange = createDataLoadingRange(DateFormat.stringToMillis(start), DateFormat.stringToMillis(end));
@@ -269,90 +264,4 @@ public class NDataLoadingRangeManagerTest extends NLocalFileMetadataTestCase {
         Assert.assertEquals(start, DateFormat.formatToTimeStr(Long.parseLong(range.getStart().toString())));
         Assert.assertEquals(end, DateFormat.formatToTimeStr(Long.parseLong(range.getEnd().toString())));
     }
-
-    @Test
-    public void testGetQuerableSegmentRange_HasModels() {
-        String start = "2010-12-24 20:33:39.000";
-        String end = "2012-01-04 20:33:39.000";
-        removeAllSegments();
-        val segments = new Segments<NDataSegment>();
-        val segments2 = new Segments<NDataSegment>();
-
-        val loadingRange = createDataLoadingRange(DateFormat.stringToMillis(start), DateFormat.stringToMillis(end));
-        val dataflowManager = NDataflowManager.getInstance(getTestConfig(), DEFAULT_PROJECT);
-
-        end = "2011-05-18 09:00:19.000";
-        SegmentRange segmentRange = new SegmentRange.TimePartitionedSegmentRange(DateFormat.stringToMillis(start),
-                DateFormat.stringToMillis(end));
-        NDataflow df = dataflowManager.getDataflowByModelAlias("nmodel_basic");
-        NDataSegment dataSegment = dataflowManager.appendSegment(df, segmentRange);
-        dataSegment.setStatus(SegmentStatusEnum.READY);
-        segments.add(dataSegment);
-
-        segmentRange = new SegmentRange.TimePartitionedSegmentRange(DateFormat.stringToMillis(start),
-                DateFormat.stringToMillis(end));
-        df = dataflowManager.getDataflowByModelAlias("nmodel_basic_inner");
-        dataSegment = dataflowManager.appendSegment(df, segmentRange);
-        dataSegment.setStatus(SegmentStatusEnum.READY);
-        segments2.add(dataSegment);
-
-        start = end;
-        end = "2012-01-04 20:33:39.000";
-        segmentRange = new SegmentRange.TimePartitionedSegmentRange(DateFormat.stringToMillis(start),
-                DateFormat.stringToMillis(end));
-        df = dataflowManager.getDataflowByModelAlias("nmodel_basic");
-        dataSegment = dataflowManager.appendSegment(df, segmentRange);
-        dataSegment.setStatus(SegmentStatusEnum.READY);
-        segments.add(dataSegment);
-
-        segmentRange = new SegmentRange.TimePartitionedSegmentRange(DateFormat.stringToMillis(start),
-                DateFormat.stringToMillis(end));
-        df = dataflowManager.getDataflowByModelAlias("nmodel_basic_inner");
-        dataSegment = dataflowManager.appendSegment(df, segmentRange);
-        dataSegment.setStatus(SegmentStatusEnum.NEW);
-        segments2.add(dataSegment);
-
-        NDataflowUpdate update = new NDataflowUpdate(dataflowManager.getDataflowByModelAlias("nmodel_basic").getUuid());
-        update.setToUpdateSegs(segments.toArray(new NDataSegment[segments.size()]));
-        update.setStatus(RealizationStatusEnum.ONLINE);
-        dataflowManager.updateDataflow(update);
-
-        update = new NDataflowUpdate(dataflowManager.getDataflowByModelAlias("nmodel_basic_inner").getUuid());
-        update.setToUpdateSegs(segments2.toArray(new NDataSegment[segments.size()]));
-        update.setStatus(RealizationStatusEnum.ONLINE);
-        dataflowManager.updateDataflow(update);
-
-        dataflowManager.updateDataflowStatus("abe3bf1a-c4bc-458d-8278-7ea8b00f5e96", RealizationStatusEnum.OFFLINE);
-
-        val range = dataLoadingRangeManager.getQuerableSegmentRange(loadingRange);
-        Assert.assertEquals("2010-12-24 20:33:39.000",
-                DateFormat.formatToTimeStr(Long.parseLong(range.getStart().toString())));
-        Assert.assertEquals("2011-05-18 09:00:19.000",
-                DateFormat.formatToTimeStr(Long.parseLong(range.getEnd().toString())));
-
-        df = dataflowManager.getDataflowByModelAlias("nmodel_basic");
-        val segs = df.getQueryableSegments();
-        Assert.assertEquals(1, segs.size());
-
-        Assert.assertEquals("2010-12-24 20:33:39.000",
-                DateFormat.formatToTimeStr(Long.parseLong(segs.get(0).getSegRange().getStart().toString())));
-        Assert.assertEquals("2011-05-18 09:00:19.000",
-                DateFormat.formatToTimeStr(Long.parseLong(segs.get(0).getSegRange().getEnd().toString())));
-
-    }
-
-    private void removeAllSegments() {
-        NDataflowManager dataflowManager = NDataflowManager.getInstance(getTestConfig(), DEFAULT_PROJECT);
-        NDataflow df = dataflowManager.getDataflowByModelAlias("nmodel_basic");
-        // remove the existed seg
-        NDataflowUpdate update = new NDataflowUpdate(df.getUuid());
-        update.setToRemoveSegs(df.getSegments().toArray(new NDataSegment[0]));
-        dataflowManager.updateDataflow(update);
-
-        df = dataflowManager.getDataflowByModelAlias("nmodel_basic_inner");
-        // remove the existed seg
-        update = new NDataflowUpdate(df.getUuid());
-        update.setToRemoveSegs(df.getSegments().toArray(new NDataSegment[0]));
-        dataflowManager.updateDataflow(update);
-    }
 }
diff --git a/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataflowTest.java b/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataflowTest.java
index c63127a01d..93a691bb64 100644
--- a/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataflowTest.java
+++ b/src/core-metadata/src/test/java/org/apache/kylin/metadata/cube/model/NDataflowTest.java
@@ -20,7 +20,11 @@ package org.apache.kylin.metadata.cube.model;
 
 import java.io.IOException;
 
+import org.apache.kylin.common.util.DateFormat;
 import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
+import org.apache.kylin.guava30.shaded.common.collect.Sets;
+import org.apache.kylin.metadata.model.SegmentRange;
+import org.apache.kylin.metadata.model.SegmentStatusEnum;
 import org.apache.kylin.metadata.model.Segments;
 import org.apache.kylin.metadata.realization.RealizationStatusEnum;
 import org.junit.After;
@@ -29,7 +33,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.springframework.test.util.ReflectionTestUtils;
 
-import org.apache.kylin.guava30.shaded.common.collect.Sets;
 import lombok.val;
 import lombok.var;
 
@@ -201,4 +204,79 @@ public class NDataflowTest extends NLocalFileMetadataTestCase {
         }
     }
 
+    @Test
+    public void testGetQueryableSegmentRange() {
+        removeAllSegments(projectDefault);
+        NDataflowManager dfManager = NDataflowManager.getInstance(getTestConfig(), projectDefault);
+
+        // add two queryable segments
+        {
+            NDataflow df = dfManager.getDataflowByModelAlias("nmodel_basic");
+            Segments<NDataSegment> segments = new Segments<>();
+
+            // segment1~1
+            String start = "2010-12-24 20:33:39.000";
+            String end = "2011-05-18 09:00:19.000";
+            NDataSegment dataSegment = dfManager.appendSegment(df, new SegmentRange.TimePartitionedSegmentRange(
+                    DateFormat.stringToMillis(start), DateFormat.stringToMillis(end)));
+            dataSegment.setStatus(SegmentStatusEnum.READY);
+            segments.add(dataSegment);
+
+            // segment1~2
+            start = end;
+            end = "2012-01-04 20:33:39.000";
+            dataSegment = dfManager.appendSegment(df, new SegmentRange.TimePartitionedSegmentRange(
+                    DateFormat.stringToMillis(start), DateFormat.stringToMillis(end)));
+            dataSegment.setStatus(SegmentStatusEnum.NEW);
+            segments.add(dataSegment);
+
+            // segment1~3
+            start = end;
+            end = "2013-01-04 20:33:39.000";
+            dataSegment = dfManager.appendSegment(df, new SegmentRange.TimePartitionedSegmentRange(
+                    DateFormat.stringToMillis(start), DateFormat.stringToMillis(end)));
+            dataSegment.setStatus(SegmentStatusEnum.WARNING);
+            segments.add(dataSegment);
+
+            NDataflowUpdate update = new NDataflowUpdate(dfManager.getDataflowByModelAlias("nmodel_basic").getUuid());
+            update.setToUpdateSegs(segments.toArray(new NDataSegment[0]));
+            update.setStatus(RealizationStatusEnum.ONLINE);
+            dfManager.updateDataflow(update);
+        }
+
+        // validation
+        NDataflow df = dfManager.getDataflowByModelAlias("nmodel_basic");
+        Segments<NDataSegment> queryableSegments = df.getQueryableSegments();
+        Assert.assertEquals(2, queryableSegments.size());
+
+        NDataSegment segment1 = queryableSegments.get(0);
+        Assert.assertEquals("2010-12-24 20:33:39.000",
+                DateFormat.formatToTimeStr(Long.parseLong(segment1.getSegRange().getStart().toString())));
+        Assert.assertEquals("2011-05-18 09:00:19.000",
+                DateFormat.formatToTimeStr(Long.parseLong(segment1.getSegRange().getEnd().toString())));
+        Assert.assertEquals(SegmentStatusEnum.READY, segment1.getStatus());
+
+        NDataSegment segment2 = queryableSegments.get(1);
+        Assert.assertEquals("2010-12-24 20:33:39.000",
+                DateFormat.formatToTimeStr(Long.parseLong(segment1.getSegRange().getStart().toString())));
+        Assert.assertEquals("2011-05-18 09:00:19.000",
+                DateFormat.formatToTimeStr(Long.parseLong(segment1.getSegRange().getEnd().toString())));
+        Assert.assertEquals(SegmentStatusEnum.READY, segment2.getStatus());
+    }
+
+    private void removeAllSegments(String project) {
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(getTestConfig(), project);
+        NDataflow df = dataflowManager.getDataflowByModelAlias("nmodel_basic");
+        // remove the existed seg
+        NDataflowUpdate update = new NDataflowUpdate(df.getUuid());
+        update.setToRemoveSegs(df.getSegments().toArray(new NDataSegment[0]));
+        dataflowManager.updateDataflow(update);
+
+        df = dataflowManager.getDataflowByModelAlias("nmodel_basic_inner");
+        // remove the existed seg
+        update = new NDataflowUpdate(df.getUuid());
+        update.setToRemoveSegs(df.getSegments().toArray(new NDataSegment[0]));
+        dataflowManager.updateDataflow(update);
+    }
+
 }
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/metadata/MetadataPerfTest.java b/src/kylin-it/src/test/java/org/apache/kylin/metadata/MetadataPerfTest.java
index 9931521e63..76aad2fe8b 100644
--- a/src/kylin-it/src/test/java/org/apache/kylin/metadata/MetadataPerfTest.java
+++ b/src/kylin-it/src/test/java/org/apache/kylin/metadata/MetadataPerfTest.java
@@ -48,6 +48,9 @@ import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
 import org.apache.kylin.common.util.Pair;
 import org.apache.kylin.common.util.RandomUtil;
 import org.apache.kylin.common.util.Unsafe;
+import org.apache.kylin.guava30.shaded.common.base.Joiner;
+import org.apache.kylin.guava30.shaded.common.collect.Lists;
+import org.apache.kylin.guava30.shaded.common.collect.Maps;
 import org.apache.kylin.metadata.cube.model.IndexEntity;
 import org.apache.kylin.metadata.cube.model.IndexPlan;
 import org.apache.kylin.metadata.cube.model.LayoutEntity;
@@ -64,18 +67,12 @@ import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 
-import org.apache.kylin.guava30.shaded.common.base.Joiner;
-import org.apache.kylin.guava30.shaded.common.collect.Lists;
-import org.apache.kylin.guava30.shaded.common.collect.Maps;
-
 import lombok.val;
 import lombok.var;
 import lombok.extern.slf4j.Slf4j;
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/newten/ExactlyMatchTest.java b/src/kylin-it/src/test/java/org/apache/kylin/newten/ExactlyMatchTest.java
new file mode 100644
index 0000000000..da3a40520b
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/newten/ExactlyMatchTest.java
@@ -0,0 +1,183 @@
+/*
+ * 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.newten;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.util.Pair;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.guava30.shaded.common.collect.Lists;
+import org.apache.kylin.job.engine.JobEngineConfig;
+import org.apache.kylin.job.impl.threadpool.NDefaultScheduler;
+import org.apache.kylin.util.ExecAndComp;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SparderEnv;
+import org.apache.spark.sql.catalyst.expressions.Expression;
+import org.apache.spark.sql.catalyst.expressions.In;
+import org.apache.spark.sql.catalyst.plans.logical.Aggregate;
+import org.apache.spark.sql.catalyst.plans.logical.Filter;
+import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import scala.Option;
+import scala.runtime.AbstractFunction1;
+
+public class ExactlyMatchTest extends NLocalWithSparkSessionTest {
+
+    @Before
+    public void setup() throws Exception {
+        overwriteSystemProp("kylin.job.scheduler.poll-interval-second", "1");
+        this.createTestMetadata("src/test/resources/ut_meta/agg_exact_match");
+        NDefaultScheduler scheduler = NDefaultScheduler.getInstance(getProject());
+        scheduler.init(new JobEngineConfig(KylinConfig.getInstanceFromEnv()));
+        if (!scheduler.hasStarted()) {
+            throw new RuntimeException("scheduler has not been started");
+        }
+    }
+
+    @After
+    public void after() throws Exception {
+        NDefaultScheduler.destroyInstance();
+        cleanupTestMetadata();
+    }
+
+    @Override
+    public String getProject() {
+        return "agg_match";
+    }
+
+    @Test
+    public void testInClause() throws Exception {
+        fullBuild("c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e");
+
+        KylinConfig config = KylinConfig.getInstanceFromEnv();
+        populateSSWithCSVData(config, getProject(), SparderEnv.getSparkSession());
+
+        String base = "select count(*) from TEST_KYLIN_FACT ";
+
+        String in1 = base + "where substring(LSTG_FORMAT_NAME, 1, 1) in ('A','F')"
+                + " or substring(LSTG_FORMAT_NAME, 1, 1) in ('O','B')";
+
+        String in2 = base + "where substring(LSTG_FORMAT_NAME, 1, 1) in ('A','F')"
+                + " and substring(LSTG_FORMAT_NAME, 1, 1) in ('O','B')";
+
+        String not_in1 = base + "where substring(LSTG_FORMAT_NAME, 1, 1) not in ('A','F')"
+                + " or substring(LSTG_FORMAT_NAME, 1, 1) not in ('O','B')";
+
+        String not_in2 = base + "where substring(LSTG_FORMAT_NAME, 1, 1) not in ('A','F')"
+                + " or substring(LSTG_FORMAT_NAME, 1, 1) not in ('O','B')";
+
+        overwriteSystemProp("calcite.keep-in-clause", "true");
+        Dataset<Row> df1 = ExecAndComp.queryModelWithoutCompute(getProject(), in1);
+        Dataset<Row> df2 = ExecAndComp.queryModelWithoutCompute(getProject(), in2);
+        Dataset<Row> df3 = ExecAndComp.queryModelWithoutCompute(getProject(), not_in2);
+        Dataset<Row> df4 = ExecAndComp.queryModelWithoutCompute(getProject(), not_in2);
+
+        Assert.assertTrue(existsIn(df1));
+        Assert.assertTrue(existsIn(df2));
+        Assert.assertTrue(existsIn(df3));
+        Assert.assertTrue(existsIn(df4));
+        ArrayList<String> querys = Lists.newArrayList(in1, in2, not_in1, not_in2);
+        ExecAndComp.execAndCompareQueryList(querys, getProject(), ExecAndComp.CompareLevel.SAME, "left");
+
+        overwriteSystemProp("calcite.keep-in-clause", "false");
+        Dataset<Row> df5 = ExecAndComp.queryModelWithoutCompute(getProject(), in1);
+        Dataset<Row> df6 = ExecAndComp.queryModelWithoutCompute(getProject(), in2);
+        Dataset<Row> df7 = ExecAndComp.queryModelWithoutCompute(getProject(), not_in2);
+        Dataset<Row> df8 = ExecAndComp.queryModelWithoutCompute(getProject(), not_in2);
+
+        Assert.assertFalse(existsIn(df5));
+        Assert.assertFalse(existsIn(df6));
+        Assert.assertFalse(existsIn(df7));
+        Assert.assertFalse(existsIn(df8));
+    }
+
+    @Test
+    public void testSkipAgg() throws Exception {
+        fullBuild("c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e");
+
+        KylinConfig config = KylinConfig.getInstanceFromEnv();
+        populateSSWithCSVData(config, getProject(), SparderEnv.getSparkSession());
+
+        String exactly_match1 = "select count (distinct price) as a from TEST_KYLIN_FACT group by TRANS_ID, CAL_DT, LSTG_FORMAT_NAME having count (distinct price)  > 0 ";
+        Dataset<Row> m1 = ExecAndComp.queryModelWithoutCompute(getProject(), exactly_match1);
+        Assert.assertFalse(existsAgg(m1));
+
+        String exactly_match2 = "select count(*) from TEST_KYLIN_FACT group by TRANS_ID, CAL_DT, LSTG_FORMAT_NAME";
+        Dataset<Row> m2 = ExecAndComp.queryModelWithoutCompute(getProject(), exactly_match2);
+        Assert.assertFalse(existsAgg(m2));
+
+        String exactly_match3 = "select LSTG_FORMAT_NAME,sum(price),CAL_DT from TEST_KYLIN_FACT group by TRANS_ID, CAL_DT, LSTG_FORMAT_NAME";
+        Dataset<Row> m3 = ExecAndComp.queryModelWithoutCompute(getProject(), exactly_match3);
+        String[] fieldNames = m3.schema().fieldNames();
+        Assert.assertFalse(existsAgg(m3));
+        Assert.assertTrue(fieldNames[0].contains("LSTG_FORMAT_NAME"));
+        Assert.assertTrue(fieldNames[1].contains("GMV_SUM"));
+        Assert.assertTrue(fieldNames[2].contains("CAL_DT"));
+
+        String exactly_match4 = "select count (distinct price) as a from TEST_KYLIN_FACT group by TRANS_ID, CAL_DT, LSTG_FORMAT_NAME having count (distinct price)  > 0 ";
+        Dataset<Row> m4 = ExecAndComp.queryModelWithoutCompute(getProject(), exactly_match1);
+        Assert.assertFalse(existsAgg(m4));
+        // assert results
+        List<Pair<String, String>> query = new ArrayList<>();
+        query.add(Pair.newPair("", exactly_match3));
+        query.add(Pair.newPair("", exactly_match4));
+        ExecAndComp.execAndCompare(query, getProject(), ExecAndComp.CompareLevel.SAME, "left");
+
+        String not_match1 = "select count(*) from TEST_KYLIN_FACT";
+        Dataset<Row> n1 = ExecAndComp.queryModelWithoutCompute(getProject(), not_match1);
+        Assert.assertTrue(existsAgg(n1));
+    }
+
+    private boolean existsAgg(Dataset<Row> m1) {
+        return !m1.logicalPlan().find(new AbstractFunction1<LogicalPlan, Object>() {
+            @Override
+            public Object apply(LogicalPlan v1) {
+                return v1 instanceof Aggregate;
+            }
+        }).isEmpty();
+    }
+
+    private boolean existsIn(Dataset<Row> m1) {
+        Option<LogicalPlan> option = m1.logicalPlan().find(new AbstractFunction1<LogicalPlan, Object>() {
+            @Override
+            public Object apply(LogicalPlan v1) {
+                return v1 instanceof Filter;
+            }
+        });
+
+        if (option.isDefined()) {
+            Filter filter = (Filter) option.get();
+            return filter.condition().find(new AbstractFunction1<Expression, Object>() {
+                @Override
+                public Object apply(Expression v1) {
+                    return v1 instanceof In;
+                }
+            }).isDefined();
+        } else {
+            return false;
+        }
+    }
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/HeterogeneousSegmentPruningTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/HeterogeneousSegmentPruningTest.java
new file mode 100644
index 0000000000..f568c1b994
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/HeterogeneousSegmentPruningTest.java
@@ -0,0 +1,620 @@
+/*
+ * 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.query.routing;
+
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.util.DateFormat;
+import org.apache.kylin.common.util.Pair;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.guava30.shaded.common.collect.Lists;
+import org.apache.kylin.guava30.shaded.common.collect.Maps;
+import org.apache.kylin.metadata.cube.model.LayoutPartition;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.metadata.cube.model.NDataflowUpdate;
+import org.apache.kylin.metadata.model.NDataModelManager;
+import org.apache.kylin.metadata.realization.NoRealizationFoundException;
+import org.apache.kylin.query.engine.QueryExec;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.util.OlapContextUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+import lombok.val;
+
+public class HeterogeneousSegmentPruningTest extends NLocalWithSparkSessionTest {
+
+    @Test
+    public void testMultiLevelPartitionMapping() throws SqlParseException {
+        val project = "multi_level_partition";
+        val dfId = "747f864b-9721-4b97-acde-0aa8e8656cba";
+        val dfManager = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), project);
+        val dataflowCopy = dfManager.getDataflow(dfId).copy();
+
+        // build a new partition value but without mapping value
+        val newPartition = Lists.<String[]> newArrayList(new String[] { "4" });
+        val expectedRanges = Lists.<Pair<String, String>> newArrayList();
+        val segmentRange1 = Pair.newPair("2012-01-01", "2012-01-02");
+        val segment1Uuid = "8892fa3f-f607-4eec-8159-7c5ae2f16942";
+        val segmentRange2 = Pair.newPair("2012-01-02", "2012-01-03");
+        val segment2Uuid = "d75a822c-788a-4592-a500-cf20186dded1";
+        val segmentRange3 = Pair.newPair("2012-01-03", "2012-01-04");
+        val segment3Uuid = "54eaf96d-6146-45d2-b94e-d5d187f89919";
+        val expectedPartitionMap = Maps.<String, List<Long>> newHashMap();
+        dfManager.appendPartitions(dfId, segment1Uuid, newPartition);
+        dfManager.appendPartitions(dfId, segment2Uuid, newPartition);
+        dfManager.appendPartitions(dfId, segment3Uuid, newPartition);
+        val layout1 = dataflowCopy.getSegment(segment1Uuid).getLayout(1L);
+        val layout2 = dataflowCopy.getSegment(segment2Uuid).getLayout(1L);
+        val layout3 = dataflowCopy.getSegment(segment3Uuid).getLayout(1L);
+        layout1.getMultiPartition().add(new LayoutPartition(4L));
+        layout2.getMultiPartition().add(new LayoutPartition(4L));
+        layout3.getMultiPartition().add(new LayoutPartition(4L));
+        val updateOps = new NDataflowUpdate(dfId);
+        updateOps.setToAddOrUpdateLayouts(layout1, layout2, layout3);
+        dfManager.updateDataflow(updateOps);
+
+        val sqlBase = "select cal_dt, sum(price) from test_kylin_fact inner join test_account on test_kylin_fact.seller_id = test_account.account_id ";
+        val andMappingSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-04' and lstg_format_name = 'FP-non GTC' group by cal_dt";
+        expectedRanges.add(segmentRange1);
+        expectedRanges.add(segmentRange2);
+        expectedRanges.add(segmentRange3);
+        expectedPartitionMap.put(segment1Uuid, Lists.newArrayList(1L, 4L));
+        expectedPartitionMap.put(segment2Uuid, Lists.newArrayList(1L, 4L));
+        expectedPartitionMap.put(segment3Uuid, Lists.newArrayList(1L, 4L));
+        assertPrunedSegmentsRange(project, andMappingSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        val andSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-04' and lstg_site_id = 1 group by cal_dt";
+        expectedPartitionMap.clear();
+        expectedPartitionMap.put(segment1Uuid, Lists.newArrayList(1L));
+        expectedPartitionMap.put(segment2Uuid, Lists.newArrayList(1L));
+        expectedPartitionMap.put(segment3Uuid, Lists.newArrayList(1L));
+        assertPrunedSegmentsRange(project, andSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+    }
+
+    @Test
+    public void testMultiLevelPartitionPruning() throws SqlParseException {
+        // model multi-partition desc
+        // column: LSTG_SITE_ID
+        // partition id: [0, 1, 2, 3]
+        // values: [0, 1, 2, 3]
+        // mapping column: lstg_format_name
+        // value mapping:
+        // 0 - FP-GTC
+        // 1 - FP-non GTC
+        // 2 - ABIN
+        // 3 - Auction
+
+        // segment1 [2012-01-01, 2012-01-02] partition value 0, 1, 2, 3
+        // segment2 [2012-01-02, 2012-01-03] partition value 0, 1, 2
+        // segment3 [2012-01-03, 2012-01-04] partition value 1, 2, 3
+        // segment4 [2012-01-04, 2012-01-05] partition value 0, 1
+        // segment5 [2012-01-05, 2012-01-06] partition value 2, 3
+
+        val project = "multi_level_partition";
+        val dfId = "747f864b-9721-4b97-acde-0aa8e8656cba";
+        val expectedRanges = Lists.<Pair<String, String>> newArrayList();
+        val segmentRange1 = Pair.newPair("2012-01-01", "2012-01-02");
+        val segment1Uuid = "8892fa3f-f607-4eec-8159-7c5ae2f16942";
+        val segmentRange2 = Pair.newPair("2012-01-02", "2012-01-03");
+        val segment2Uuid = "d75a822c-788a-4592-a500-cf20186dded1";
+        val segmentRange3 = Pair.newPair("2012-01-03", "2012-01-04");
+        val segment3Uuid = "54eaf96d-6146-45d2-b94e-d5d187f89919";
+        val segmentRange4 = Pair.newPair("2012-01-04", "2012-01-05");
+        val segment4Uuid = "411f40b9-a80a-4453-90a9-409aac6f7632";
+        val segmentRange5 = Pair.newPair("2012-01-05", "2012-01-06");
+        val segment5Uuid = "a8318597-cb75-416f-8eb8-96ea285dd2b4";
+        val expectedPartitionMap = Maps.<String, List<Long>> newHashMap();
+
+        val sqlBase = "select cal_dt, sum(price) from test_kylin_fact inner join test_account on test_kylin_fact.seller_id = test_account.account_id ";
+
+        // no filter
+        val noFilterSql = sqlBase + "group by cal_dt";
+        expectedRanges.add(segmentRange1);
+        expectedRanges.add(segmentRange2);
+        expectedRanges.add(segmentRange3);
+        expectedRanges.add(segmentRange4);
+        expectedRanges.add(segmentRange5);
+        expectedPartitionMap.put(segment1Uuid, Lists.newArrayList(0L, 1L, 2L, 3L));
+        expectedPartitionMap.put(segment2Uuid, Lists.newArrayList(0L, 1L, 2L));
+        expectedPartitionMap.put(segment3Uuid, Lists.newArrayList(1L, 2L, 3L));
+        expectedPartitionMap.put(segment4Uuid, Lists.newArrayList(0L, 1L));
+        expectedPartitionMap.put(segment5Uuid, Lists.newArrayList(2L, 3L));
+        assertPrunedSegmentsRange(project, noFilterSql, dfId, expectedRanges, 1L, expectedPartitionMap);
+
+        val andSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-04' and lstg_site_id = 1 group by cal_dt";
+        val andMappingSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-04' and lstg_format_name = 'FP-non GTC' group by cal_dt";
+        val andMixSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-04' and lstg_site_id = 1 and lstg_format_name = 'FP-non GTC' group by cal_dt";
+        expectedRanges.clear();
+        expectedRanges.add(segmentRange1);
+        expectedRanges.add(segmentRange2);
+        expectedRanges.add(segmentRange3);
+        expectedPartitionMap.clear();
+        expectedPartitionMap.put(segment1Uuid, Lists.newArrayList(1L));
+        expectedPartitionMap.put(segment2Uuid, Lists.newArrayList(1L));
+        expectedPartitionMap.put(segment3Uuid, Lists.newArrayList(1L));
+        assertPrunedSegmentsRange(project, andSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, andMappingSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, andMixSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+
+        val notInSql0 = sqlBase
+                + "where cal_dt > '2012-01-02' and cal_dt < '2012-01-04' and lstg_site_id not in (0, 2, 3) group by cal_dt";
+        val notInMappingSql0 = sqlBase
+                + "where cal_dt > '2012-01-02' and cal_dt < '2012-01-04' and lstg_format_name not in ('FP-GTC', 'ABIN', 'Auction') group by cal_dt";
+        val notInMixSql0 = sqlBase
+                + "where cal_dt > '2012-01-02' and cal_dt < '2012-01-04' and lstg_site_id not in (0, 2, 3) and lstg_format_name not in ('FP-GTC', 'ABIN', 'Auction') group by cal_dt";
+        expectedRanges.clear();
+        expectedRanges.add(segmentRange2);
+        expectedRanges.add(segmentRange3);
+        expectedPartitionMap.clear();
+        expectedPartitionMap.put(segment2Uuid, Lists.newArrayList(1L));
+        expectedPartitionMap.put(segment3Uuid, Lists.newArrayList(1L));
+        assertPrunedSegmentsRange(project, notInSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, notInMappingSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, notInMixSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+
+        // return empty data case
+        val emptyData = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03' and lstg_site_id = 5 group by cal_dt";
+        val emptyDataMapping = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03' and lstg_format_name = 'not_exist_name' group by cal_dt";
+        val emptyDataMix = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03' and lstg_site_id = 5 and lstg_format_name = 'not_exist_name' group by cal_dt";
+        expectedRanges.clear();
+        expectedPartitionMap.clear();
+        assertPrunedSegmentsRange(project, emptyData, dfId, expectedRanges, -1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, emptyDataMapping, dfId, expectedRanges, -1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, emptyDataMix, dfId, expectedRanges, -1L, expectedPartitionMap);
+
+        // query data out of current built segments range
+        val inSql0 = sqlBase
+                + "where cal_dt > '2011-12-30' and cal_dt < '2012-01-03' and lstg_site_id in (1, 2) group by cal_dt";
+        val inMappingSql0 = sqlBase
+                + "where cal_dt > '2011-12-30' and cal_dt < '2012-01-03' and lstg_format_name in ('FP-non GTC', 'ABIN') group by cal_dt";
+        val inMixSql0 = sqlBase
+                + "where cal_dt > '2011-12-30' and cal_dt < '2012-01-03' and lstg_site_id in (1, 2) and lstg_format_name in ('FP-non GTC', 'ABIN') group by cal_dt";
+        expectedRanges.add(segmentRange1);
+        expectedRanges.add(segmentRange2);
+        expectedPartitionMap.put(segment1Uuid, Lists.newArrayList(1L, 2L));
+        expectedPartitionMap.put(segment2Uuid, Lists.newArrayList(1L, 2L));
+        assertPrunedSegmentsRange(project, inSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, inMappingSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+        assertPrunedSegmentsRange(project, inMixSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+
+        val pushDownSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03' and lstg_site_id = 3 group by cal_dt";
+        assertNoRealizationFound(project, pushDownSql0);
+
+        val pushDownMappingSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03' and lstg_format_name = 'Auction' group by cal_dt";
+        assertNoRealizationFound(project, pushDownMappingSql0);
+
+        val pushDownMixSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03' and lstg_site_id = 3 and lstg_format_name = 'Auction' group by cal_dt";
+        assertNoRealizationFound(project, pushDownMixSql0);
+
+        // return empty result
+        val wrongMapping0 = sqlBase
+                + "where cal_dt between '2012-01-01' and '2012-01-02' and lstg_site_id = 0 and lstg_format_name = 'FP-non GTC' group by cal_dt";
+        assertPrunedSegmentsRange(project, wrongMapping0, dfId, null, -1L, null);
+
+        val orSql0 = sqlBase
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-02' and (lstg_site_id = 0 or lstg_format_name = 'FP-non GTC') group by cal_dt";
+        expectedRanges.clear();
+        expectedPartitionMap.clear();
+        expectedRanges.add(segmentRange1);
+        expectedPartitionMap.put(segment1Uuid, Lists.newArrayList(0L, 1L));
+        assertPrunedSegmentsRange(project, orSql0, dfId, expectedRanges, 1L, expectedPartitionMap);
+    }
+
+    @Test
+    public void testWhenReadySegmentIsEmpty() {
+        val project = "heterogeneous_segment";
+        val sql = "select cal_dt, count(*) from test_kylin_fact "
+                + "inner join test_category_groupings on test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id "
+                + "where cal_dt >= '2012-01-03' and cal_dt < '2012-01-10' group by cal_dt";
+        try {
+            new QueryExec(project, getTestConfig()).executeQuery(sql);
+            Assert.fail();
+        } catch (SQLException ex) {
+            // no ready segments
+            Assert.assertTrue(ex.getCause() instanceof NoRealizationFoundException);
+        }
+
+        try {
+            getTestConfig().setProperty("kylin.query.heterogeneous-segment-enabled", "false");
+            new QueryExec(project, getTestConfig()).executeQuery(sql);
+            Assert.fail();
+        } catch (SQLException ex) {
+            // no ready segments
+            Assert.assertTrue(ex.getCause() instanceof NoRealizationFoundException);
+        }
+    }
+
+    @Test
+    public void testHeterogeneousSegment() throws SqlParseException {
+        // layout 20000000001, table-index
+        // layout 20001, cal_dt & trans_id
+        // layout 10001, cal_dt
+        // layout 1, trans_id
+
+        // segment1 [2012-01-01, 2012-01-02] layout 20000000001, 20001
+        // segment2 [2012-01-02, 2012-01-03] layout 20000000001, 20001, 10001
+        // segment3 [2012-01-03, 2012-01-04] layout 20001, 10001, 1
+        // segment4 [2012-01-04, 2012-01-05] layout 10001, 1
+        // segment5 [2012-01-05, 2012-01-06] layout 20000000001, 20001, 10001, 1
+
+        val project = "heterogeneous_segment";
+        val dfId = "747f864b-9721-4b97-acde-0aa8e8656cba";
+        val expectedRanges = Lists.<Pair<String, String>> newArrayList();
+        val segmentRange1 = Pair.newPair("2012-01-01", "2012-01-02");
+        val segmentRange2 = Pair.newPair("2012-01-02", "2012-01-03");
+        val segmentRange3 = Pair.newPair("2012-01-03", "2012-01-04");
+        val segmentRange4 = Pair.newPair("2012-01-04", "2012-01-05");
+        val segmentRange5 = Pair.newPair("2012-01-05", "2012-01-06");
+        val layout_20000000001 = 20000000001L;
+        val layout_20001 = 20001L;
+        val layout_10001 = 10001L;
+
+        val sql = "select cal_dt, sum(price) from test_kylin_fact inner join test_account on test_kylin_fact.seller_id = test_account.account_id ";
+
+        val no_filter = sql + "group by cal_dt";
+        assertNoRealizationFound(project, no_filter);
+
+        val sql1_date = sql
+                + "where cal_dt = DATE '2012-01-01' or (cal_dt >= DATE '2012-01-02' and cal_dt < DATE '2012-01-04') group by cal_dt";
+        expectedRanges.add(segmentRange1);
+        expectedRanges.add(segmentRange2);
+        expectedRanges.add(segmentRange3);
+        assertPrunedSegmentsRange(project, sql1_date, dfId, expectedRanges, layout_20001, null);
+
+        val sql1_date_string = sql
+                + "where cal_dt = '2012-01-01' or (cal_dt >= '2012-01-02' and cal_dt < '2012-01-04') group by cal_dt";
+        assertPrunedSegmentsRange(project, sql1_date_string, dfId, expectedRanges, layout_20001, null);
+
+        val sql2_date = sql + "where cal_dt >= DATE '2012-01-03' and cal_dt < DATE '2012-01-10' group by cal_dt";
+        expectedRanges.clear();
+        expectedRanges.add(segmentRange3);
+        expectedRanges.add(segmentRange4);
+        expectedRanges.add(segmentRange5);
+        assertPrunedSegmentsRange(project, sql2_date, dfId, expectedRanges, layout_10001, null);
+
+        val sql2_date_string = sql + "where cal_dt >= '2012-01-03' and cal_dt < '2012-01-10' group by cal_dt";
+        assertPrunedSegmentsRange(project, sql2_date_string, dfId, expectedRanges, layout_10001, null);
+
+        // pruned segments do not have capable layout to answer
+        val sql3_no_layout = "select trans_id from test_kylin_fact "
+                + "inner join test_account on test_kylin_fact.seller_id = test_account.account_id "
+                + "where cal_dt > '2012-01-03' and cal_dt < '2012-01-05'";
+        assertNoRealizationFound(project, sql3_no_layout);
+
+        expectedRanges.clear();
+        expectedRanges.add(segmentRange1);
+        expectedRanges.add(segmentRange2);
+        val sql4_table_index = "select trans_id from test_kylin_fact "
+                + "inner join test_account on test_kylin_fact.seller_id = test_account.account_id "
+                + "where cal_dt > '2012-01-01' and cal_dt < '2012-01-03'";
+        assertPrunedSegmentsRange(project, sql4_table_index, dfId, expectedRanges, layout_20000000001, null);
+
+        // pruned segments do not have capable layout to answer
+        val sql5 = "select trans_id, sum(price) "
+                + "from test_kylin_fact inner join test_account on test_kylin_fact.seller_id = test_account.account_id "
+                + "where cal_dt > '2012-01-03' and cal_dt < '2012-01-06' group by trans_id";
+
+        assertNoRealizationFound(project, sql5);
+    }
+
+    // https://olapio.atlassian.net/browse/AL-1357
+    @Test
+    public void testHeterogeneousSegmentFilter() throws SqlParseException {
+        // layout 20000000001, tableindex
+        // layout 20001, cal_dt & trans_id
+        // layout 10001, cal_dt
+        // layout 1, trans_id
+
+        // segment1 [2012-01-01, 2012-01-02] layout 20000000001, 20001
+        // segment2 [2012-01-02, 2012-01-03] layout 20000000001, 20001, 10001
+        // segment3 [2012-01-03, 2012-01-04] layout 20001, 10001, 1
+        // segment4 [2012-01-04, 2012-01-05] layout 10001, 1
+        // segment5 [2012-01-05, 2012-01-06] layout 20000000001, 20001, 10001, 1
+
+        val project = "heterogeneous_segment";
+        val dfId = "747f864b-9721-4b97-acde-0aa8e8656cba";
+        val expectedRanges = Lists.<Pair<String, String>> newArrayList();
+        val segmentRange1 = Pair.newPair("2012-01-01", "2012-01-02");
+        // val segmentRange2 = Pair.newPair("2012-01-02", "2012-01-03")
+        // val segmentRange3 = Pair.newPair("2012-01-03", "2012-01-04")
+        // val segmentRange4 = Pair.newPair("2012-01-04", "2012-01-05")
+        // val segmentRange5 = Pair.newPair("2012-01-05", "2012-01-06")
+
+        val layout_20000000001 = 20000000001L;
+        // val layout_20001 = 20001L
+        // val layout_10001 = 10001L
+        // val layout_1 = 1L
+
+        val sql = "select cal_dt from test_kylin_fact inner join test_account on test_kylin_fact.seller_id = test_account.account_id ";
+
+        val sql1_date = sql + "where cal_dt = DATE '2012-01-01' and test_account.ACCOUNT_SELLER_LEVEL = 1 ";
+        expectedRanges.add(segmentRange1);
+        assertPrunedSegmentsRange(project, sql1_date, dfId, expectedRanges, layout_20000000001, null,
+                "=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),=(DEFAULT.TEST_ACCOUNT.ACCOUNT_SELLER_LEVEL, 1)");
+    }
+
+    // https://olapio.atlassian.net/browse/AL-2878
+    @Test
+    public void testHeterogeneousSegmentFilters() throws SqlParseException {
+        // layout 20000000001, tableindex
+        // layout 20001, cal_dt & trans_id
+        // layout 10001, cal_dt
+        // layout 1, trans_id
+
+        // segment1 [2012-01-01, 2012-01-02] layout 20000000001, 20001
+        // segment2 [2012-01-02, 2012-01-03] layout 20000000001, 20001, 10001
+        // segment3 [2012-01-03, 2012-01-04] layout 20001, 10001, 1
+        // segment4 [2012-01-04, 2012-01-05] layout 10001, 1
+        // segment5 [2012-01-05, 2012-01-06] layout 20000000001, 20001, 10001, 1
+
+        val project = "heterogeneous_segment";
+
+        val sql = "with T1 as (select cal_dt, trans_id \n" + "from test_kylin_fact inner join test_account \n"
+                + "on test_kylin_fact.seller_id = test_account.account_id \n"
+                + "where cal_dt between date'2012-01-01' and date'2012-01-03'\n" + "group by cal_dt, trans_id)\n";
+
+        { // composite filters
+            val sqlFilter = sql + "select * from T1\n"
+                    + "where (cal_dt = DATE'2012-01-01' or (cast(cal_dt as date) = '2012-01-02' or cal_dt = '2012-01-03')) and (cal_dt is not null or cal_dt in ('2012-01-01', '2012-01-02'))";
+            val context = getMatchedContexts(project, sqlFilter).get(0);
+            assertFiltersAndLayout(context, null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03),"
+                            + "OR(=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01), =(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02), =(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03)),"
+                            + "OR(IS NOT NULL(DEFAULT.TEST_KYLIN_FACT.CAL_DT), OR(=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01), =(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02)))");
+        }
+
+        { // invalid filters with or
+            val sqlFilter = sql + "select * from T1\n"
+                    + "where trans_id = 123  or trans_id + 1 = 123 or (trans_id + 2 = 234 and trans_id = 345)";
+            val context = getMatchedContexts(project, sqlFilter).get(0);
+            assertFiltersAndLayout(context, null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03)");
+        }
+
+        { // invalid filters with and
+            val sqlFilter = sql + "select * from T1\n"
+                    + "where trans_id = 123 and (trans_id + 2 = 234 or trans_id = 345)";
+            val context = getMatchedContexts(project, sqlFilter).get(0);
+            assertFiltersAndLayout(context, null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03),"
+                            + "=(DEFAULT.TEST_KYLIN_FACT.TRANS_ID, 123)");
+        }
+
+        { // invalid filters with not
+            val sqlFilter = sql + "select * from T1\n"
+                    + "where trans_id = 123 and (not(trans_id = 234) or trans_id = 345) and (not(trans_id + 1 = 132))";
+            val context = getMatchedContexts(project, sqlFilter).get(0);
+            assertFiltersAndLayout(context, null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03),"
+                            + "=(DEFAULT.TEST_KYLIN_FACT.TRANS_ID, 123),OR(<>(DEFAULT.TEST_KYLIN_FACT.TRANS_ID, 234), =(DEFAULT.TEST_KYLIN_FACT.TRANS_ID, 345))");
+        }
+    }
+
+    // https://olapio.atlassian.net/browse/AL-2878
+    @Test
+    public void testHeterogeneousSegmentFilterPushdownJoin() throws SqlParseException {
+        // layout 20000000001, tableindex
+        // layout 20001, cal_dt & trans_id
+        // layout 10001, cal_dt
+        // layout 1, trans_id
+
+        // segment1 [2012-01-01, 2012-01-02] layout 20000000001, 20001
+        // segment2 [2012-01-02, 2012-01-03] layout 20000000001, 20001, 10001
+        // segment3 [2012-01-03, 2012-01-04] layout 20001, 10001, 1
+        // segment4 [2012-01-04, 2012-01-05] layout 10001, 1
+        // segment5 [2012-01-05, 2012-01-06] layout 20000000001, 20001, 10001, 1
+
+        val project = "heterogeneous_segment";
+        // val dfId = "747f864b-9721-4b97-acde-0aa8e8656cba"
+        val seg1Id = "8892fa3f-f607-4eec-8159-7c5ae2f16942";
+        val seg2Id = "d75a822c-788a-4592-a500-cf20186dded1";
+        // val seg3Id = "54eaf96d-6146-45d2-b94e-d5d187f89919"
+        // val seg4Id = "411f40b9-a80a-4453-90a9-409aac6f7632"
+        // val seg5Id = "a8318597-cb75-416f-8eb8-96ea285dd2b4"
+        // 
+        val sql = "with T1 as (select cal_dt, trans_id \n" + "from test_kylin_fact inner join test_account \n"
+                + "on test_kylin_fact.seller_id = test_account.account_id \n"
+                + "where cal_dt between date'2012-01-01' and date'2012-01-03'\n" + "group by cal_dt, trans_id),\n"
+                + "T2 as (\n" + "select cal_dt \n" + "from test_kylin_fact inner join test_account \n"
+                + "on test_kylin_fact.seller_id = test_account.account_id \n"
+                + "where cal_dt between date'2012-01-01' and date'2012-01-02'\n" + "group by cal_dt\n" + ")\n";
+
+        { // inner join
+            val sqlInnerJoin = sql + " select * from T1 inner join T2 on T1.cal_dt = T2.cal_dt \n"
+                    + " where T1.cal_dt = '2012-01-01' and T2.cal_dt = DATE '2012-01-02'";
+            val contexts = getMatchedContexts(project, sqlInnerJoin);
+            assertFiltersAndLayout(contexts.get(0), seg1Id,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03),=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01)");
+            assertFiltersAndLayout(contexts.get(1), seg2Id,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02),=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02)");
+        }
+
+        { // left join
+            val sqlLeftJoin = sql + " select * from T1 left join T2 on T1.cal_dt = T2.cal_dt \n"
+                    + " where T1.cal_dt = DATE '2012-01-01' and T2.cal_dt = DATE '2012-01-02'";
+            val contexts = getMatchedContexts(project, sqlLeftJoin);
+            assertFiltersAndLayout(contexts.get(0), seg1Id,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03),=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01)");
+            assertFiltersAndLayout(contexts.get(1), null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02)");
+        }
+
+        { // right join
+            val sqlRightJoin = sql + " select * from T1 right join T2 on T1.cal_dt = T2.cal_dt \n"
+                    + " where T1.cal_dt = DATE '2012-01-01' and T2.cal_dt = DATE '2012-01-02'";
+            val contexts = getMatchedContexts(project, sqlRightJoin);
+            assertFiltersAndLayout(contexts.get(0), seg2Id,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02),=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02)");
+            assertFiltersAndLayout(contexts.get(1), null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03)");
+        }
+
+        { // full join
+            val sqlFullJoin = sql + " select * from T1 full join T2 on T1.cal_dt = T2.cal_dt \n"
+                    + " where T1.cal_dt = DATE '2012-01-01' and T2.cal_dt = DATE '2012-01-02'";
+            val contexts = getMatchedContexts(project, sqlFullJoin);
+            assertFiltersAndLayout(contexts.get(0), null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03)");
+            assertFiltersAndLayout(contexts.get(1), null,
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-02)");
+        }
+    }
+
+    @Test
+    public void testHeterogeneousSegmentFilterConditionLimit() throws SqlParseException {
+        // layout 20000000001, tableindex
+        // layout 20001, cal_dt & trans_id
+        // layout 10001, cal_dt
+        // layout 1, trans_id
+
+        // segment1 [2012-01-01, 2012-01-02] layout 20000000001, 20001
+        // segment2 [2012-01-02, 2012-01-03] layout 20000000001, 20001, 10001
+        // segment3 [2012-01-03, 2012-01-04] layout 20001, 10001, 1
+        // segment4 [2012-01-04, 2012-01-05] layout 10001, 1
+        // segment5 [2012-01-05, 2012-01-06] layout 20000000001, 20001, 10001, 1
+
+        val project = "heterogeneous_segment";
+        // val dfId = "747f864b-9721-4b97-acde-0aa8e8656cba"
+        // val seg1Id = "8892fa3f-f607-4eec-8159-7c5ae2f16942"
+        // val seg2Id = "d75a822c-788a-4592-a500-cf20186dded1"
+        // val seg3Id = "54eaf96d-6146-45d2-b94e-d5d187f89919"
+        // val seg4Id = "411f40b9-a80a-4453-90a9-409aac6f7632"
+        // val seg5Id = "a8318597-cb75-416f-8eb8-96ea285dd2b4"
+        // 
+        val sql = "with T1 as (select cal_dt, trans_id \n" + "from test_kylin_fact inner join test_account \n"
+                + "on test_kylin_fact.seller_id = test_account.account_id \n"
+                + "where cal_dt between date'2012-01-01' and date'2012-01-03'\n" + "group by cal_dt, trans_id)\n";
+
+        {
+            val sqlWithTooManyOrs = sql + " select * from T1 where " + "(cal_dt='2012-01-01' and trans_id = 1) or \n"
+                    + "(cal_dt='2012-01-01' and trans_id = 2) or\n" + "(cal_dt='2012-01-01' and trans_id = 3) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 4) or\n" + "(cal_dt='2012-01-01' and trans_id = 5) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 6) or\n" + "(cal_dt='2012-01-01' and trans_id = 7) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 8) or\n" + "(cal_dt='2012-01-01' and trans_id = 9) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 10) or\n" + "(cal_dt='2012-01-01' and trans_id = 12) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 13) or\n" + "(cal_dt='2012-01-01' and trans_id = 14) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 15) or\n" + "(cal_dt='2012-01-01' and trans_id = 16) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 17) or\n" + "(cal_dt='2012-01-01' and trans_id = 18) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 19) or\n" + "(cal_dt='2012-01-01' and trans_id = 20)";
+            val contexts = getMatchedContexts(project, sqlWithTooManyOrs);
+            Assert.assertEquals(
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03)",
+                    contexts.get(0).getExpandedFilterConditions().stream().map(RexNode::toString)
+                            .collect(Collectors.joining(",")));
+        }
+
+        {
+            val sqlWithFilter = sql + " select * from T1 where " + "(cal_dt='2012-01-01' and trans_id = 1) or \n"
+                    + "(cal_dt='2012-01-01' and trans_id = 2) or\n" + "(cal_dt='2012-01-01' and trans_id = 3) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 4) or\n" + "(cal_dt='2012-01-01' and trans_id = 5) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 6) or\n" + "(cal_dt='2012-01-01' and trans_id = 7) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 8) or\n" + "(cal_dt='2012-01-01' and trans_id = 9) or\n"
+                    + "(cal_dt='2012-01-01' and trans_id = 10)";
+            val contexts = getMatchedContexts(project, sqlWithFilter);
+            Assert.assertNotEquals(
+                    ">=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-01),<=(DEFAULT.TEST_KYLIN_FACT.CAL_DT, 2012-01-03)",
+                    contexts.get(0).getExpandedFilterConditions().stream().map(RexNode::toString)
+                            .collect(Collectors.joining(",")));
+        }
+
+    }
+
+    private List<OLAPContext> getMatchedContexts(String project, String sql) throws SqlParseException {
+        return OlapContextUtil.getOlapContexts(project, sql);
+    }
+
+    private void assertFiltersAndLayout(OLAPContext context, String segId, String expectedFilterCond) {
+        if (segId != null) {
+            Assert.assertEquals(segId, context.storageContext.getPrunedSegments().get(0).getId());
+        }
+        if (expectedFilterCond != null) {
+            Assert.assertEquals(expectedFilterCond, context.getExpandedFilterConditions().stream()
+                    .map(RexNode::toString).collect(Collectors.joining(",")));
+        }
+    }
+
+    private void assertNoRealizationFound(String project, String sql) throws SqlParseException {
+        val context = getMatchedContexts(project, sql).get(0);
+        Assert.assertNull(context.realization);
+    }
+
+    private void assertPrunedSegmentsRange(String project, String sql, String dfId,
+            List<Pair<String, String>> expectedRanges, long expectedLayoutId,
+            Map<String, List<Long>> expectedPartitions) throws SqlParseException {
+        assertPrunedSegmentsRange(project, sql, dfId, expectedRanges, expectedLayoutId, expectedPartitions, null);
+    }
+
+    private void assertPrunedSegmentsRange(String project, String sql, String dfId,
+            List<Pair<String, String>> expectedRanges, long expectedLayoutId,
+            Map<String, List<Long>> expectedPartitions, String expectedFilterCond) throws SqlParseException {
+        val context = getMatchedContexts(project, sql).get(0);
+
+        if (expectedLayoutId == -1L) {
+            Assert.assertTrue(context.storageContext.isEmptyLayout());
+            Assert.assertEquals(Long.valueOf(-1), context.storageContext.getLayoutId());
+            return;
+        }
+
+        Assert.assertNotNull(context.realization);
+        val prunedSegments = context.storageContext.getPrunedSegments();
+        val prunedPartitions = context.storageContext.getPrunedPartitions();
+        val candidate = context.storageContext.getCandidate();
+        Assert.assertEquals(expectedRanges.size(), prunedSegments.size());
+        Assert.assertEquals(expectedLayoutId, candidate.getLayoutEntity().getId());
+
+        val model = NDataModelManager.getInstance(getTestConfig(), project).getDataModelDesc(dfId);
+        val partitionColDateFormat = model.getPartitionDesc().getPartitionDateFormat();
+        for (int i = 0; i < prunedSegments.size(); i++) {
+            val segment = prunedSegments.get(i);
+            val start = DateFormat.formatToDateStr(segment.getTSRange().getStart(), partitionColDateFormat);
+            val end = DateFormat.formatToDateStr(segment.getTSRange().getEnd(), partitionColDateFormat);
+            val expectedRange = expectedRanges.get(i);
+            Assert.assertEquals(expectedRange.getFirst(), start);
+            Assert.assertEquals(expectedRange.getSecond(), end);
+
+            // assert multi-partition
+            if (expectedPartitions == null)
+                continue;
+            Assert.assertEquals(expectedPartitions.size(), prunedPartitions.size());
+            Assert.assertEquals(expectedPartitions.get(segment.getId()), prunedPartitions.get(segment.getId()));
+        }
+
+        if (expectedFilterCond != null) {
+            Assert.assertEquals(expectedFilterCond, context.getExpandedFilterConditions().stream()
+                    .map(RexNode::toString).collect(Collectors.joining(",")));
+        }
+    }
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/NDataflowCapabilityCheckerTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/NDataflowCapabilityCheckerTest.java
new file mode 100644
index 0000000000..b5782823c2
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/NDataflowCapabilityCheckerTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.query.routing;
+
+import java.util.Map;
+
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.metadata.cube.cuboid.NLookupCandidate;
+import org.apache.kylin.metadata.cube.model.NDataSegment;
+import org.apache.kylin.metadata.cube.model.NDataflow;
+import org.apache.kylin.metadata.cube.model.NDataflowCapabilityChecker;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.metadata.cube.model.NDataflowUpdate;
+import org.apache.kylin.metadata.model.NTableMetadataManager;
+import org.apache.kylin.metadata.realization.CapabilityResult;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.util.OlapContextUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NDataflowCapabilityCheckerTest extends NLocalWithSparkSessionTest {
+
+    @Test
+    public void testCapabilityResult() throws SqlParseException {
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("abe3bf1a-c4bc-458d-8278-7ea8b00f5e96");
+        String sql = "SELECT seller_ID FROM TEST_KYLIN_FACT LEFT JOIN TEST_ACCOUNT ON SELLER_ID = ACCOUNT_ID";
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+        CapabilityResult result = NDataflowCapabilityChecker.check(dataflow, dataflow.getQueryableSegments(),
+                olapContext.getSQLDigest(), null);
+        Assert.assertNotNull(result);
+        Assert.assertEquals((int) result.getSelectedCandidate().getCost(), result.cost);
+    }
+
+    @Test
+    public void testLookupMatch() throws SqlParseException {
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("89af4ee2-2cdb-4b07-b39e-4c29856309aa");
+
+        // prepare table desc snapshot path
+        NTableMetadataManager.getInstance(dataflow.getConfig(), dataflow.getProject()).getTableDesc("EDW.TEST_SITES")
+                .setLastSnapshotPath("default/table_snapshot/EDW.TEST_SITES/c1e8096e-4e7f-4387-b7c3-5147c1ce38d6");
+
+        // case 1. raw-query answered by Lookup
+        {
+            String sql = "select SITE_ID from EDW.TEST_SITES";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            CapabilityResult result = NDataflowCapabilityChecker.check(dataflow, dataflow.getQueryableSegments(),
+                    olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(result);
+            Assert.assertTrue(result.getSelectedCandidate() instanceof NLookupCandidate);
+            Assert.assertFalse(olapContext.getSQLDigest().allColumns.isEmpty());
+            Assert.assertEquals(1, olapContext.getSQLDigest().allColumns.size());
+        }
+
+        // case 2. aggregate-query answered by lookup
+        {
+            String sql = "select sum(SITE_ID) from EDW.TEST_SITES";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            CapabilityResult result = NDataflowCapabilityChecker.check(dataflow, dataflow.getQueryableSegments(),
+                    olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(result);
+            Assert.assertTrue(result.getSelectedCandidate() instanceof NLookupCandidate);
+            Assert.assertFalse(olapContext.getSQLDigest().allColumns.isEmpty());
+            Assert.assertEquals(1, olapContext.getSQLDigest().allColumns.size());
+        }
+
+        {
+            // case 3. cannot answer when there are no ready segment
+            String sql = "select sum(SITE_ID) from EDW.TEST_SITES";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            removeAllSegments(dataflow);
+            dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                    .getDataflow("89af4ee2-2cdb-4b07-b39e-4c29856309aa");
+            CapabilityResult result = NDataflowCapabilityChecker.check(dataflow, dataflow.getQueryableSegments(),
+                    olapContext.getSQLDigest(), null);
+            Assert.assertFalse(result.isCapable());
+        }
+    }
+
+    private void removeAllSegments(NDataflow dataflow) {
+        NDataflowUpdate dataflowUpdate = new NDataflowUpdate(dataflow.getUuid());
+        dataflowUpdate.setToRemoveSegs(dataflow.getSegments().toArray(new NDataSegment[0]));
+        NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject()).updateDataflow(dataflowUpdate);
+    }
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/QueryLayoutChooserTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/QueryLayoutChooserTest.java
new file mode 100644
index 0000000000..42c464a8e4
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/QueryLayoutChooserTest.java
@@ -0,0 +1,842 @@
+/*
+ * 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.query.routing;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.guava30.shaded.common.collect.ImmutableList;
+import org.apache.kylin.guava30.shaded.common.collect.Lists;
+import org.apache.kylin.metadata.cube.cuboid.NLayoutCandidate;
+import org.apache.kylin.metadata.cube.cuboid.NQueryLayoutChooser;
+import org.apache.kylin.metadata.cube.model.IndexEntity;
+import org.apache.kylin.metadata.cube.model.LayoutEntity;
+import org.apache.kylin.metadata.cube.model.NDataLayout;
+import org.apache.kylin.metadata.cube.model.NDataSegDetails;
+import org.apache.kylin.metadata.cube.model.NDataSegment;
+import org.apache.kylin.metadata.cube.model.NDataflow;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.metadata.cube.model.NDataflowUpdate;
+import org.apache.kylin.metadata.cube.model.NIndexPlanManager;
+import org.apache.kylin.metadata.model.ColumnDesc;
+import org.apache.kylin.metadata.model.NDataModel;
+import org.apache.kylin.metadata.model.NTableMetadataManager;
+import org.apache.kylin.metadata.model.TableDesc;
+import org.apache.kylin.metadata.model.TableExtDesc;
+import org.apache.kylin.metadata.project.EnhancedUnitOfWork;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.util.MetadataTestUtils;
+import org.apache.kylin.util.OlapContextUtil;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class QueryLayoutChooserTest extends NLocalWithSparkSessionTest {
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @After
+    public void teardown() throws Exception {
+        super.tearDown();
+    }
+
+    @Test
+    public void testCCNullChecking() throws SqlParseException {
+        // match aggIndex - null in group by cols
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(getTestConfig(), getProject());
+        {
+            String sql = "select distinct DEAL_AMOUNT from test_kylin_fact \n";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+
+            // model with computedColumns
+            String modelWithCCId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+            NDataflow dataflow = dataflowManager.getDataflow(modelWithCCId);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+
+            // model without computedColumns
+            String modelWithNoCCId = "abe3bf1a-c4bc-458d-8278-7ea8b00f5e96";
+            NDataflow dataflowNoCC = dataflowManager.getDataflow(modelWithNoCCId);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflowNoCC,
+                    dataflowNoCC.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNull(layoutCandidate);
+        }
+
+        // match aggIndex - null in agg col
+        {
+            String sql = "select sum(DEAL_AMOUNT) from test_kylin_fact \n";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+
+            // model with computedColumns
+            String modelWithCCId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+            NDataflow dataflow = dataflowManager.getDataflow(modelWithCCId);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+
+            // model without computedColumns
+            String modelWithNoCCId = "abe3bf1a-c4bc-458d-8278-7ea8b00f5e96";
+            NDataflow dataflowNoCC = dataflowManager.getDataflow(modelWithNoCCId);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflowNoCC,
+                    dataflowNoCC.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNull(layoutCandidate);
+        }
+
+        // match tableIndex
+        {
+            String sql = "select DEAL_AMOUNT from test_kylin_fact \n";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+
+            // model with computedColumns
+            String modelWithCCId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+            NDataflow dataflow = dataflowManager.getDataflow(modelWithCCId);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+
+            // model without computedColumns
+            String modelWithNoCCId = "abe3bf1a-c4bc-458d-8278-7ea8b00f5e96";
+            NDataflow dataflowNoCC = dataflowManager.getDataflow(modelWithNoCCId);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflowNoCC,
+                    dataflowNoCC.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNull(layoutCandidate);
+        }
+    }
+
+    @Test
+    public void testSelectIndexInOneModel() throws SqlParseException {
+        // prepare metadata
+        String modelId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+        EnhancedUnitOfWork.doInTransactionWithCheckAndRetry(() -> {
+            NDataflowManager dataflowManager = NDataflowManager.getInstance(getTestConfig(), getProject());
+            NDataSegDetails segDetails = dataflowManager.getDataflow(modelId).getLatestReadySegment().getSegDetails();
+            NDataLayout lowestCostLayout = NDataLayout.newDataLayout(segDetails, 10001L);
+            lowestCostLayout.setRows(1000L);
+
+            // update
+            NDataflowUpdate dataflowUpdate = new NDataflowUpdate(modelId);
+            dataflowUpdate.setToAddOrUpdateLayouts(lowestCostLayout);
+            dataflowManager.updateDataflow(dataflowUpdate);
+            return null;
+        }, getProject());
+
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+        // 1. test match aggIndex
+        {
+            String sql = "select CAL_DT, count(price) as GMV from test_kylin_fact \n"
+                    + " where CAL_DT='2012-01-10' group by CAL_DT ";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(10001L, layoutCandidate.getLayoutEntity().getId());
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+            Assert.assertEquals(1000.0D, layoutCandidate.getCost(), 0.01);
+        }
+
+        // 2. tableIndex match
+        {
+            String sql = "select CAL_DT from test_kylin_fact where CAL_DT='2012-01-10'";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertTrue(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+    }
+
+    /**
+     * This method used for validating the logic of NQueryLayoutChooser#filterColumnComparator.
+     */
+    @Test
+    public void testFilterColsAffectIndexSelection() throws SqlParseException {
+        // prepare metadata
+        String modelId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+        cleanAlreadyExistingLayoutsInSegments(modelId);
+        addDesiredLayoutsToIndexPlanAndSegments(getProject(), modelId);
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+
+        {
+            String sql = "select CAL_DT, TRANS_ID, count(*) as GMV from test_kylin_fact \n"
+                    + " where CAL_DT='2012-01-10' and TRANS_ID > 10000 group by CAL_DT, TRANS_ID ";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(1010001, layoutCandidate.getLayoutEntity().getId());
+        }
+
+        {
+            String sql = "select CAL_DT, TRANS_ID, count(*) as GMV from test_kylin_fact \n"
+                    + " where CAL_DT > '2012-01-10' and TRANS_ID = 10000 group by CAL_DT, TRANS_ID ";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(1010002, layoutCandidate.getLayoutEntity().getId());
+        }
+
+        // same filter level, select the col with the smallest cardinality
+        {
+            String sql = "select CAL_DT, TRANS_ID, count(*) as GMV from test_kylin_fact \n"
+                    + " where CAL_DT = '2012-01-10' and TRANS_ID = 10000 group by CAL_DT, TRANS_ID ";
+            mockTableStats();
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(1010002, layoutCandidate.getLayoutEntity().getId());
+        }
+    }
+
+    private void addDesiredLayoutsToIndexPlanAndSegments(String project, String modelId) {
+        EnhancedUnitOfWork.doInTransactionWithCheckAndRetry(() -> {
+            NIndexPlanManager indexMgr = NIndexPlanManager.getInstance(getTestConfig(), project);
+            indexMgr.updateIndexPlan(modelId, copyForWrite -> {
+                // prepare one index with three layouts have different colOrder
+                IndexEntity oneIndex = new IndexEntity();
+                long nextAggregationIndexId = copyForWrite.getNextAggregationIndexId();
+                oneIndex.setId(nextAggregationIndexId);
+                oneIndex.setDimensions(Lists.newArrayList(1, 2, 3));
+                oneIndex.setMeasures(Lists.newArrayList(100000));
+                LayoutEntity newLayout1 = new LayoutEntity();
+                newLayout1.setId(oneIndex.getId() + 1);
+                newLayout1.setAuto(true);
+                newLayout1.setColOrder(Lists.newArrayList(2, 1, 3, 100000));
+                LayoutEntity newLayout2 = new LayoutEntity();
+                newLayout2.setId(oneIndex.getId() + 2);
+                newLayout2.setAuto(true);
+                newLayout2.setColOrder(Lists.newArrayList(1, 2, 3, 100000));
+                oneIndex.setLayouts(Lists.newArrayList(newLayout1, newLayout2));
+
+                // prepare another index
+                IndexEntity anotherIndex = new IndexEntity();
+                anotherIndex.setId(nextAggregationIndexId + IndexEntity.INDEX_ID_STEP);
+                anotherIndex.setDimensions(Lists.newArrayList(1, 2, 3, 4));
+                anotherIndex.setMeasures(Lists.newArrayList(100000));
+                LayoutEntity newLayout = new LayoutEntity();
+                newLayout.setId(anotherIndex.getId() + 1);
+                newLayout.setAuto(true);
+                newLayout.setColOrder(Lists.newArrayList(2, 1, 3, 4, 100000));
+                anotherIndex.setLayouts(Lists.newArrayList(newLayout));
+
+                // add two indexes to the IndexPlan
+                List<IndexEntity> indexes = copyForWrite.getIndexes();
+                indexes.add(oneIndex);
+                indexes.add(anotherIndex);
+            });
+
+            NDataflowManager dfMgr = NDataflowManager.getInstance(getTestConfig(), getProject());
+            NDataSegment latestSegment = dfMgr.getDataflow(modelId).getLatestReadySegment();
+            NDataflowUpdate dataflowUpdate = new NDataflowUpdate(modelId);
+            NDataLayout layout1 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1010001L);
+            layout1.setRows(1000L);
+            NDataLayout layout2 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1010002L);
+            layout2.setRows(1000L);
+            NDataLayout layout3 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1020001L);
+            layout3.setRows(1000L);
+            dataflowUpdate.setToAddOrUpdateLayouts(layout1, layout2, layout3);
+            dfMgr.updateDataflow(dataflowUpdate);
+            return null;
+        }, project);
+    }
+
+    @Test
+    public void testDerivedColsSelection() throws SqlParseException {
+        // prepare metadata
+        String modelId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+        cleanAlreadyExistingLayoutsInSegments(modelId);
+        mockDerivedIndex(getProject(), modelId);
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+
+        String sql = "select test_kylin_fact.lstg_format_name, META_CATEG_NAME, count(*) as TRANS_CNT \n"
+                + " from test_kylin_fact \n" //
+                + "left JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt\n" //
+                + " left JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id "
+                + "AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id\n"
+                + " left JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id\n"
+                + " group by test_kylin_fact.lstg_format_name, META_CATEG_NAME";
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(1010001L, layoutCandidate.getLayoutEntity().getId());
+    }
+
+    private void mockDerivedIndex(String project, String modelId) {
+        EnhancedUnitOfWork.doInTransactionWithCheckAndRetry(() -> {
+            NIndexPlanManager indexMgr = NIndexPlanManager.getInstance(getTestConfig(), project);
+            indexMgr.updateIndexPlan(modelId, copyForWrite -> {
+                // one index
+                IndexEntity oneIndex = new IndexEntity();
+                long nextAggregationIndexId = copyForWrite.getNextAggregationIndexId();
+                oneIndex.setId(nextAggregationIndexId);
+                oneIndex.setDimensions(Lists.newArrayList(1, 3, 4, 5, 8));
+                oneIndex.setMeasures(Lists.newArrayList(100000));
+                LayoutEntity newLayout1 = new LayoutEntity();
+                newLayout1.setId(oneIndex.getId() + 1);
+                newLayout1.setAuto(true);
+                newLayout1.setColOrder(Lists.newArrayList(3, 1, 5, 4, 8, 100000));
+                oneIndex.setLayouts(Lists.newArrayList(newLayout1));
+
+                // another index
+                IndexEntity anotherIndex = new IndexEntity();
+                anotherIndex.setId(nextAggregationIndexId + IndexEntity.INDEX_ID_STEP);
+                anotherIndex.setDimensions(Lists.newArrayList(1, 3, 4, 8));
+                anotherIndex.setMeasures(Lists.newArrayList(100000));
+                LayoutEntity newLayout2 = new LayoutEntity();
+                newLayout2.setId(anotherIndex.getId() + 1);
+                newLayout2.setAuto(true);
+                newLayout2.setColOrder(Lists.newArrayList(3, 1, 4, 8, 100000));
+                anotherIndex.setLayouts(Lists.newArrayList(newLayout2));
+
+                // add two indexes
+                List<IndexEntity> indexes = copyForWrite.getIndexes();
+                indexes.add(oneIndex);
+                indexes.add(anotherIndex);
+            });
+
+            NDataflowManager dfMgr = NDataflowManager.getInstance(getTestConfig(), getProject());
+            NDataflowUpdate dataflowUpdate = new NDataflowUpdate(modelId);
+            NDataSegment latestSegment = dfMgr.getDataflow(modelId).getLatestReadySegment();
+            NDataLayout layout1 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1010001L);
+            layout1.setRows(1000L);
+            NDataLayout layout2 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1020001L);
+            layout2.setRows(1000L);
+            dataflowUpdate.setToAddOrUpdateLayouts(layout1, layout2);
+            dfMgr.updateDataflow(dataflowUpdate);
+            return null;
+        }, project);
+    }
+
+    @Test
+    public void testDerivedDimWhenModelHasMultipleSameDimTable() throws SqlParseException {
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject())
+                .getDataflow("abe3bf1a-c4bc-458d-8278-7ea8b00f5e96");
+
+        // prepare table desc snapshot path
+        NTableMetadataManager tblMgr = NTableMetadataManager.getInstance(dataflow.getConfig(), dataflow.getProject());
+        TableDesc tableDesc = tblMgr.getTableDesc("DEFAULT.TEST_ACCOUNT");
+        tableDesc.setLastSnapshotPath(
+                "default/table_snapshot/DEFAULT.TEST_ACCOUNT/d6ba492b-13bf-444d-b6e3-71bfa903344d");
+
+        String sql = "select b.ACCOUNT_BUYER_LEVEL from \"DEFAULT\".\"TEST_KYLIN_FACT\" a\n"
+                + "left join \"DEFAULT\".\"TEST_ACCOUNT\" b on a.SELLER_ID = b.ACCOUNT_ID";
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(20000000001L, layoutCandidate.getLayoutEntity().getId());
+    }
+
+    @Test
+    public void testSumExprWithAggPushDownEnabled() throws SqlParseException {
+        getTestConfig().setProperty("kylin.query.convert-sum-expression-enabled", "true");
+        String modelId = "d67bf0e4-30f4-9248-2528-52daa80be91a";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+        String sql = "select  sum( " //
+                + "( case  when (  case when (lineorder.lo_orderdate = t0.x_measure__0) then true\n"
+                + " when not (lineorder.lo_orderdate = t0.x_measure__0) then false\n" //
+                + " else null end ) then lineorder.lo_quantity\n" //
+                + " else cast(null as integer)  end  )  ) as sum_lo_quantity_sum______88\n" //
+                + "from  ssb.lineorder lineorder  cross join (\n" //
+                + " select  max(lineorder.lo_orderdate) as x_measure__0\n" //
+                + " from  ssb.lineorder lineorder group by  1.1000000000000001 ) t0\n"
+                + "group by  1.1000000000000001\n";
+
+        getTestConfig().setProperty("kylin.query.calcite.aggregate-pushdown-enabled", "true");
+        List<OLAPContext> olapContexts = OlapContextUtil.getHepRulesOptimizedOlapContexts(getProject(), sql, false);
+
+        // validate the first
+        OLAPContext oneOlapContext = olapContexts.get(0);
+        Map<String, String> oneMap = OlapContextUtil.matchJoins(dataflow.getModel(), oneOlapContext);
+        oneOlapContext.fixModel(dataflow.getModel(), oneMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), oneOlapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(1L, layoutCandidate.getLayoutEntity().getId());
+
+        // validate the second
+        OLAPContext anotherOlapContext = olapContexts.get(1);
+        Map<String, String> anotherMap = OlapContextUtil.matchJoins(dataflow.getModel(), anotherOlapContext);
+        anotherOlapContext.fixModel(dataflow.getModel(), anotherMap);
+        NLayoutCandidate anotherCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), anotherOlapContext.getSQLDigest(), null);
+        Assert.assertNotNull(anotherCandidate);
+        Assert.assertEquals(1L, anotherCandidate.getLayoutEntity().getId());
+    }
+
+    @Test
+    public void testSumExprWithAggPushDownDisabled() throws SqlParseException {
+
+        getTestConfig().setProperty("kylin.query.convert-sum-expression-enabled", "true");
+        String modelId = "d67bf0e4-30f4-9248-2528-52daa80be91a";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+        String sql = "select  sum( " //
+                + "( case  when (  case when (lineorder.lo_orderdate = t0.x_measure__0) then true\n"
+                + " when not (lineorder.lo_orderdate = t0.x_measure__0) then false\n" //
+                + " else null end ) then lineorder.lo_quantity\n" //
+                + " else cast(null as integer)  end  )  ) as sum_lo_quantity_sum______88\n" //
+                + "from  ssb.lineorder lineorder  cross join (\n" //
+                + " select  max(lineorder.lo_orderdate) as x_measure__0\n" //
+                + " from  ssb.lineorder lineorder group by  1.1000000000000001 ) t0\n"
+                + "group by  1.1000000000000001\n";
+
+        getTestConfig().setProperty("kylin.query.calcite.aggregate-pushdown-enabled", "false");
+        List<OLAPContext> olapContexts = OlapContextUtil.getHepRulesOptimizedOlapContexts(getProject(), sql, false);
+
+        // validate the first
+        OLAPContext oneOlapContext = olapContexts.get(0);
+        Map<String, String> oneMap = OlapContextUtil.matchJoins(dataflow.getModel(), oneOlapContext);
+        oneOlapContext.fixModel(dataflow.getModel(), oneMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), oneOlapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(1L, layoutCandidate.getLayoutEntity().getId());
+
+        // validate the second
+        OLAPContext anotherOlapContext = olapContexts.get(1);
+        Map<String, String> anotherMap = OlapContextUtil.matchJoins(dataflow.getModel(), anotherOlapContext);
+        anotherOlapContext.fixModel(dataflow.getModel(), anotherMap);
+        NLayoutCandidate anotherCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), anotherOlapContext.getSQLDigest(), null);
+        Assert.assertNotNull(anotherCandidate);
+        Assert.assertEquals(20000000001L, anotherCandidate.getLayoutEntity().getId());
+    }
+
+    @Test
+    public void testShardByCol() throws SqlParseException {
+        // prepare metadata
+        String modelId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+        cleanAlreadyExistingLayoutsInSegments(modelId);
+        // 1010001 no shard, dims=[trans_id, cal_dt, lstg_format_name]
+        // 1010002 shard=trans_id, dims=[cal_dt, trans_id, lstg_format_name]
+        // 1010003 shard=cal_dt, dims=[cal_dt, trans_id, lstg_format_name]
+        // cardinality: cal_dt = 1000
+        // cardinality: trans_id = 10000
+        mockShardByLayout(getProject(), modelId);
+        mockTableStats();
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+
+        {
+            String sql = "select CAL_DT, TRANS_ID, count(*) as GMV from test_kylin_fact \n"
+                    + " where CAL_DT = '2012-01-10' and TRANS_ID = 10000 group by CAL_DT, TRANS_ID ";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+
+            // hit layout 1010002
+            // 1. shardby layout are has higher priority over non-shardby layout, 
+            // so 1010001 is skipped, although it has a better dim order
+            // 2. trans_id has a higher cardinality, so 1010002 with shard on trans_id 
+            // is preferred over 1010003 with shard on cal_dt
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(1010002, layoutCandidate.getLayoutEntity().getId());
+        }
+
+        {
+            String sql = "select CAL_DT, TRANS_ID, count(*) as GMV from test_kylin_fact \n"
+                    + " where CAL_DT = '2012-01-10' and TRANS_ID > 10000 group by CAL_DT, TRANS_ID ";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(1010003, layoutCandidate.getLayoutEntity().getId());
+        }
+    }
+
+    private void mockShardByLayout(String project, String modelId) {
+        EnhancedUnitOfWork.doInTransactionWithCheckAndRetry(() -> {
+            NIndexPlanManager indexMgr = NIndexPlanManager.getInstance(getTestConfig(), getProject());
+            indexMgr.updateIndexPlan(modelId, copyForWrite -> {
+                IndexEntity oneIndex = new IndexEntity();
+                oneIndex.setId(copyForWrite.getNextAggregationIndexId());
+                oneIndex.setDimensions(Lists.newArrayList(1, 2, 3));
+                oneIndex.setMeasures(Lists.newArrayList(100000));
+                // mock no shardby column
+                LayoutEntity newLayout1 = new LayoutEntity();
+                newLayout1.setId(oneIndex.getId() + 1);
+                newLayout1.setAuto(true);
+                newLayout1.setColOrder(Lists.newArrayList(1, 2, 3, 100000));
+                // mock shardby trans_id
+                LayoutEntity newLayout2 = new LayoutEntity();
+                newLayout2.setId(oneIndex.getId() + 2);
+                newLayout2.setAuto(true);
+                newLayout2.setColOrder(Lists.newArrayList(2, 1, 3, 100000));
+                newLayout2.setShardByColumns(Lists.newArrayList(1));
+                //mock shardby cal_dt
+                LayoutEntity newLayout3 = new LayoutEntity();
+                newLayout3.setId(oneIndex.getId() + 3);
+                newLayout3.setAuto(true);
+                newLayout3.setColOrder(Lists.newArrayList(2, 1, 3, 100000));
+                newLayout3.setShardByColumns(Lists.newArrayList(2));
+                oneIndex.setLayouts(Lists.newArrayList(newLayout1, newLayout2, newLayout3));
+                copyForWrite.getIndexes().add(oneIndex);
+            });
+            NDataflowManager dfMgr = NDataflowManager.getInstance(getTestConfig(), getProject());
+            NDataSegment latestSegment = dfMgr.getDataflow(modelId).getLatestReadySegment();
+            NDataflowUpdate dataflowUpdate = new NDataflowUpdate(modelId);
+            NDataLayout layout1 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1010001L);
+            layout1.setRows(1000L);
+            NDataLayout layout2 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1010002L);
+            layout2.setRows(1000L);
+            NDataLayout layout3 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1010003L);
+            layout3.setRows(1000L);
+            dataflowUpdate.setToAddOrUpdateLayouts(layout1, layout2, layout3);
+            dfMgr.updateDataflow(dataflowUpdate);
+            return null;
+        }, project);
+    }
+
+    @Test
+    public void testUnmatchedCountColumn() throws SqlParseException {
+        overwriteSystemProp("kylin.query.replace-count-column-with-count-star", "true");
+        String modelId = "abe3bf1a-c4bc-458d-8278-7ea8b00f5e96";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+        String sql = "select avg(TEST_KYLIN_FACT.ITEM_COUNT) from TEST_KYLIN_FACT";
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+
+        Assert.assertNotNull(layoutCandidate);
+        List<NDataModel.Measure> allMeasures = dataflow.getModel().getAllMeasures();
+        Assert.assertTrue(containMeasure(allMeasures, "COUNT", "1"));
+        Assert.assertTrue(containMeasure(allMeasures, "SUM", "DEFAULT.TEST_KYLIN_FACT.PRICE"));
+        Assert.assertFalse(containMeasure(allMeasures, "COUNT", "DEFAULT.TEST_KYLIN_FACT.PRICE"));
+    }
+
+    /**
+     * Start with an empty project to get the OlapContexts not pollute is very important.
+     */
+    @Test
+    public void testTableIndexAndAggIndex() throws SqlParseException {
+        String emptyProject = "newten";
+        overwriteSystemProp("kylin.query.use-tableindex-answer-non-raw-query", "true");
+        String project = "table_index";
+        String modelId = "acfde546-2cc9-4eec-bc92-e3bd46d4e2ee";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), project).getDataflow(modelId);
+
+        {
+            String sql = "select sum(ORDER_ID) from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+
+        {
+            String sql = "select max(ORDER_ID) from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+
+        {
+            String sql = "select min(ORDER_ID) from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+
+        {
+            String sql = "select count(ORDER_ID) from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+
+        {
+            String sql = "select count(distinct ORDER_ID) from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+
+        {
+            String sql = "select collect_set(ORDER_ID) from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNull(layoutCandidate);
+        }
+
+        {
+            getTestConfig().setProperty("kylin.engine.segment-online-mode", "ANY");
+            String sql = "select max(PRICE)from TEST_KYLIN_FACT";
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(emptyProject, sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertTrue(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+    }
+
+    /**
+     * When the useTableIndexAnswerNonRawQuery configuration is enabled, if the TableIndex has a lower cost,
+     * it will be used to answer the query. However, if the isPreferAggIndex configuration is enabled too,
+     * the aggregate query will be used to respond.
+     */
+    @Test
+    public void testPreferAggIndexEnabled() throws SqlParseException {
+        overwriteSystemProp("kylin.query.use-tableindex-answer-non-raw-query", "true");
+        String modelId = "acfde546-2cc9-4eec-bc92-e3bd46d4e2ee";
+        String project = "table_index";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), project).getDataflow(modelId);
+        EnhancedUnitOfWork.doInTransactionWithCheckAndRetry(() -> {
+            NDataflowManager dfMgr = NDataflowManager.getInstance(getTestConfig(), project);
+            NDataSegment latestSegment = dfMgr.getDataflow(modelId).getLatestReadySegment();
+            NDataflowUpdate dataflowUpdate = new NDataflowUpdate(modelId);
+            NDataLayout layout1 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 1L);
+            layout1.setRows(1000L);
+            NDataLayout layout2 = NDataLayout.newDataLayout(latestSegment.getSegDetails(), 20000000001L);
+            layout2.setRows(100L);
+            dataflowUpdate.setToAddOrUpdateLayouts(layout1, layout2);
+            dfMgr.updateDataflow(dataflowUpdate);
+            return null;
+        }, project);
+        String sql = "select LSTG_FORMAT_NAME,count(*) from TEST_KYLIN_FACT group by LSTG_FORMAT_NAME";
+
+        {
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> tableAlias2ModelAliasMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), tableAlias2ModelAliasMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertFalse(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+
+        {
+            overwriteSystemProp("kylin.query.layout.prefer-aggindex", "false");
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> tableAlias2ModelAliasMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), tableAlias2ModelAliasMap);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertTrue(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+        }
+    }
+
+    @Test
+    public void testTableIndexAnswerAggQueryUseProjectConfig() throws SqlParseException {
+        String project = "table_index";
+        MetadataTestUtils.updateProjectConfig(project, "kylin.query.use-tableindex-answer-non-raw-query", "true");
+        String sql = "select max(PRICE)from TEST_KYLIN_FACT";
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+
+        String modelId = "acfde546-2cc9-4eec-bc92-e3bd46d4e2ee";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), project).getDataflow(modelId);
+        Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertTrue(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+    }
+
+    @Test
+    public void testTableIndexAnswerNonRawQueryQueryUseModelConfig() throws SqlParseException {
+        String project = "table_index";
+        MetadataTestUtils.updateProjectConfig(project, "kylin.query.use-tableindex-answer-non-raw-query", "false");
+        String uuid = "acfde546-2cc9-4eec-bc92-e3bd46d4e2ee";
+        NIndexPlanManager indexMgr = NIndexPlanManager.getInstance(getTestConfig(), project);
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), project).getDataflow(uuid);
+        indexMgr.updateIndexPlan(uuid, copyForWrite -> {
+            LinkedHashMap<String, String> props = copyForWrite.getOverrideProps();
+            props.put("kylin.query.use-tableindex-answer-non-raw-query", "true");
+            copyForWrite.setOverrideProps(props);
+        });
+        String sql = "select max(PRICE) from TEST_KYLIN_FACT";
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+
+        Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelNameMap);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertTrue(layoutCandidate.getLayoutEntity().getIndex().isTableIndex());
+    }
+
+    @Test
+    public void testMatchJoinWithFilter() throws SqlParseException {
+        final List<String> filters = ImmutableList.of(" b.SITE_NAME is not null",
+                " b.SITE_NAME is not null and b.SITE_NAME is null", " b.SITE_NAME = '英国'", " b.SITE_NAME < '英国'",
+                " b.SITE_NAME > '英国'", " b.SITE_NAME >= '英国'", " b.SITE_NAME <= '英国'", " b.SITE_NAME <> '英国'",
+                " b.SITE_NAME like '%英国%'", " b.SITE_NAME not like '%英国%'", " b.SITE_NAME not in ('英国%')",
+                " b.SITE_NAME similar to '%英国%'", " b.SITE_NAME not similar to '%英国%'",
+                " b.SITE_NAME is not distinct from '%英国%'", " b.SITE_NAME between '1' and '2'",
+                " b.SITE_NAME not between '1' and '2'", " b.SITE_NAME <= '英国' OR b.SITE_NAME >= '英国'",
+                " b.SITE_NAME = '英国' is not false", " b.SITE_NAME = '英国' is not true", " b.SITE_NAME = '英国' is false",
+                " b.SITE_NAME = '英国' is true");
+        getTestConfig().setProperty("kylin.query.join-match-optimization-enabled", "true");
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("89af4ee2-2cdb-4b07-b39e-4c29856309aa");
+        for (String filter : filters) {
+            String sql = "select CAL_DT from test_kylin_fact a inner join EDW.test_sites b \n"
+                    + " on a.LSTG_SITE_ID = b.SITE_ID where " + filter;
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelName);
+            NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                    dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+            Assert.assertNotNull(layoutCandidate);
+            Assert.assertEquals(20000010001L, layoutCandidate.getLayoutEntity().getId());
+        }
+    }
+
+    @Test
+    public void testMatchJoinWithEnhancedMode() throws SqlParseException {
+        getTestConfig().setProperty("kylin.query.join-match-optimization-enabled", "true");
+        String sql = "SELECT \n" + "COUNT(\"TEST_KYLIN_FACT\".\"SELLER_ID\")\n" + "FROM \n"
+                + "\"DEFAULT\".\"TEST_KYLIN_FACT\" as \"TEST_KYLIN_FACT\" \n"
+                + "LEFT JOIN \"DEFAULT\".\"TEST_ORDER\" as \"TEST_ORDER\"\n" // left or inner join
+                + "ON \"TEST_KYLIN_FACT\".\"ORDER_ID\"=\"TEST_ORDER\".\"ORDER_ID\"\n"
+                + "INNER JOIN \"EDW\".\"TEST_SELLER_TYPE_DIM\" as \"TEST_SELLER_TYPE_DIM\"\n"
+                + "ON \"TEST_KYLIN_FACT\".\"SLR_SEGMENT_CD\"=\"TEST_SELLER_TYPE_DIM\".\"SELLER_TYPE_CD\"\n"
+                + "INNER JOIN \"EDW\".\"TEST_CAL_DT\" as \"TEST_CAL_DT\"\n"
+                + "ON \"TEST_KYLIN_FACT\".\"CAL_DT\"=\"TEST_CAL_DT\".\"CAL_DT\"\n"
+                + "INNER JOIN \"DEFAULT\".\"TEST_CATEGORY_GROUPINGS\" as \"TEST_CATEGORY_GROUPINGS\"\n"
+                + "ON \"TEST_KYLIN_FACT\".\"LEAF_CATEG_ID\"=\"TEST_CATEGORY_GROUPINGS\".\"LEAF_CATEG_ID\" AND "
+                + "\"TEST_KYLIN_FACT\".\"LSTG_SITE_ID\"=\"TEST_CATEGORY_GROUPINGS\".\"SITE_ID\"\n"
+                + "INNER JOIN \"EDW\".\"TEST_SITES\" as \"TEST_SITES\"\n"
+                + "ON \"TEST_KYLIN_FACT\".\"LSTG_SITE_ID\"=\"TEST_SITES\".\"SITE_ID\"\n"
+                + "LEFT JOIN \"DEFAULT\".\"TEST_ACCOUNT\" as \"SELLER_ACCOUNT\"\n" // left or inner join
+                + "ON \"TEST_KYLIN_FACT\".\"SELLER_ID\"=\"SELLER_ACCOUNT\".\"ACCOUNT_ID\"\n"
+                + "LEFT JOIN \"DEFAULT\".\"TEST_ACCOUNT\" as \"BUYER_ACCOUNT\"\n" // left or inner join
+                + "ON \"TEST_ORDER\".\"BUYER_ID\"=\"BUYER_ACCOUNT\".\"ACCOUNT_ID\"\n"
+                + "INNER JOIN \"DEFAULT\".\"TEST_COUNTRY\" as \"SELLER_COUNTRY\"\n"
+                + "ON \"SELLER_ACCOUNT\".\"ACCOUNT_COUNTRY\"=\"SELLER_COUNTRY\".\"COUNTRY\"\n"
+                + "INNER JOIN \"DEFAULT\".\"TEST_COUNTRY\" as \"BUYER_COUNTRY\"\n"
+                + "ON \"BUYER_ACCOUNT\".\"ACCOUNT_COUNTRY\"=\"BUYER_COUNTRY\".\"COUNTRY\"\n"
+                + "GROUP BY \"TEST_KYLIN_FACT\".\"TRANS_ID\"";
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("741ca86a-1f13-46da-a59f-95fb68615e3a");
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        olapContext.fixModel(dataflow.getModel(), sqlAlias2ModelName);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), olapContext.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(1L, layoutCandidate.getLayoutEntity().getId());
+    }
+
+    public boolean containMeasure(List<NDataModel.Measure> allMeasures, String expression, String parameter) {
+        for (NDataModel.Measure measure : allMeasures) {
+            if (measure.getFunction().getExpression().equals(expression)
+                    && measure.getFunction().getParameters().get(0).toString().equals(parameter)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void cleanAlreadyExistingLayoutsInSegments(String modelId) {
+        EnhancedUnitOfWork.doInTransactionWithCheckAndRetry(() -> {
+            NDataflowManager dfMgr = NDataflowManager.getInstance(getTestConfig(), getProject());
+            NDataSegDetails segDetails = dfMgr.getDataflow(modelId).getLatestReadySegment().getSegDetails();
+            List<NDataLayout> allLayouts = segDetails.getAllLayouts();
+
+            // update
+            NDataflowUpdate dataflowUpdate = new NDataflowUpdate(modelId);
+            dataflowUpdate.setToRemoveLayouts(allLayouts.toArray(new NDataLayout[0]));
+            dfMgr.updateDataflow(dataflowUpdate);
+            return null;
+        }, getProject());
+    }
+
+    private void mockTableStats() {
+        NTableMetadataManager tableManager = NTableMetadataManager.getInstance(KylinConfig.getInstanceFromEnv(),
+                getProject());
+        TableDesc tableDesc = tableManager.getTableDesc("DEFAULT.TEST_KYLIN_FACT");
+        TableExtDesc tableExt = tableManager.getOrCreateTableExt(tableDesc);
+        tableExt = tableManager.copyForWrite(tableExt);
+        List<TableExtDesc.ColumnStats> columnStats = Lists.newArrayList();
+
+        for (ColumnDesc columnDesc : tableDesc.getColumns()) {
+            if (columnDesc.isComputedColumn()) {
+                continue;
+            }
+            TableExtDesc.ColumnStats colStats = tableExt.getColumnStatsByName(columnDesc.getName());
+            if (colStats == null) {
+                colStats = new TableExtDesc.ColumnStats();
+                colStats.setColumnName(columnDesc.getName());
+            }
+            if ("CAL_DT".equals(columnDesc.getName())) {
+                colStats.setCardinality(1000);
+            } else if ("TRANS_ID".equals(columnDesc.getName())) {
+                colStats.setCardinality(10000);
+            } else {
+                colStats.setCardinality(100);
+            }
+            columnStats.add(colStats);
+        }
+        tableExt.setColumnStats(columnStats);
+        tableManager.saveTableExt(tableExt);
+    }
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/QueryLayoutFilterTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/QueryLayoutFilterTest.java
new file mode 100644
index 0000000000..f03e4175c1
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/QueryLayoutFilterTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.query.routing;
+
+import java.util.List;
+
+import org.apache.calcite.jdbc.CalciteSchema;
+import org.apache.calcite.rex.RexExecutorImpl;
+import org.apache.hadoop.util.Shell;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.util.RandomUtil;
+import org.apache.kylin.common.util.TempMetadataBuilder;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.job.engine.JobEngineConfig;
+import org.apache.kylin.job.impl.threadpool.NDefaultScheduler;
+import org.apache.kylin.metadata.cube.model.NDataSegment;
+import org.apache.kylin.metadata.cube.model.NDataflow;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.metadata.query.NativeQueryRealization;
+import org.apache.kylin.metadata.query.QueryMetrics;
+import org.apache.kylin.query.engine.QueryExec;
+import org.apache.kylin.query.engine.TypeSystem;
+import org.apache.kylin.query.engine.meta.SimpleDataContext;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.util.OlapContextUtil;
+import org.apache.spark.SparkConf;
+import org.apache.spark.sql.SparderEnv;
+import org.apache.spark.sql.SparkSession;
+import org.apache.spark.sql.internal.StaticSQLConf;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class QueryLayoutFilterTest extends NLocalWithSparkSessionTest {
+
+    @BeforeClass
+    public static void initSpark() {
+        if (Shell.MAC)
+            overwriteSystemPropBeforeClass("org.xerial.snappy.lib.name", "libsnappyjava.jnilib");//for snappy
+        if (ss != null && !ss.sparkContext().isStopped()) {
+            ss.stop();
+        }
+        sparkConf = new SparkConf().setAppName(RandomUtil.randomUUIDStr()).setMaster("local[4]");
+        sparkConf.set("spark.serializer", "org.apache.spark.serializer.JavaSerializer");
+        sparkConf.set(StaticSQLConf.CATALOG_IMPLEMENTATION().key(), "in-memory");
+        sparkConf.set("spark.sql.shuffle.partitions", "1");
+        sparkConf.set("spark.memory.fraction", "0.1");
+        // opt memory
+        sparkConf.set("spark.shuffle.detectCorrupt", "false");
+        // For sinai_poc/query03, enable implicit cross join conversion
+        sparkConf.set("spark.sql.crossJoin.enabled", "true");
+        sparkConf.set("spark.sql.adaptive.enabled", "true");
+        sparkConf.set(StaticSQLConf.WAREHOUSE_PATH().key(),
+                TempMetadataBuilder.TEMP_TEST_METADATA + "/spark-warehouse");
+        ss = SparkSession.builder().config(sparkConf).getOrCreate();
+        SparderEnv.setSparkSession(ss);
+
+    }
+
+    @Before
+    public void setup() throws Exception {
+        overwriteSystemProp("kylin.job.scheduler.poll-interval-second", "1");
+        this.createTestMetadata();
+        NDefaultScheduler scheduler = NDefaultScheduler.getInstance(getProject());
+        scheduler.init(new JobEngineConfig(KylinConfig.getInstanceFromEnv()));
+        if (!scheduler.hasStarted()) {
+            throw new RuntimeException("scheduler has not been started");
+        }
+    }
+
+    @After
+    public void after() throws Exception {
+        NDefaultScheduler.destroyInstance();
+        cleanupTestMetadata();
+    }
+
+    @Test
+    public void testQueryWithFilterCondAlwaysFalse() throws Exception {
+        String dataflowId = "b780e4e4-69af-449e-b09f-05c90dfa04b6";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = "default";
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        NDataflow dataflow = dataflowManager.getDataflow(dataflowId);
+        String sql = "SELECT COUNT(*) FROM TEST_BANK_INCOME inner join TEST_BANK_LOCATION "
+                + "on TEST_BANK_INCOME.COUNTRY = TEST_BANK_LOCATION.COUNTRY \n" //
+                + "WHERE 1 = 1\n" //
+                + "and TEST_BANK_INCOME.DT = '2021-11-02'\n" //
+                + "and TEST_BANK_INCOME.COUNTRY in ('INDONESIA')\n" //
+                + "and TEST_BANK_INCOME.COUNTRY in ('KENYA')";
+        List<OLAPContext> contexts = OlapContextUtil.getOlapContexts(project, sql);
+        OLAPContext context = contexts.get(0);
+
+        CalciteSchema rootSchema = new QueryExec(project, kylinConfig).getRootSchema();
+        SimpleDataContext dataContext = new SimpleDataContext(rootSchema.plus(), TypeSystem.javaTypeFactory(),
+                kylinConfig);
+        context.firstTableScan.getCluster().getPlanner().setExecutor(new RexExecutorImpl(dataContext));
+        List<NDataSegment> segments = new SegmentPruningRule().pruneSegments(dataflow, context);
+        Assert.assertTrue(segments.isEmpty());
+        context.storageContext.setEmptyLayout(true);
+        context.realization = dataflow;
+        OLAPContext.registerContext(context);
+        List<NativeQueryRealization> realizations = OLAPContext.getNativeRealizations();
+        Assert.assertEquals(1, realizations.size());
+        Assert.assertEquals(QueryMetrics.FILTER_CONFLICT, realizations.get(0).getIndexType());
+        Assert.assertEquals(Long.valueOf(-1), realizations.get(0).getLayoutId());
+    }
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/RealizationChooserTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/RealizationChooserTest.java
new file mode 100644
index 0000000000..f4363eaa36
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/RealizationChooserTest.java
@@ -0,0 +1,134 @@
+/*
+ * 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.query.routing;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.guava30.shaded.common.collect.ImmutableList;
+import org.apache.kylin.metadata.cube.model.NDataflow;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.util.OlapContextUtil;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RealizationChooserTest extends NLocalWithSparkSessionTest {
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        this.createTestMetadata("src/test/resources/ut_meta/joins_graph_left_or_inner");
+    }
+
+    @After
+    public void teardown() throws Exception {
+        super.tearDown();
+    }
+
+    @Test
+    public void testCanMatchModelLeftQueryLeft() throws SqlParseException {
+        // model: TEST_BANK_INCOME left join TEST_BANK_LOCATION
+        // query: TEST_BANK_INCOME left join TEST_BANK_LOCATION with not null filter -> LEFT_OR_INNER
+        String project = "joins_graph_left_or_inner";
+        final List<String> filters = ImmutableList.of(" b.LOCATION is not null", " b.LOCATION in ('a', 'b')",
+                " b.LOCATION like 'a%' ", " b.LOCATION not like 'b%' ", " b.LOCATION between 'a' and 'b' ");
+        getTestConfig().setProperty("kylin.query.join-match-optimization-enabled", "true");
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), project)
+                .getDataflow("b780e4e4-69af-449e-b09f-05c90dfa04b7");
+        for (String filter : filters) {
+            String sql = "select a.NAME from TEST_BANK_INCOME a left join TEST_BANK_LOCATION b \n"
+                    + " on a.COUNTRY = b.COUNTRY where " + filter;
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            Assert.assertFalse(sqlAlias2ModelName.isEmpty());
+        }
+    }
+
+    @Test
+    public void testCanNotMatchModelLeftQueryInner() throws SqlParseException {
+        // model: TEST_BANK_INCOME left join TEST_BANK_LOCATION
+        // query: TEST_BANK_INCOME inner join TEST_BANK_LOCATION
+        String project = "joins_graph_left_or_inner";
+        String modelId = "b780e4e4-69af-449e-b09f-05c90dfa04b7";
+        overwriteSystemProp("kylin.query.join-match-optimization-enabled", "true");
+        String sql = "select a.NAME from TEST_BANK_INCOME a inner join TEST_BANK_LOCATION b on a.COUNTRY = b.COUNTRY";
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), project).getDataflow(modelId);
+        OLAPContext olapContext = OlapContextUtil.getOlapContexts(project, sql, true).get(0);
+        Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+        Assert.assertTrue(sqlAlias2ModelName.isEmpty());
+    }
+
+    @Test
+    public void testCanNotMatchInnerJoinWithFilter() throws SqlParseException {
+        String modelId = "89af4ee2-2cdb-4b07-b39e-4c29856309aa";
+        final List<String> filters = ImmutableList.of(" b.SITE_NAME is null", " b.SITE_NAME is distinct from '%英国%'",
+                " b.SITE_NAME is not distinct from null", " b.SITE_NAME is not null or a.TRANS_ID is not null",
+                " case when b.SITE_NAME is not null then false else true end" //
+        );
+        getTestConfig().setProperty("kylin.query.join-match-optimization-enabled", "true");
+        NDataflow dataflow = NDataflowManager.getInstance(getTestConfig(), getProject()).getDataflow(modelId);
+        for (String filter : filters) {
+            String sql = "select CAL_DT from test_kylin_fact a inner join EDW.test_sites b \n"
+                    + " on a.LSTG_SITE_ID = b.SITE_ID where " + filter;
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            Assert.assertTrue(sqlAlias2ModelName.isEmpty());
+        }
+    }
+
+    @Test
+    public void testCanMatchModelInnerQueryLeft() throws SqlParseException {
+        // model: TEST_BANK_INCOME inner join TEST_BANK_LOCATION
+        // query: TEST_BANK_INCOME left join TEST_BANK_LOCATION with not null filter
+        final List<String> filters = ImmutableList.of(" b.LOCATION is not null", " b.LOCATION in ('a', 'b')",
+                " b.LOCATION like 'a%' ", " b.LOCATION not like 'b%' ", " b.LOCATION between 'a' and 'b' ");
+        overwriteSystemProp("kylin.query.join-match-optimization-enabled", "true");
+        NDataflowManager dfMgr = NDataflowManager.getInstance(getTestConfig(), getProject());
+        NDataflow dataflow = dfMgr.getDataflow("b780e4e4-69af-449e-b09f-05c90dfa04b6");
+        for (String filter : filters) {
+            String sql = "select a.NAME from TEST_BANK_INCOME a left join TEST_BANK_LOCATION b \n"
+                    + " on a.COUNTRY = b.COUNTRY where " + filter;
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql, true).get(0);
+            Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            Assert.assertFalse(sqlAlias2ModelName.isEmpty());
+        }
+    }
+
+    @Test
+    public void testCanNotMatchModelInnerQueryLeft() throws SqlParseException {
+        // model: TEST_BANK_INCOME inner join TEST_BANK_LOCATION
+        // query: TEST_BANK_INCOME left join TEST_BANK_LOCATION without not null filter
+        final List<String> filters = ImmutableList.of(" b.LOCATION is null", " b.LOCATION is not distinct from null");
+        getTestConfig().setProperty("kylin.query.join-match-optimization-enabled", "true");
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("b780e4e4-69af-449e-b09f-05c90dfa04b6");
+        for (String filter : filters) {
+            String sql = "select a.NAME from TEST_BANK_INCOME a left join TEST_BANK_LOCATION b \n"
+                    + " on a.COUNTRY = b.COUNTRY where " + filter;
+            OLAPContext olapContext = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+            Map<String, String> sqlAlias2ModelNameMap = OlapContextUtil.matchJoins(dataflow.getModel(), olapContext);
+            Assert.assertTrue(sqlAlias2ModelNameMap.isEmpty());
+        }
+    }
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/SegmentPruningRuleTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/SegmentPruningRuleTest.java
new file mode 100644
index 0000000000..062d10b200
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/SegmentPruningRuleTest.java
@@ -0,0 +1,356 @@
+/*
+ * 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.query.routing;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.calcite.jdbc.CalciteSchema;
+import org.apache.calcite.rex.RexExecutorImpl;
+import org.apache.hadoop.util.Shell;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.util.RandomUtil;
+import org.apache.kylin.common.util.TempMetadataBuilder;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.job.engine.JobEngineConfig;
+import org.apache.kylin.job.impl.threadpool.NDefaultScheduler;
+import org.apache.kylin.metadata.cube.model.NDataSegment;
+import org.apache.kylin.metadata.cube.model.NDataflow;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.metadata.datatype.DataType;
+import org.apache.kylin.query.engine.QueryExec;
+import org.apache.kylin.query.engine.TypeSystem;
+import org.apache.kylin.query.engine.meta.SimpleDataContext;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.util.OlapContextUtil;
+import org.apache.spark.SparkConf;
+import org.apache.spark.sql.SparderEnv;
+import org.apache.spark.sql.SparkSession;
+import org.apache.spark.sql.internal.StaticSQLConf;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import lombok.val;
+
+public class SegmentPruningRuleTest extends NLocalWithSparkSessionTest {
+
+    @BeforeClass
+    public static void initSpark() {
+        if (Shell.MAC) {
+            // for snappy
+            overwriteSystemPropBeforeClass("org.xerial.snappy.lib.name", "libsnappyjava.jnilib");
+        }
+        if (ss != null && !ss.sparkContext().isStopped()) {
+            ss.stop();
+        }
+        sparkConf = new SparkConf().setAppName(RandomUtil.randomUUIDStr()).setMaster("local[4]");
+        sparkConf.set("spark.serializer", "org.apache.spark.serializer.JavaSerializer");
+        sparkConf.set(StaticSQLConf.CATALOG_IMPLEMENTATION().key(), "in-memory");
+        sparkConf.set("spark.sql.shuffle.partitions", "1");
+        sparkConf.set("spark.memory.fraction", "0.1");
+        // opt memory
+        sparkConf.set("spark.shuffle.detectCorrupt", "false");
+        // For sinai_poc/query03, enable implicit cross join conversion
+        sparkConf.set("spark.sql.crossJoin.enabled", "true");
+        sparkConf.set("spark.sql.adaptive.enabled", "true");
+        sparkConf.set(StaticSQLConf.WAREHOUSE_PATH().key(),
+                TempMetadataBuilder.TEMP_TEST_METADATA + "/spark-warehouse");
+        ss = SparkSession.builder().config(sparkConf).getOrCreate();
+        SparderEnv.setSparkSession(ss);
+
+    }
+
+    @Before
+    public void setup() throws Exception {
+        overwriteSystemProp("kylin.job.scheduler.poll-interval-second", "1");
+        this.createTestMetadata("src/test/resources/ut_meta/multi_partition_date_type");
+        NDefaultScheduler scheduler = NDefaultScheduler.getInstance(getProject());
+        scheduler.init(new JobEngineConfig(KylinConfig.getInstanceFromEnv()));
+        if (!scheduler.hasStarted()) {
+            throw new RuntimeException("scheduler has not been started");
+        }
+    }
+
+    private List<NDataSegment> startRealizationPruner(NDataflowManager dataflowManager, String dataflowId, String sql,
+            String project, KylinConfig kylinConfig) throws Exception {
+        NDataflow dataflow = dataflowManager.getDataflow(dataflowId);
+        List<OLAPContext> olapContexts = OlapContextUtil.getOlapContexts(getProject(), sql);
+        OLAPContext context = olapContexts.get(0);
+        CalciteSchema rootSchema = new QueryExec(project, kylinConfig).getRootSchema();
+        SimpleDataContext dataContext = new SimpleDataContext(rootSchema.plus(), TypeSystem.javaTypeFactory(),
+                kylinConfig);
+        context.firstTableScan.getCluster().getPlanner().setExecutor(new RexExecutorImpl(dataContext));
+        Map<String, String> map = RealizationChooser.matchJoins(dataflow.getModel(), context, false, false);
+        context.fixModel(dataflow.getModel(), map);
+        return new SegmentPruningRule().pruneSegments(dataflow, context);
+    }
+
+    @After
+    public void after() throws Exception {
+        NDefaultScheduler.destroyInstance();
+        cleanupTestMetadata();
+    }
+
+    @Test
+    public void testSegmentPruningPartitionDateColumnFilter() throws Exception {
+        val dataflowId = "3718b614-5191-2254-77e9-f4c5ca64e309";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT * FROM TEST_DB.TEST_FACT_13_10W WHERE DATE_6 >= '2021-10-28' AND DATE_6 < '2021-11-05'";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_13_10W WHERE DATE_6 >= CAST('2021-10-28' AS DATE) AND DATE_6 < '2021-11-05'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_13_10W WHERE DATE_6 >= CAST('2021-10-28' AS DATE) AND DATE_6 < CAST('2021-11-05' AS DATE)";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+    }
+
+    @Test
+    public void testSegmentPruningPartitionDateStrColumnFilter() throws Exception {
+        val dataflowId = "00a91916-d31e-ed40-b1ba-4a86765072f6";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT * FROM TEST_DB.TEST_FACT_24_2W WHERE STRING_DATE_20 >= '2021-12-20' AND STRING_DATE_20 < '2021-12-26'";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(6, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_24_2W WHERE STRING_DATE_20 >= CAST('2021-12-20' AS DATE) AND STRING_DATE_20 < '2021-12-26'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(6, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_24_2W WHERE STRING_DATE_20 >= CAST('2021-12-20' AS DATE) AND STRING_DATE_20 < CAST('2021-12-26' AS DATE)";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(6, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_24_2W WHERE STRING_DATE_20 >= CAST('2021-12-20' AS TIMESTAMP) AND STRING_DATE_20 < CAST('2021-12-26' AS TIMESTAMP)";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(6, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_24_2W WHERE CAST(STRING_DATE_20 AS TIMESTAMP)  >= '2021-12-20' AND CAST(STRING_DATE_20 AS TIMESTAMP) < '2021-12-26'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(6, selectSegmentList.size());
+    }
+
+    @Test
+    public void testSegmentPruningPartitionDateStr2ColumnFilter() throws Exception {
+        val dataflowId = "cdf17c7b-18e3-9a09-23d1-4e82b7bc9123";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT * FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= '20211220' AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= '20211220' AND STRING_DATE2_24 < '20211224'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+    }
+
+    @Test
+    public void testSegmentPruningDateType2Timestamp() throws Exception {
+        val dataflowId = "3718b614-5191-2254-77e9-f4c5ca64e310";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE DATE_6 >= '2021-10-28' AND DATE_6 < '2021-11-05'";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE DATE_6 >= CAST('2021-10-28' AS DATE) AND DATE_6 < '2021-11-05'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE DATE_6 >= CAST('2021-10-28' AS DATE) AND DATE_6 < CAST('2021-11-05' AS DATE)";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        DataType dateType = new DataType("date", 0, 0);
+        ReflectionTestUtils.invokeMethod(SegmentPruningRule.class, "checkAndReformatDateType", "yyyy-MM-dd HH:mm:ss",
+                Long.parseLong("1633928400000"), dateType);
+    }
+
+    @Test
+    public void testSegmentPruningTimestampType2DateType() throws Exception {
+        val dataflowId = "3718b614-5191-2254-77e9-f4c5ca64e311";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE TIMESTAMP_10 >= '2021-10-28' AND TIMESTAMP_10 < '2021-11-05'";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(5, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE TIMESTAMP_10 >= CAST('2021-10-28' AS DATE) AND TIMESTAMP_10 < '2021-11-05'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(5, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE TIMESTAMP_10 >= CAST('2021-10-28' AS DATE) AND TIMESTAMP_10 < CAST('2021-11-05' AS DATE)";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(5, selectSegmentList.size());
+
+        DataType dateType = new DataType("date", 0, 0);
+        ReflectionTestUtils.invokeMethod(SegmentPruningRule.class, "checkAndReformatDateType", "yyyy-MM-dd HH:mm:ss",
+                Long.parseLong("1633928400000"), dateType);
+    }
+
+    @Test
+    public void testSegmentPruningTimestampType() throws Exception {
+        val dataflowId = "3718b614-5191-2254-77e9-f4c5ca64e312";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE TIMESTAMP_10 >= '2021-10-28' AND TIMESTAMP_10 < '2021-11-05'";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(5, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE TIMESTAMP_10 >= CAST('2021-10-28' AS DATE) AND TIMESTAMP_10 < '2021-11-05'";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(5, selectSegmentList.size());
+        sql = "SELECT * FROM TEST_DB.DATE_TIMESTAMP_TABLE WHERE TIMESTAMP_10 >= CAST('2021-10-28' AS DATE) AND TIMESTAMP_10 < CAST('2021-11-05' AS DATE)";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(5, selectSegmentList.size());
+
+        DataType dateType = new DataType("date", 0, 0);
+        ReflectionTestUtils.invokeMethod(SegmentPruningRule.class, "checkAndReformatDateType", "yyyy-MM-dd HH:mm:ss",
+                Long.parseLong("1633928400000"), dateType);
+    }
+
+    @Test
+    public void testSegmentPruningMaxMeasureBeforeDaysSuccess() throws Exception {
+        overwriteSystemProp("kylin.query.calcite.extras-props.conformance", "DEFAULT");
+        val dataflowId = "cdf17c7b-18e3-9a09-23d1-4e82b7bc9123";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+        String sql = "SELECT MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        overwriteSystemProp("kylin.query.max-measure-segment-pruner-before-days", "0");
+        sql = "SELECT MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(0, selectSegmentList.size());
+
+        overwriteSystemProp("kylin.query.max-measure-segment-pruner-before-days", "2");
+        sql = "SELECT MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT MAX(STRING_DATE2_24), MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT MAX(STRING_DATE2_24), COUNT(*) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT MAX(STRING_DATE2_24), COUNT(1) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT MAX(STRING_DATE2_24), MIN(1) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT 1, MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT 1, MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224 GROUP BY 1";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT STRING_DATE2_24, MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224 GROUP BY STRING_DATE2_24";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+
+        sql = "SELECT SUM(1), COUNT(DISTINCT 1), MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224 GROUP BY STRING_DATE2_24";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(2, selectSegmentList.size());
+    }
+
+    @Test
+    public void testSegmentPruningMaxMeasureBeforeDaysFail() throws Exception {
+        overwriteSystemProp("kylin.query.calcite.extras-props.conformance", "DEFAULT");
+        val dataflowId = "cdf17c7b-18e3-9a09-23d1-4e82b7bc9123";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+
+        // test non-max
+        overwriteSystemProp("kylin.query.max-measure-segment-pruner-before-days", "2");
+        String sql = "SELECT MIN(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        // test non time partition column
+        sql = "SELECT MAX(STRING_DATE_20) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        // test multi aggregations
+        sql = "SELECT MAX(STRING_DATE2_24), MIN(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        // test no aggregations
+        sql = "SELECT STRING_DATE2_24 FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        // test multi group by column
+        sql = "SELECT MAX(STRING_DATE2_24),STRING_DATE_20 FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224 GROUP BY STRING_DATE_20";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(4, selectSegmentList.size());
+
+        // test dataformat is null
+        dataflowManager.getDataflow(dataflowId).getModel().getPartitionDesc().setPartitionDateFormat(null);
+        sql = "SELECT MAX(STRING_DATE2_24) FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 >= 20211220 AND STRING_DATE2_24 < 20211224";
+        selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project, kylinConfig);
+        Assert.assertEquals(18, selectSegmentList.size());
+    }
+
+    @Test
+    public void testSegmentPruningFilterAlwaysFalse() throws Exception {
+        overwriteSystemProp("kylin.query.calcite.extras-props.conformance", "DEFAULT");
+        val dataflowId = "cdf17c7b-18e3-9a09-23d1-4e82b7bc9123";
+        KylinConfig kylinConfig = getTestConfig();
+        String project = getProject();
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(kylinConfig, project);
+
+        String sql = "SELECT * FROM (SELECT STRING_DATE2_24,STRING_DATE_20 FROM TEST_DB.TEST_FACT_30_3W WHERE STRING_DATE2_24 = 20211221) AS T1 WHERE STRING_DATE2_24 = 20211220";
+        List<NDataSegment> selectSegmentList = startRealizationPruner(dataflowManager, dataflowId, sql, project,
+                kylinConfig);
+        Assert.assertEquals(0, selectSegmentList.size());
+    }
+
+    @Override
+    public String getProject() {
+        return "multi_partition_date_type";
+    }
+
+}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/query/routing/TableIndexAnswerSelectStarTest.java b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/TableIndexAnswerSelectStarTest.java
new file mode 100644
index 0000000000..9b54de169c
--- /dev/null
+++ b/src/kylin-it/src/test/java/org/apache/kylin/query/routing/TableIndexAnswerSelectStarTest.java
@@ -0,0 +1,228 @@
+/*
+ * 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.query.routing;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.hadoop.util.Shell;
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.persistence.RootPersistentEntity;
+import org.apache.kylin.common.util.RandomUtil;
+import org.apache.kylin.common.util.TempMetadataBuilder;
+import org.apache.kylin.common.util.Unsafe;
+import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
+import org.apache.kylin.job.engine.JobEngineConfig;
+import org.apache.kylin.job.impl.threadpool.NDefaultScheduler;
+import org.apache.kylin.metadata.cube.cuboid.NLayoutCandidate;
+import org.apache.kylin.metadata.cube.cuboid.NQueryLayoutChooser;
+import org.apache.kylin.metadata.cube.model.NDataLayout;
+import org.apache.kylin.metadata.cube.model.NDataflow;
+import org.apache.kylin.metadata.cube.model.NDataflowManager;
+import org.apache.kylin.metadata.cube.model.NDataflowUpdate;
+import org.apache.kylin.metadata.model.ComputedColumnDesc;
+import org.apache.kylin.metadata.model.NDataModel;
+import org.apache.kylin.metadata.model.NDataModelManager;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.realization.RealizationStatusEnum;
+import org.apache.kylin.query.engine.SchemaMetaData;
+import org.apache.kylin.query.relnode.OLAPContext;
+import org.apache.kylin.rest.constant.Constant;
+import org.apache.kylin.rest.request.CreateBaseIndexRequest;
+import org.apache.kylin.rest.service.IndexPlanService;
+import org.apache.kylin.rest.service.ModelService;
+import org.apache.kylin.rest.util.AclEvaluate;
+import org.apache.kylin.rest.util.AclUtil;
+import org.apache.kylin.util.OlapContextUtil;
+import org.apache.spark.SparkConf;
+import org.apache.spark.sql.SparderEnv;
+import org.apache.spark.sql.SparkSession;
+import org.apache.spark.sql.internal.StaticSQLConf;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.springframework.security.authentication.TestingAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.util.ReflectionTestUtils;
+
+public class TableIndexAnswerSelectStarTest extends NLocalWithSparkSessionTest {
+
+    @InjectMocks
+    private final IndexPlanService indexPlanService = Mockito.spy(new IndexPlanService());
+
+    @Mock
+    private AclEvaluate aclEvaluate = Mockito.spy(AclEvaluate.class);
+
+    @Mock
+    private AclUtil aclUtil = Mockito.spy(AclUtil.class);
+
+    @InjectMocks
+    private final ModelService modelService = Mockito.spy(new ModelService());
+
+    @BeforeClass
+    public static void initSpark() {
+        if (Shell.MAC)
+            overwriteSystemPropBeforeClass("org.xerial.snappy.lib.name", "libsnappyjava.jnilib");//for snappy
+        if (ss != null && !ss.sparkContext().isStopped()) {
+            ss.stop();
+        }
+        sparkConf = new SparkConf().setAppName(RandomUtil.randomUUIDStr()).setMaster("local[4]");
+        sparkConf.set("spark.serializer", "org.apache.spark.serializer.JavaSerializer");
+        sparkConf.set(StaticSQLConf.CATALOG_IMPLEMENTATION().key(), "in-memory");
+        sparkConf.set("spark.sql.shuffle.partitions", "1");
+        sparkConf.set("spark.memory.fraction", "0.1");
+        // opt memory
+        sparkConf.set("spark.shuffle.detectCorrupt", "false");
+        // For sinai_poc/query03, enable implicit cross join conversion
+        sparkConf.set("spark.sql.crossJoin.enabled", "true");
+        sparkConf.set("spark.sql.adaptive.enabled", "true");
+        sparkConf.set(StaticSQLConf.WAREHOUSE_PATH().key(),
+                TempMetadataBuilder.TEMP_TEST_METADATA + "/spark-warehouse");
+        ss = SparkSession.builder().config(sparkConf).getOrCreate();
+        SparderEnv.setSparkSession(ss);
+
+    }
+
+    @Before
+    public void setup() throws Exception {
+        overwriteSystemProp("kylin.job.scheduler.poll-interval-second", "1");
+        this.createTestMetadata("src/test/resources/ut_meta/tableindex_answer_selectstart");
+        ReflectionTestUtils.setField(aclEvaluate, "aclUtil", aclUtil);
+        ReflectionTestUtils.setField(indexPlanService, "aclEvaluate", aclEvaluate);
+        ReflectionTestUtils.setField(modelService, "aclEvaluate", aclEvaluate);
+        TestingAuthenticationToken auth = new TestingAuthenticationToken("ADMIN", "ADMIN", Constant.ROLE_ADMIN);
+        SecurityContextHolder.getContext().setAuthentication(auth);
+        NDefaultScheduler scheduler = NDefaultScheduler.getInstance(getProject());
+        scheduler.init(new JobEngineConfig(KylinConfig.getInstanceFromEnv()));
+        if (!scheduler.hasStarted()) {
+            throw new RuntimeException("scheduler has not been started");
+        }
+    }
+
+    @After
+    public void after() throws Exception {
+        NDefaultScheduler.destroyInstance();
+        cleanupTestMetadata();
+    }
+
+    @Test
+    public void testTableIndexAnswerSelectStarPartialMatch() throws Exception {
+        String sql = "select * from kylin_sales";
+        overwriteSystemProp("kylin.query.use-tableindex-answer-select-star.enabled", "true");
+        OLAPContext context = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("ccb82d81-1497-ca6d-f226-3258a0f0ba4f");
+        Assert.assertEquals(dataflow.getAllColumns().size(), context.allColumns.size());
+        Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), context);
+        context.fixModel(dataflow.getModel(), sqlAlias2ModelName);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), context.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(20000000001L, layoutCandidate.getLayoutEntity().getId());
+    }
+
+    @Test
+    public void testTableIndexAnswerSelectStarBaseTableIndex() throws Exception {
+        String sql = "select * from test_kylin_fact \n";
+        overwriteSystemProp("kylin.query.use-tableindex-answer-select-star.enabled", "true");
+        OLAPContext context = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        NDataflow dataflow = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject())
+                .getDataflow("c7a44f37-8481-e78b-5cac-faa7d76767db");
+        Assert.assertEquals(dataflow.getAllColumns().size(), context.allColumns.size());
+        Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), context);
+        context.fixModel(dataflow.getModel(), sqlAlias2ModelName);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), context.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(20000010001L, layoutCandidate.getLayoutEntity().getId());
+    }
+
+    @Test
+    public void testTableIndexAnswerSelectStarModelHavingCCs() throws Exception {
+        overwriteSystemProp("kylin.query.use-tableindex-answer-select-star.enabled", "true");
+        overwriteSystemProp("kylin.query.use-tableindex-answer-non-raw-query", "true");
+        String modelId = "c7a44f37-8481-e78b-5cac-faa7d76767db";
+        NDataModelManager modelManager = NDataModelManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject());
+        NDataflowManager dataflowManager = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject());
+
+        dataflowManager.updateDataflowStatus("baa44f37-8481-e78b-5cac-faa7d76767db", RealizationStatusEnum.OFFLINE);
+        modelManager.updateDataModel(modelId, copyForWrite -> {
+            ComputedColumnDesc newCC = new ComputedColumnDesc();
+            newCC.setTableIdentity("DEFAULT.TEST_KYLIN_FACT");
+            newCC.setTableAlias("TEST_KYLIN_FACT");
+            newCC.setComment("");
+            newCC.setColumnName("NEW_CC");
+            newCC.setDatatype("BIGINT");
+            newCC.setExpression("TEST_KYLIN_FACT.ORDER_ID + 1");
+            newCC.setInnerExpression("`TEST_KYLIN_FACT`.`ORDER_ID` + 1");
+            copyForWrite.getComputedColumnDescs().add(newCC);
+
+            NDataModel.NamedColumn newCol = new NDataModel.NamedColumn();
+            newCol.setName("NEW_CC");
+            newCol.setId(copyForWrite.getAllNamedColumns().size());
+            newCol.setAliasDotColumn("TEST_KYLIN_FACT.NEW_CC");
+            newCol.setStatus(NDataModel.ColumnStatus.DIMENSION);
+            copyForWrite.getAllNamedColumns().add(newCol);
+        });
+
+        CreateBaseIndexRequest request = new CreateBaseIndexRequest();
+        request.setProject(getProject());
+        request.setModelId(modelId);
+        indexPlanService.updateBaseIndex(getProject(), request, false, false, false);
+        NDataflow dataflow = dataflowManager.getDataflow(modelId);
+        String segId = "87d65498-b922-225c-1db7-13de001beba8";
+        NDataLayout baseAggLayout = dataflow.getSegment(segId).getLayout(1L);
+        NDataLayout baseTableLayout = dataflow.getSegment(segId).getLayout(20000010001L);
+        Class<RootPersistentEntity> clazz = RootPersistentEntity.class;
+        Field field = clazz.getDeclaredField("isCachedAndShared");
+        Unsafe.changeAccessibleObject(field, true);
+        field.set(baseAggLayout.getSegDetails(), false);
+        field.set(baseTableLayout.getSegDetails(), false);
+        baseAggLayout.setLayoutId(10001L);
+        NDataflowUpdate updateOps = new NDataflowUpdate(modelId);
+        updateOps.setToAddOrUpdateLayouts(baseAggLayout, baseTableLayout);
+        dataflowManager.updateDataflow(updateOps);
+
+        String sql = "select cal_dt, new_cc from test_kylin_fact";
+        OLAPContext context = OlapContextUtil.getOlapContexts(getProject(), sql).get(0);
+        Set<TblColRef> allColumns = context.realization.getAllColumns();
+        Assert.assertEquals(13, allColumns.size());
+        SchemaMetaData schemaMetaData = new SchemaMetaData(getProject(), KylinConfig.getInstanceFromEnv());
+        Assert.assertEquals(26, schemaMetaData.getTables().get(1).getFields().size());
+
+        Map<String, String> sqlAlias2ModelName = OlapContextUtil.matchJoins(dataflow.getModel(), context);
+        context.fixModel(dataflow.getModel(), sqlAlias2ModelName);
+        NLayoutCandidate layoutCandidate = NQueryLayoutChooser.selectLayoutCandidate(dataflow,
+                dataflow.getQueryableSegments(), context.getSQLDigest(), null);
+        Assert.assertNotNull(layoutCandidate);
+        Assert.assertEquals(20000010001L, layoutCandidate.getLayoutEntity().getId());
+    }
+
+    @Override
+    public String getProject() {
+        return "tableindex_answer_selectstart";
+    }
+
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/_global/project/agg_match.json b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/_global/project/agg_match.json
new file mode 100755
index 0000000000..31cabf2742
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/_global/project/agg_match.json
@@ -0,0 +1,6 @@
+{
+  "uuid": "1eaca32a-a33e-4b69-83dd-0bb8b1f8c91e",
+  "override_kylin_properties": {
+    "kylin.query.slowquery-detect-interval": "4"
+  }
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/dataflow/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/dataflow/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json
new file mode 100755
index 0000000000..1e028071c2
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/dataflow/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json
@@ -0,0 +1,13 @@
+{
+  "uuid" : "c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e",
+  "last_modified" : 1522545367929,
+  "version" : "2.3.0.20500",
+  "description" : "test_description",
+  "owner" : "test_owner",
+  "mp_values" : null,
+  "create_time_utc" : 1509791792901,
+  "status" : "ONLINE",
+  "cost" : 50,
+  "segments" : [ ],
+  "storage_location_identifier" : null
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/index_plan/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/index_plan/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json
new file mode 100644
index 0000000000..8ac6d04a84
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/index_plan/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json
@@ -0,0 +1,50 @@
+{
+  "uuid": "c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e",
+  "last_modified": 1509531215483,
+  "version": "2.3.0.20500",
+  "description": "test_description",
+  "index_plan_override_encodings": {},
+  "indexes": [
+    {
+      "id": 100000,
+      "dimensions": [
+        0,
+        1,
+        2
+      ],
+      "measures": [
+        100000,
+        100001,
+        100002
+      ],
+      "layouts": [
+        {
+          "id": 100001,
+          "auto": true,
+          "col_order": [
+            0,
+            1,
+            2,
+            100000,
+            100001,
+            100002
+          ],
+          "storage_type": 20
+        }
+      ]
+    }
+  ],
+  "dictionaries": [],
+  "next_aggregation_index_id": 1010000,
+  "next_table_index_id": 20000040000,
+  "override_properties": {
+    "kylin.query.fast-bitmap-enabled" : "true"
+  },
+  "segment_range_start": 0,
+  "segment_range_end": 9223372036854775807,
+  "auto_merge_time_ranges": null,
+  "retention_range": 0,
+  "notify_list": null,
+  "status_need_notify": [],
+  "engine_type": 0
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/model_desc/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/model_desc/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json
new file mode 100644
index 0000000000..e18ff35893
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/model_desc/c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e.json
@@ -0,0 +1,81 @@
+{
+  "uuid": "c9ddd37e-c870-4ccf-a131-5eef8fe6cb7e",
+  "alias": "exact_match",
+  "fact_table": "DEFAULT.TEST_KYLIN_FACT",
+  "owner": "ADMIN",
+  "fast_bitmap_enabled": true,
+  "all_named_columns": [
+    {
+      "id": 0,
+      "name": "TRANS_ID",
+      "column": "TEST_KYLIN_FACT.TRANS_ID",
+      "status": "DIMENSION"
+    },
+    {
+      "id": 1,
+      "name": "CAL_DT",
+      "column": "TEST_KYLIN_FACT.CAL_DT",
+      "status": "DIMENSION"
+    },
+    {
+      "id": 2,
+      "name": "LSTG_FORMAT_NAME",
+      "column": "TEST_KYLIN_FACT.LSTG_FORMAT_NAME",
+      "status": "DIMENSION"
+    },
+    {
+      "id": 3,
+      "name": "PRICE",
+      "column": "TEST_KYLIN_FACT.PRICE",
+      "status": "EXIST"
+    }
+  ],
+  "all_measures": [
+    {
+      "id": 100000,
+      "name": "TRANS_CNT",
+      "function": {
+        "expression": "COUNT",
+        "parameters": [{
+          "type": "constant",
+          "value": "1"
+        }],
+        "returntype": "bigint"
+      }
+    },
+    {
+      "id": 100001,
+      "name": "GMV_SUM",
+      "function": {
+        "expression": "SUM",
+        "parameters": [{
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE"
+        }],
+        "returntype": "decimal(19,4)"
+      }
+    },
+    {
+      "id": 100002,
+      "name": "GMV_count",
+      "function": {
+        "expression": "COUNT_DISTINCT",
+        "parameters": [{
+          "type": "column",
+          "value": "TEST_KYLIN_FACT.PRICE"
+        }],
+        "returntype": "bitmap"
+      }
+    }
+  ],
+  "column_correlations": [],
+  "computed_columns": [],
+  "last_modified": 1422435345352,
+  "filter_condition": null,
+  "partition_desc": {
+    "partition_date_column": "DEFAULT.TEST_KYLIN_FACT.CAL_DT",
+    "partition_date_start": 0,
+    "partition_date_format": "yyyy-MM-dd",
+    "partition_type": "APPEND"
+  }
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/table/DEFAULT.TEST_KYLIN_FACT.json b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/table/DEFAULT.TEST_KYLIN_FACT.json
new file mode 100755
index 0000000000..cde33e7069
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/agg_exact_match/metadata/agg_match/table/DEFAULT.TEST_KYLIN_FACT.json
@@ -0,0 +1,74 @@
+{
+  "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.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"
+  }, {
+    "id" : "12",
+    "name" : "IS_EFFECTUAL",
+    "datatype" : "boolean",
+    "data_gen" : "true|false|TRUE|FALSE|True|False"
+  } ],
+  "database" : "DEFAULT",
+  "last_modified" : 0,
+  "source_type" : 9
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/_global/project/joins_graph_left_or_inner.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/_global/project/joins_graph_left_or_inner.json
new file mode 100644
index 0000000000..db408a1516
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/_global/project/joins_graph_left_or_inner.json
@@ -0,0 +1,35 @@
+{
+  "uuid" : "b5bf3626-bce5-33a2-55d3-3a057b6f19d9",
+  "last_modified" : 1641870028099,
+  "create_time" : 1641378181657,
+  "version" : "4.0.0.0",
+  "name" : "joins_graph_left_or_inner",
+  "owner" : "ADMIN",
+  "status" : "ENABLED",
+  "create_time_utc" : 1641378181657,
+  "default_database" : "DEFAULT",
+  "description" : "",
+  "principal" : null,
+  "keytab" : null,
+  "maintain_model_type" : "MANUAL_MAINTAIN",
+  "override_kylin_properties" : {
+    "kylin.metadata.semi-automatic-mode" : "false",
+    "kylin.query.metadata.expose-computed-column" : "true",
+    "kylin.source.default" : "9"
+  },
+  "segment_config" : {
+    "auto_merge_enabled" : false,
+    "auto_merge_time_ranges" : [ "WEEK", "MONTH", "QUARTER", "YEAR" ],
+    "volatile_range" : {
+      "volatile_range_number" : 0,
+      "volatile_range_enabled" : false,
+      "volatile_range_type" : "DAY"
+    },
+    "retention_range" : {
+      "retention_range_number" : 1,
+      "retention_range_enabled" : false,
+      "retention_range_type" : "MONTH"
+    },
+    "create_empty_segment_enabled" : false
+  }
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/dataflow/b780e4e4-69af-449e-b09f-05c90dfa04b7.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/dataflow/b780e4e4-69af-449e-b09f-05c90dfa04b7.json
new file mode 100644
index 0000000000..008de409fe
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/dataflow/b780e4e4-69af-449e-b09f-05c90dfa04b7.json
@@ -0,0 +1,81 @@
+{
+  "uuid" : "b780e4e4-69af-449e-b09f-05c90dfa04b7",
+  "last_modified" : 1604998096140,
+  "create_time" : 1604997347265,
+  "version" : "4.0.0.0",
+  "description" : null,
+  "owner" : "ADMIN",
+  "mp_values" : [ ],
+  "create_time_utc" : 1604997347266,
+  "status" : "ONLINE",
+  "cost" : 50,
+  "query_hit_count" : 0,
+  "last_query_time" : 0,
+  "layout_query_hit_count" : { },
+  "event_error" : false,
+  "segments" : [ {
+    "id" : "0db919f3-1359-496c-aab5-b6f3951adc1e",
+    "name" : "20201102000000_20201103000000",
+    "create_time_utc" : 1604997983129,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1604246400000,
+      "date_range_end" : 1604332800000
+    },
+    "timeRange" : null,
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 0,
+    "source_count" : -1,
+    "source_bytes_size" : 20480,
+    "column_source_bytes" : { },
+    "ori_snapshot_size" : {
+      "DEFAULT.TEST_BANK_LOCATION" : 27
+    },
+    "additionalInfo" : { },
+    "is_encoding_data_skew" : false,
+    "is_snapshot_ready" : true,
+    "is_dict_ready" : true,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ {
+      "partition_id" : 7,
+      "create_time_utc" : 0,
+      "status" : "READY",
+      "dictionaries" : null,
+      "snapshots" : null,
+      "last_build_time" : 1604997983134,
+      "source_count" : 12,
+      "source_bytes_size" : -1,
+      "column_source_bytes" : { },
+      "ori_snapshot_size" : { },
+      "additionalInfo" : { },
+      "is_encoding_data_skew" : false,
+      "is_snapshot_ready" : false,
+      "is_dict_ready" : false,
+      "is_flat_table_ready" : false,
+      "is_fact_view_ready" : false
+    }, {
+      "partition_id" : 8,
+      "create_time_utc" : 0,
+      "status" : "READY",
+      "dictionaries" : null,
+      "snapshots" : null,
+      "last_build_time" : 1604997983134,
+      "source_count" : 20,
+      "source_bytes_size" : -1,
+      "column_source_bytes" : { },
+      "ori_snapshot_size" : { },
+      "additionalInfo" : { },
+      "is_encoding_data_skew" : false,
+      "is_snapshot_ready" : false,
+      "is_dict_ready" : false,
+      "is_flat_table_ready" : false,
+      "is_fact_view_ready" : false
+    } ],
+    "max_bucket_id" : 29
+  }],
+  "storage_location_identifier" : null
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/dataflow_details/b780e4e4-69af-449e-b09f-05c90dfa04b7/0db919f3-1359-496c-aab5-b6f3951adc1e.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/dataflow_details/b780e4e4-69af-449e-b09f-05c90dfa04b7/0db919f3-1359-496c-aab5-b6f3951adc1e.json
new file mode 100644
index 0000000000..369757482e
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/dataflow_details/b780e4e4-69af-449e-b09f-05c90dfa04b7/0db919f3-1359-496c-aab5-b6f3951adc1e.json
@@ -0,0 +1,533 @@
+{
+  "uuid" : "0db919f3-1359-496c-aab5-b6f3951adc1e",
+  "last_modified" : 1604997983130,
+  "create_time" : 1604997983130,
+  "version" : "4.0.0.0",
+  "dataflow" : "b780e4e4-69af-449e-b09f-05c90dfa04b7",
+  "layout_instances" : [ {
+    "layout_id" : 110001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998030023,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 21,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1696,
+      "file_count" : 1,
+      "source_rows" : 4,
+      "source_byte_size" : 0,
+      "create_time" : 1604998030024,
+      "update_time" : 1604998030024
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 20,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1703,
+      "file_count" : 1,
+      "source_rows" : 4,
+      "source_byte_size" : 0,
+      "create_time" : 1604998030024,
+      "update_time" : 1604998030024
+    } ]
+  }, {
+    "layout_id" : 70001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998033738,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 17,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1460,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 16,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1467,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    } ]
+  }, {
+    "layout_id" : 80001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998033738,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 9,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1418,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 8,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1425,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    } ]
+  }, {
+    "layout_id" : 140001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998033738,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 7,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1488,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 6,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1495,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    } ]
+  }, {
+    "layout_id" : 100001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998033738,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 27,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1702,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 26,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1709,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998033738,
+      "update_time" : 1604998033738
+    } ]
+  }, {
+    "layout_id" : 120001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998038296,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 3,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1488,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 2,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1495,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    } ]
+  }, {
+    "layout_id" : 1,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998038296,
+    "multi_partition" : [ {
+      "partition_id" : 7,
+      "bucket_id" : 0,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1467,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    }, {
+      "partition_id" : 8,
+      "bucket_id" : 1,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1460,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    } ]
+  }, {
+    "layout_id" : 90001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998038296,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 19,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 1,
+      "byte_size" : 1166,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 18,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 1,
+      "byte_size" : 1173,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    } ]
+  }, {
+    "layout_id" : 20001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998038296,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 13,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1204,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 12,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1211,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    } ]
+  }, {
+    "layout_id" : 10001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998038296,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 23,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1418,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 22,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1425,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    } ]
+  }, {
+    "layout_id" : 130001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998038296,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 29,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1176,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 28,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1183,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998038296,
+      "update_time" : 1604998038296
+    } ]
+  }, {
+    "layout_id" : 30001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998041293,
+    "multi_partition" : [ {
+      "partition_id" : 7,
+      "bucket_id" : 24,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 1,
+      "byte_size" : 1173,
+      "file_count" : 1,
+      "source_rows" : 1,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    }, {
+      "partition_id" : 8,
+      "bucket_id" : 25,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 1,
+      "byte_size" : 1166,
+      "file_count" : 1,
+      "source_rows" : 1,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    } ]
+  }, {
+    "layout_id" : 40001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998041293,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 11,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1176,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 10,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1183,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    } ]
+  }, {
+    "layout_id" : 50001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998041293,
+    "multi_partition" : [ {
+      "partition_id" : 8,
+      "bucket_id" : 15,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1204,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    }, {
+      "partition_id" : 7,
+      "bucket_id" : 14,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 2,
+      "byte_size" : 1211,
+      "file_count" : 1,
+      "source_rows" : 2,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    } ]
+  }, {
+    "layout_id" : 60001,
+    "build_job_id" : null,
+    "rows" : 0,
+    "byte_size" : 0,
+    "file_count" : 0,
+    "source_rows" : 0,
+    "source_byte_size" : 0,
+    "partition_num" : 0,
+    "partition_values" : [ ],
+    "is_ready" : false,
+    "create_time" : 1604998041293,
+    "multi_partition" : [ {
+      "partition_id" : 7,
+      "bucket_id" : 4,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 1,
+      "byte_size" : 913,
+      "file_count" : 1,
+      "source_rows" : 1,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    }, {
+      "partition_id" : 8,
+      "bucket_id" : 5,
+      "build_job_id" : "46f48eeb-7b51-41ff-ad7a-c97767070f10",
+      "rows" : 1,
+      "byte_size" : 906,
+      "file_count" : 1,
+      "source_rows" : 1,
+      "source_byte_size" : 0,
+      "create_time" : 1604998041293,
+      "update_time" : 1604998041293
+    } ]
+  } ]
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/index_plan/b780e4e4-69af-449e-b09f-05c90dfa04b7.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/index_plan/b780e4e4-69af-449e-b09f-05c90dfa04b7.json
new file mode 100644
index 0000000000..2f3e2be5ec
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/index_plan/b780e4e4-69af-449e-b09f-05c90dfa04b7.json
@@ -0,0 +1,40 @@
+{
+  "uuid" : "b780e4e4-69af-449e-b09f-05c90dfa04b7",
+  "last_modified" : 1604998096145,
+  "create_time" : 1604997347244,
+  "version" : "4.0.0.0",
+  "description" : null,
+  "rule_based_index" : {
+    "dimensions" : [ 0, 1, 2, 3 ],
+    "measures" : [ 100000, 100001 ],
+    "global_dim_cap" : null,
+    "aggregation_groups" : [ {
+      "includes" : [ 0, 1, 2, 3 ],
+      "measures" : [ 100001, 100000 ],
+      "select_rule" : {
+        "hierarchy_dims" : [ ],
+        "mandatory_dims" : [ ],
+        "joint_dims" : [ ]
+      }
+    } ],
+    "layout_id_mapping" : [ 1, 10001, 20001, 30001, 40001, 50001, 60001, 70001, 80001, 90001, 100001, 110001, 120001, 130001, 140001 ],
+    "parent_forward" : 3,
+    "index_start_id" : 0,
+    "last_modify_time" : 1604997418355,
+    "layout_black_list" : [ ],
+    "scheduler_version" : 2
+  },
+  "indexes" : [ ],
+  "override_properties" : { },
+  "to_be_deleted_indexes" : [ ],
+  "auto_merge_time_ranges" : null,
+  "retention_range" : 0,
+  "engine_type" : 80,
+  "next_aggregation_index_id" : 150000,
+  "next_table_index_id" : 20000000000,
+  "agg_shard_by_columns" : [ ],
+  "extend_partition_columns" : [ ],
+  "layout_bucket_num" : { },
+  "approved_additional_recs" : 0,
+  "approved_removal_recs" : 0
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/model_desc/b780e4e4-69af-449e-b09f-05c90dfa04b7.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/model_desc/b780e4e4-69af-449e-b09f-05c90dfa04b7.json
new file mode 100644
index 0000000000..fd36cff780
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/model_desc/b780e4e4-69af-449e-b09f-05c90dfa04b7.json
@@ -0,0 +1,137 @@
+{
+  "uuid" : "b780e4e4-69af-449e-b09f-05c90dfa04b7",
+  "last_modified" : 1604998041066,
+  "create_time" : 1604997344237,
+  "version" : "4.0.0.0",
+  "alias" : "test_bank_2",
+  "owner" : "ADMIN",
+  "config_last_modifier" : null,
+  "config_last_modified" : 0,
+  "description" : "",
+  "fact_table" : "DEFAULT.TEST_BANK_INCOME",
+  "fact_table_alias" : null,
+  "management_type" : "MODEL_BASED",
+  "join_tables" : [ {
+    "table" : "DEFAULT.TEST_BANK_LOCATION",
+    "kind" : "LOOKUP",
+    "alias" : "TEST_BANK_LOCATION",
+    "join" : {
+      "type" : "LEFT",
+      "primary_key" : [ "TEST_BANK_LOCATION.COUNTRY" ],
+      "foreign_key" : [ "TEST_BANK_INCOME.COUNTRY" ],
+      "non_equi_join_condition" : null,
+      "primary_table" : null,
+      "foreign_table" : null
+    },
+    "join_relation_type" : "MANY_TO_ONE"
+  } ],
+  "filter_condition" : "",
+  "partition_desc" : {
+    "partition_date_column" : "TEST_BANK_INCOME.DT",
+    "partition_date_start" : 0,
+    "partition_date_format" : "yyyy-MM-dd",
+    "partition_type" : "APPEND",
+    "partition_condition_builder" : "org.apache.kylin.metadata.model.PartitionDesc$DefaultPartitionConditionBuilder"
+  },
+  "capacity" : "MEDIUM",
+  "segment_config" : {
+    "auto_merge_enabled" : null,
+    "auto_merge_time_ranges" : null,
+    "volatile_range" : null,
+    "retention_range" : null,
+    "create_empty_segment_enabled" : false
+  },
+  "data_check_desc" : null,
+  "semantic_version" : 1,
+  "storage_type" : 0,
+  "all_named_columns" : [ {
+    "id" : 0,
+    "name" : "COUNTRY",
+    "column" : "TEST_BANK_INCOME.COUNTRY",
+    "status" : "DIMENSION"
+  }, {
+    "id" : 1,
+    "name" : "INCOME",
+    "column" : "TEST_BANK_INCOME.INCOME",
+    "status" : "DIMENSION"
+  }, {
+    "id" : 2,
+    "name" : "NAME",
+    "column" : "TEST_BANK_INCOME.NAME",
+    "status" : "DIMENSION"
+  }, {
+    "id" : 3,
+    "name" : "DT",
+    "column" : "TEST_BANK_INCOME.DT",
+    "status" : "DIMENSION"
+  }, {
+    "id" : 4,
+    "name" : "COUNTRY",
+    "column" : "TEST_BANK_LOCATION.COUNTRY"
+  }, {
+    "id" : 5,
+    "name" : "OWNER",
+    "column" : "TEST_BANK_LOCATION.OWNER"
+  }, {
+    "id" : 6,
+    "name" : "LOCATION",
+    "column" : "TEST_BANK_LOCATION.LOCATION"
+  } ],
+  "all_measures" : [ {
+    "name" : "SUM_INCOME",
+    "function" : {
+      "expression" : "SUM",
+      "parameters" : [ {
+        "type" : "column",
+        "value" : "TEST_BANK_INCOME.INCOME"
+      } ],
+      "returntype" : "bigint"
+    },
+    "id" : 100000
+  }, {
+    "name" : "COUNT_ALL",
+    "function" : {
+      "expression" : "COUNT",
+      "parameters" : [ {
+        "type" : "constant",
+        "value" : "1"
+      } ],
+      "returntype" : "bigint"
+    },
+    "id" : 100001
+  } ],
+  "computed_columns" : [ ],
+  "canvas" : {
+    "coordinate" : {
+      "TEST_BANK_INCOME" : {
+        "x" : 529.2222256130642,
+        "y" : 151.27777099609375,
+        "width" : 220.0,
+        "height" : 200.0
+      },
+      "TEST_BANK_LOCATION" : {
+        "x" : 892.5555589463979,
+        "y" : 171.2777709960937,
+        "width" : 220.0,
+        "height" : 200.0
+      }
+    },
+    "zoom" : 9.0
+  },
+  "multi_partition_desc" : {
+    "columns" : [ "TEST_BANK_INCOME.COUNTRY" ],
+    "partitions" : [ {
+      "id" : 7,
+      "values" : [ "usa" ]
+    }, {
+      "id" : 8,
+      "values" : [ "cn" ]
+    }, {
+      "id" : 9,
+      "values" : [ "un" ]
+    } ],
+    "partition_condition_builder" : "org.apache.kylin.metadata.model.MultiPartitionDesc$DefaultMultiPartitionConditionBuilder",
+    "max_partition_id" : 9
+  },
+  "multi_partition_key_mapping" : null
+}
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/table/DEFAULT.TEST_BANK_INCOME.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/table/DEFAULT.TEST_BANK_INCOME.json
new file mode 100644
index 0000000000..fd8f6b8b01
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/table/DEFAULT.TEST_BANK_INCOME.json
@@ -0,0 +1,37 @@
+{
+  "uuid" : "cd19e500-6e46-4a3f-91d3-199be5757f08",
+  "last_modified" : 0,
+  "create_time" : 1604997133914,
+  "version" : "4.0.0.0",
+  "name" : "TEST_BANK_INCOME",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "NAME",
+    "datatype" : "varchar(4096)",
+    "case_sensitive_name" : null
+  }, {
+    "id" : "2",
+    "name" : "INCOME",
+    "datatype" : "bigint",
+    "case_sensitive_name" : null
+  }, {
+    "id" : "3",
+    "name" : "COUNTRY",
+    "datatype" : "varchar(4096)",
+    "case_sensitive_name" : null
+  }, {
+    "id" : "4",
+    "name" : "DT",
+    "datatype" : "varchar(4096)",
+    "case_sensitive_name" : null
+  } ],
+  "source_type" : 9,
+  "kafka_bootstrap_servers" : null,
+  "subscribe" : null,
+  "starting_offsets" : null,
+  "table_type" : "MANAGED",
+  "top" : false,
+  "increment_loading" : false,
+  "last_snapshot_path" : null,
+  "database" : "DEFAULT"
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/table/DEFAULT.TEST_BANK_LOCATION.json b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/table/DEFAULT.TEST_BANK_LOCATION.json
new file mode 100644
index 0000000000..abcea702d1
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/joins_graph_left_or_inner/metadata/joins_graph_left_or_inner/table/DEFAULT.TEST_BANK_LOCATION.json
@@ -0,0 +1,31 @@
+{
+  "uuid" : "3804d2f8-64c6-4924-b09a-c6475b1ba91c",
+  "last_modified" : 1604998096059,
+  "create_time" : 1604997133954,
+  "version" : "4.0.0.0",
+  "name" : "TEST_BANK_LOCATION",
+  "columns" : [ {
+    "id" : "1",
+    "name" : "COUNTRY",
+    "datatype" : "varchar(4096)",
+    "case_sensitive_name" : null
+  }, {
+    "id" : "2",
+    "name" : "LOCATION",
+    "datatype" : "varchar(4096)",
+    "case_sensitive_name" : null
+  }, {
+    "id" : "3",
+    "name" : "OWNER",
+    "datatype" : "varchar(4096)",
+    "case_sensitive_name" : null
+  } ],
+  "source_type" : 9,
+  "kafka_bootstrap_servers" : null,
+  "subscribe" : null,
+  "starting_offsets" : null,
+  "table_type" : "MANAGED",
+  "top" : false,
+  "increment_loading" : false,
+  "database" : "DEFAULT"
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/_global/project/multi_partition_date_type.json b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/_global/project/multi_partition_date_type.json
new file mode 100644
index 0000000000..88f4a91eac
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/_global/project/multi_partition_date_type.json
@@ -0,0 +1,35 @@
+{
+  "uuid" : "b4bf3626-bce5-33a2-55d3-3a057b6f17d9",
+  "last_modified" : 1641870028099,
+  "create_time" : 1641378181657,
+  "version" : "4.0.0.0",
+  "name" : "multi_partition_date_type",
+  "owner" : "ADMIN",
+  "status" : "ENABLED",
+  "create_time_utc" : 1641378181657,
+  "default_database" : "DEFAULT",
+  "description" : "",
+  "principal" : null,
+  "keytab" : null,
+  "maintain_model_type" : "MANUAL_MAINTAIN",
+  "override_kylin_properties" : {
+    "kylin.metadata.semi-automatic-mode" : "false",
+    "kylin.query.metadata.expose-computed-column" : "true",
+    "kylin.source.default" : "9"
+  },
+  "segment_config" : {
+    "auto_merge_enabled" : false,
+    "auto_merge_time_ranges" : [ "WEEK", "MONTH", "QUARTER", "YEAR" ],
+    "volatile_range" : {
+      "volatile_range_number" : 0,
+      "volatile_range_enabled" : false,
+      "volatile_range_type" : "DAY"
+    },
+    "retention_range" : {
+      "retention_range_number" : 1,
+      "retention_range_enabled" : false,
+      "retention_range_type" : "MONTH"
+    },
+    "create_empty_segment_enabled" : false
+  }
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/00a91916-d31e-ed40-b1ba-4a86765072f6.json b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/00a91916-d31e-ed40-b1ba-4a86765072f6.json
new file mode 100644
index 0000000000..f33673d63e
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/00a91916-d31e-ed40-b1ba-4a86765072f6.json
@@ -0,0 +1,3148 @@
+{
+  "uuid" : "00a91916-d31e-ed40-b1ba-4a86765072f6",
+  "last_modified" : 1641894356392,
+  "create_time" : 1641809044502,
+  "version" : "4.0.0.0",
+  "status" : "ONLINE",
+  "cost" : 50,
+  "query_hit_count" : 46,
+  "last_query_time" : 1641893393607,
+  "layout_query_hit_count" : {
+    "20000000001" : {
+      "1641744000000" : 12,
+      "1641830400000" : 27
+    },
+    "-1" : {
+      "1641830400000" : 7
+    }
+  },
+  "segments" : [ {
+    "id" : "05553210-7651-60ea-743c-83021f489607",
+    "name" : "20211218000000_20211219000000",
+    "create_time_utc" : 1641809079502,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1639807200000,
+      "date_range_end" : 1639893600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "19634",
+        "max" : "19999"
+      },
+      "23" : {
+        "min" : "19634",
+        "max" : "19999"
+      },
+      "24" : {
+        "min" : "1639806729180",
+        "max" : "1639843229175"
+      },
+      "10" : {
+        "min" : "19634",
+        "max" : "19999"
+      },
+      "11" : {
+        "min" : "1639806729180",
+        "max" : "1639843229175"
+      },
+      "12" : {
+        "min" : "198.0",
+        "max" : "201.0"
+      },
+      "13" : {
+        "min" : "2021-12-18",
+        "max" : "2021-12-18"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "30",
+        "max" : "30"
+      },
+      "16" : {
+        "min" : "2021-12-18",
+        "max" : "2021-12-19"
+      },
+      "17" : {
+        "min" : "10019634",
+        "max" : "10019999"
+      },
+      "18" : {
+        "min" : "2021-12-18 13:52:19.0",
+        "max" : "2021-12-19 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "198.0",
+        "max" : "201.0"
+      },
+      "1" : {
+        "min" : "2021-12-18",
+        "max" : "2021-12-18"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "30",
+        "max" : "30"
+      },
+      "4" : {
+        "min" : "2021-12-18",
+        "max" : "2021-12-19"
+      },
+      "5" : {
+        "min" : "10019634",
+        "max" : "10019999"
+      },
+      "6" : {
+        "min" : "2021-12-18 13:52:19.0",
+        "max" : "2021-12-19 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "28.00",
+        "max" : "28.00"
+      },
+      "9" : {
+        "min" : "'abc_4_19634'",
+        "max" : "'abc_4_19999'"
+      },
+      "20" : {
+        "min" : "28.00",
+        "max" : "28.00"
+      },
+      "21" : {
+        "min" : "'abc_4_19634'",
+        "max" : "'abc_4_19999'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809386815,
+    "source_count" : 366,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 4758,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 4758,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 366,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 3660,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 7686,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 366,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 4758,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 732,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 3660,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 2928,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 3660,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 366,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 4758,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 732,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 1830,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 7686,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 3660,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 2928,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 366
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "ca629942-7936-2390-ea7f-f930cc569d31",
+    "name" : "20211219000000_20211220000000",
+    "create_time_utc" : 1641809088286,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1639893600000,
+      "date_range_end" : 1639980000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "18770",
+        "max" : "19633"
+      },
+      "23" : {
+        "min" : "18770",
+        "max" : "19633"
+      },
+      "24" : {
+        "min" : "1639843329175",
+        "max" : "1639929629162"
+      },
+      "10" : {
+        "min" : "18770",
+        "max" : "19633"
+      },
+      "11" : {
+        "min" : "1639843329175",
+        "max" : "1639929629162"
+      },
+      "12" : {
+        "min" : "189.0",
+        "max" : "198.0"
+      },
+      "13" : {
+        "min" : "2021-12-19",
+        "max" : "2021-12-19"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "29",
+        "max" : "30"
+      },
+      "16" : {
+        "min" : "2021-12-19",
+        "max" : "2021-12-20"
+      },
+      "17" : {
+        "min" : "10018770",
+        "max" : "10019633"
+      },
+      "18" : {
+        "min" : "2021-12-19 00:02:19.0",
+        "max" : "2021-12-20 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "189.0",
+        "max" : "198.0"
+      },
+      "1" : {
+        "min" : "2021-12-19",
+        "max" : "2021-12-19"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "29",
+        "max" : "30"
+      },
+      "4" : {
+        "min" : "2021-12-19",
+        "max" : "2021-12-20"
+      },
+      "5" : {
+        "min" : "10018770",
+        "max" : "10019633"
+      },
+      "6" : {
+        "min" : "2021-12-19 00:02:19.0",
+        "max" : "2021-12-20 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "27.00",
+        "max" : "28.00"
+      },
+      "9" : {
+        "min" : "'abc_4_18770'",
+        "max" : "'abc_4_19633'"
+      },
+      "20" : {
+        "min" : "27.00",
+        "max" : "28.00"
+      },
+      "21" : {
+        "min" : "'abc_4_18770'",
+        "max" : "'abc_4_19633'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809419064,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "b57bf9fb-4a92-7b2c-2e48-b26ce091ef5a",
+    "name" : "20211220000000_20211221000000",
+    "create_time_utc" : 1641809095837,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1639980000000,
+      "date_range_end" : 1640066400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "17906",
+        "max" : "18769"
+      },
+      "23" : {
+        "min" : "17906",
+        "max" : "18769"
+      },
+      "24" : {
+        "min" : "1639929729162",
+        "max" : "1640016029150"
+      },
+      "10" : {
+        "min" : "17906",
+        "max" : "18769"
+      },
+      "11" : {
+        "min" : "1639929729162",
+        "max" : "1640016029150"
+      },
+      "12" : {
+        "min" : "181.0",
+        "max" : "189.0"
+      },
+      "13" : {
+        "min" : "2021-12-20",
+        "max" : "2021-12-20"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "28",
+        "max" : "29"
+      },
+      "16" : {
+        "min" : "2021-12-20",
+        "max" : "2021-12-21"
+      },
+      "17" : {
+        "min" : "10017906",
+        "max" : "10018769"
+      },
+      "18" : {
+        "min" : "2021-12-20 00:02:19.0",
+        "max" : "2021-12-21 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "181.0",
+        "max" : "189.0"
+      },
+      "1" : {
+        "min" : "2021-12-20",
+        "max" : "2021-12-20"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "28",
+        "max" : "29"
+      },
+      "4" : {
+        "min" : "2021-12-20",
+        "max" : "2021-12-21"
+      },
+      "5" : {
+        "min" : "10017906",
+        "max" : "10018769"
+      },
+      "6" : {
+        "min" : "2021-12-20 00:02:19.0",
+        "max" : "2021-12-21 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "26.00",
+        "max" : "27.00"
+      },
+      "9" : {
+        "min" : "'abc_4_17906'",
+        "max" : "'abc_4_18769'"
+      },
+      "20" : {
+        "min" : "26.00",
+        "max" : "27.00"
+      },
+      "21" : {
+        "min" : "'abc_4_17906'",
+        "max" : "'abc_4_18769'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809410376,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "2e168056-16a1-e0a0-908f-f496efdd01b3",
+    "name" : "20211221000000_20211222000000",
+    "create_time_utc" : 1641809102891,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640066400000,
+      "date_range_end" : 1640152800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "17042",
+        "max" : "17905"
+      },
+      "23" : {
+        "min" : "17042",
+        "max" : "17905"
+      },
+      "24" : {
+        "min" : "1640016129150",
+        "max" : "1640102429138"
+      },
+      "10" : {
+        "min" : "17042",
+        "max" : "17905"
+      },
+      "11" : {
+        "min" : "1640016129150",
+        "max" : "1640102429138"
+      },
+      "12" : {
+        "min" : "172.0",
+        "max" : "181.0"
+      },
+      "13" : {
+        "min" : "2021-12-21",
+        "max" : "2021-12-21"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "28",
+        "max" : "28"
+      },
+      "16" : {
+        "min" : "2021-12-21",
+        "max" : "2021-12-22"
+      },
+      "17" : {
+        "min" : "10017042",
+        "max" : "10017905"
+      },
+      "18" : {
+        "min" : "2021-12-21 00:02:19.0",
+        "max" : "2021-12-22 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "172.0",
+        "max" : "181.0"
+      },
+      "1" : {
+        "min" : "2021-12-21",
+        "max" : "2021-12-21"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "28",
+        "max" : "28"
+      },
+      "4" : {
+        "min" : "2021-12-21",
+        "max" : "2021-12-22"
+      },
+      "5" : {
+        "min" : "10017042",
+        "max" : "10017905"
+      },
+      "6" : {
+        "min" : "2021-12-21 00:02:19.0",
+        "max" : "2021-12-22 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "26.00",
+        "max" : "26.00"
+      },
+      "9" : {
+        "min" : "'abc_4_17042'",
+        "max" : "'abc_4_17905'"
+      },
+      "20" : {
+        "min" : "26.00",
+        "max" : "26.00"
+      },
+      "21" : {
+        "min" : "'abc_4_17042'",
+        "max" : "'abc_4_17905'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809554565,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "bb61d245-16af-e601-efb6-55e1f0d793db",
+    "name" : "20211222000000_20211223000000",
+    "create_time_utc" : 1641809110690,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640152800000,
+      "date_range_end" : 1640239200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "16178",
+        "max" : "17041"
+      },
+      "23" : {
+        "min" : "16178",
+        "max" : "17041"
+      },
+      "24" : {
+        "min" : "1640102529138",
+        "max" : "1640188829126"
+      },
+      "10" : {
+        "min" : "16178",
+        "max" : "17041"
+      },
+      "11" : {
+        "min" : "1640102529138",
+        "max" : "1640188829126"
+      },
+      "12" : {
+        "min" : "163.0",
+        "max" : "172.0"
+      },
+      "13" : {
+        "min" : "2021-12-22",
+        "max" : "2021-12-22"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "27",
+        "max" : "28"
+      },
+      "16" : {
+        "min" : "2021-12-22",
+        "max" : "2021-12-23"
+      },
+      "17" : {
+        "min" : "10016178",
+        "max" : "10017041"
+      },
+      "18" : {
+        "min" : "2021-12-22 00:02:19.0",
+        "max" : "2021-12-23 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "163.0",
+        "max" : "172.0"
+      },
+      "1" : {
+        "min" : "2021-12-22",
+        "max" : "2021-12-22"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "27",
+        "max" : "28"
+      },
+      "4" : {
+        "min" : "2021-12-22",
+        "max" : "2021-12-23"
+      },
+      "5" : {
+        "min" : "10016178",
+        "max" : "10017041"
+      },
+      "6" : {
+        "min" : "2021-12-22 00:02:19.0",
+        "max" : "2021-12-23 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "25.00",
+        "max" : "26.00"
+      },
+      "9" : {
+        "min" : "'abc_4_16178'",
+        "max" : "'abc_4_17041'"
+      },
+      "20" : {
+        "min" : "25.00",
+        "max" : "26.00"
+      },
+      "21" : {
+        "min" : "'abc_4_16178'",
+        "max" : "'abc_4_17041'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809861749,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "b6bc645f-9cef-6991-70d3-424f8c43051e",
+    "name" : "20211223000000_20211224000000",
+    "create_time_utc" : 1641809119096,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640239200000,
+      "date_range_end" : 1640325600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "15314",
+        "max" : "16177"
+      },
+      "23" : {
+        "min" : "15314",
+        "max" : "16177"
+      },
+      "24" : {
+        "min" : "1640188929126",
+        "max" : "1640275229112"
+      },
+      "10" : {
+        "min" : "15314",
+        "max" : "16177"
+      },
+      "11" : {
+        "min" : "1640188929126",
+        "max" : "1640275229112"
+      },
+      "12" : {
+        "min" : "155.0",
+        "max" : "163.0"
+      },
+      "13" : {
+        "min" : "2021-12-23",
+        "max" : "2021-12-23"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "26",
+        "max" : "27"
+      },
+      "16" : {
+        "min" : "2021-12-23",
+        "max" : "2021-12-24"
+      },
+      "17" : {
+        "min" : "10015314",
+        "max" : "10016177"
+      },
+      "18" : {
+        "min" : "2021-12-23 00:02:19.0",
+        "max" : "2021-12-24 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "155.0",
+        "max" : "163.0"
+      },
+      "1" : {
+        "min" : "2021-12-23",
+        "max" : "2021-12-23"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "26",
+        "max" : "27"
+      },
+      "4" : {
+        "min" : "2021-12-23",
+        "max" : "2021-12-24"
+      },
+      "5" : {
+        "min" : "10015314",
+        "max" : "10016177"
+      },
+      "6" : {
+        "min" : "2021-12-23 00:02:19.0",
+        "max" : "2021-12-24 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "24.00",
+        "max" : "25.00"
+      },
+      "9" : {
+        "min" : "'abc_4_15314'",
+        "max" : "'abc_4_16177'"
+      },
+      "20" : {
+        "min" : "24.00",
+        "max" : "25.00"
+      },
+      "21" : {
+        "min" : "'abc_4_15314'",
+        "max" : "'abc_4_16177'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809543769,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "4ff7c101-e4db-67b0-0be8-3ed19f58e74c",
+    "name" : "20211224000000_20211225000000",
+    "create_time_utc" : 1641809125878,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640325600000,
+      "date_range_end" : 1640412000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "14450",
+        "max" : "15313"
+      },
+      "23" : {
+        "min" : "14450",
+        "max" : "15313"
+      },
+      "24" : {
+        "min" : "1640275329112",
+        "max" : "1640361629096"
+      },
+      "10" : {
+        "min" : "14450",
+        "max" : "15313"
+      },
+      "11" : {
+        "min" : "1640275329112",
+        "max" : "1640361629096"
+      },
+      "12" : {
+        "min" : "146.0",
+        "max" : "155.0"
+      },
+      "13" : {
+        "min" : "2021-12-24",
+        "max" : "2021-12-24"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "25",
+        "max" : "26"
+      },
+      "16" : {
+        "min" : "2021-12-24",
+        "max" : "2021-12-25"
+      },
+      "17" : {
+        "min" : "10014450",
+        "max" : "10015313"
+      },
+      "18" : {
+        "min" : "2021-12-24 00:02:19.0",
+        "max" : "2021-12-25 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "146.0",
+        "max" : "155.0"
+      },
+      "1" : {
+        "min" : "2021-12-24",
+        "max" : "2021-12-24"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "25",
+        "max" : "26"
+      },
+      "4" : {
+        "min" : "2021-12-24",
+        "max" : "2021-12-25"
+      },
+      "5" : {
+        "min" : "10014450",
+        "max" : "10015313"
+      },
+      "6" : {
+        "min" : "2021-12-24 00:02:19.0",
+        "max" : "2021-12-25 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "23.00",
+        "max" : "24.00"
+      },
+      "9" : {
+        "min" : "'abc_4_14450'",
+        "max" : "'abc_4_15313'"
+      },
+      "20" : {
+        "min" : "23.00",
+        "max" : "24.00"
+      },
+      "21" : {
+        "min" : "'abc_4_14450'",
+        "max" : "'abc_4_15313'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809975894,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "eaf3e7f2-f5aa-772d-5e5c-29f04d369024",
+    "name" : "20211225000000_20211226000000",
+    "create_time_utc" : 1641809133153,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640412000000,
+      "date_range_end" : 1640498400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "13586",
+        "max" : "14449"
+      },
+      "23" : {
+        "min" : "13586",
+        "max" : "14449"
+      },
+      "24" : {
+        "min" : "1640361729096",
+        "max" : "1640448029078"
+      },
+      "10" : {
+        "min" : "13586",
+        "max" : "14449"
+      },
+      "11" : {
+        "min" : "1640361729096",
+        "max" : "1640448029078"
+      },
+      "12" : {
+        "min" : "137.0",
+        "max" : "146.0"
+      },
+      "13" : {
+        "min" : "2021-12-25",
+        "max" : "2021-12-25"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "24",
+        "max" : "25"
+      },
+      "16" : {
+        "min" : "2021-12-25",
+        "max" : "2021-12-26"
+      },
+      "17" : {
+        "min" : "10013586",
+        "max" : "10014449"
+      },
+      "18" : {
+        "min" : "2021-12-25 00:02:19.0",
+        "max" : "2021-12-26 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "137.0",
+        "max" : "146.0"
+      },
+      "1" : {
+        "min" : "2021-12-25",
+        "max" : "2021-12-25"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "24",
+        "max" : "25"
+      },
+      "4" : {
+        "min" : "2021-12-25",
+        "max" : "2021-12-26"
+      },
+      "5" : {
+        "min" : "10013586",
+        "max" : "10014449"
+      },
+      "6" : {
+        "min" : "2021-12-25 00:02:19.0",
+        "max" : "2021-12-26 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "22.00",
+        "max" : "23.00"
+      },
+      "9" : {
+        "min" : "'abc_4_13586'",
+        "max" : "'abc_4_14449'"
+      },
+      "20" : {
+        "min" : "22.00",
+        "max" : "23.00"
+      },
+      "21" : {
+        "min" : "'abc_4_13586'",
+        "max" : "'abc_4_14449'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809857713,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "5380f24f-2695-9191-89b8-2b5ecb1927f3",
+    "name" : "20211226000000_20211227000000",
+    "create_time_utc" : 1641809141010,
+    "status" : "NEW",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640498400000,
+      "date_range_end" : 1640584800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : { },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 0,
+    "source_count" : 0,
+    "source_bytes_size" : 0,
+    "column_source_bytes" : { },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : false,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "3c873a2c-2a5b-b9e4-5133-99ef29826313",
+    "name" : "20211227000000_20211228000000",
+    "create_time_utc" : 1641809148412,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640584800000,
+      "date_range_end" : 1640671200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "11858",
+        "max" : "12721"
+      },
+      "23" : {
+        "min" : "11858",
+        "max" : "12721"
+      },
+      "24" : {
+        "min" : "1640534529067",
+        "max" : "1640620829054"
+      },
+      "10" : {
+        "min" : "11858",
+        "max" : "12721"
+      },
+      "11" : {
+        "min" : "1640534529067",
+        "max" : "1640620829054"
+      },
+      "12" : {
+        "min" : "120.0",
+        "max" : "129.0"
+      },
+      "13" : {
+        "min" : "2021-12-27",
+        "max" : "2021-12-27"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "22",
+        "max" : "23"
+      },
+      "16" : {
+        "min" : "2021-12-27",
+        "max" : "2021-12-28"
+      },
+      "17" : {
+        "min" : "10011858",
+        "max" : "10012721"
+      },
+      "18" : {
+        "min" : "2021-12-27 00:02:19.0",
+        "max" : "2021-12-28 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "120.0",
+        "max" : "129.0"
+      },
+      "1" : {
+        "min" : "2021-12-27",
+        "max" : "2021-12-27"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "22",
+        "max" : "23"
+      },
+      "4" : {
+        "min" : "2021-12-27",
+        "max" : "2021-12-28"
+      },
+      "5" : {
+        "min" : "10011858",
+        "max" : "10012721"
+      },
+      "6" : {
+        "min" : "2021-12-27 00:02:19.0",
+        "max" : "2021-12-28 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "20.00",
+        "max" : "21.00"
+      },
+      "9" : {
+        "min" : "'abc_4_11858'",
+        "max" : "'abc_4_12721'"
+      },
+      "20" : {
+        "min" : "20.00",
+        "max" : "21.00"
+      },
+      "21" : {
+        "min" : "'abc_4_11858'",
+        "max" : "'abc_4_12721'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641810399465,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "21a0eaca-ab52-6008-2efa-40e324ee6d94",
+    "name" : "20211228000000_20211229000000",
+    "create_time_utc" : 1641809155138,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640671200000,
+      "date_range_end" : 1640757600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "10994",
+        "max" : "11857"
+      },
+      "23" : {
+        "min" : "10994",
+        "max" : "11857"
+      },
+      "24" : {
+        "min" : "1640620929054",
+        "max" : "1640707229035"
+      },
+      "10" : {
+        "min" : "10994",
+        "max" : "11857"
+      },
+      "11" : {
+        "min" : "1640620929054",
+        "max" : "1640707229035"
+      },
+      "12" : {
+        "min" : "111.0",
+        "max" : "120.0"
+      },
+      "13" : {
+        "min" : "2021-12-28",
+        "max" : "2021-12-28"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "21",
+        "max" : "22"
+      },
+      "16" : {
+        "min" : "2021-12-28",
+        "max" : "2021-12-29"
+      },
+      "17" : {
+        "min" : "10010994",
+        "max" : "10011857"
+      },
+      "18" : {
+        "min" : "2021-12-28 00:02:19.0",
+        "max" : "2021-12-29 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "111.0",
+        "max" : "120.0"
+      },
+      "1" : {
+        "min" : "2021-12-28",
+        "max" : "2021-12-28"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "21",
+        "max" : "22"
+      },
+      "4" : {
+        "min" : "2021-12-28",
+        "max" : "2021-12-29"
+      },
+      "5" : {
+        "min" : "10010994",
+        "max" : "10011857"
+      },
+      "6" : {
+        "min" : "2021-12-28 00:02:19.0",
+        "max" : "2021-12-29 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "19.00",
+        "max" : "20.00"
+      },
+      "9" : {
+        "min" : "'abc_4_10994'",
+        "max" : "'abc_4_11857'"
+      },
+      "20" : {
+        "min" : "19.00",
+        "max" : "20.00"
+      },
+      "21" : {
+        "min" : "'abc_4_10994'",
+        "max" : "'abc_4_11857'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809562205,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "70eca635-76ca-73e9-04e7-c175ee8b98c9",
+    "name" : "20211229000000_20211230000000",
+    "create_time_utc" : 1641809162031,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640757600000,
+      "date_range_end" : 1640844000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "10130",
+        "max" : "10993"
+      },
+      "23" : {
+        "min" : "10130",
+        "max" : "10993"
+      },
+      "24" : {
+        "min" : "1640707329035",
+        "max" : "1640793629017"
+      },
+      "10" : {
+        "min" : "10130",
+        "max" : "10993"
+      },
+      "11" : {
+        "min" : "1640707329035",
+        "max" : "1640793629017"
+      },
+      "12" : {
+        "min" : "103.0",
+        "max" : "111.0"
+      },
+      "13" : {
+        "min" : "2021-12-29",
+        "max" : "2021-12-29"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "21",
+        "max" : "21"
+      },
+      "16" : {
+        "min" : "2021-12-29",
+        "max" : "2021-12-30"
+      },
+      "17" : {
+        "min" : "10010130",
+        "max" : "10010993"
+      },
+      "18" : {
+        "min" : "2021-12-29 00:02:19.0",
+        "max" : "2021-12-30 00:00:39.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "103.0",
+        "max" : "111.0"
+      },
+      "1" : {
+        "min" : "2021-12-29",
+        "max" : "2021-12-29"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "21",
+        "max" : "21"
+      },
+      "4" : {
+        "min" : "2021-12-29",
+        "max" : "2021-12-30"
+      },
+      "5" : {
+        "min" : "10010130",
+        "max" : "10010993"
+      },
+      "6" : {
+        "min" : "2021-12-29 00:02:19.0",
+        "max" : "2021-12-30 00:00:39.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "19.00",
+        "max" : "19.00"
+      },
+      "9" : {
+        "min" : "'abc_4_10130'",
+        "max" : "'abc_4_10993'"
+      },
+      "20" : {
+        "min" : "19.00",
+        "max" : "19.00"
+      },
+      "21" : {
+        "min" : "'abc_4_10130'",
+        "max" : "'abc_4_10993'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641810115789,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "a82ac5c5-675b-08b2-9eea-5fac9d1d86f9",
+    "name" : "20211230000000_20211231000000",
+    "create_time_utc" : 1641809168975,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640844000000,
+      "date_range_end" : 1640930400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "9266",
+        "max" : "10129"
+      },
+      "23" : {
+        "min" : "9266",
+        "max" : "10129"
+      },
+      "24" : {
+        "min" : "1640793729017",
+        "max" : "1640880028998"
+      },
+      "10" : {
+        "min" : "9266",
+        "max" : "10129"
+      },
+      "11" : {
+        "min" : "1640793729017",
+        "max" : "1640880028998"
+      },
+      "12" : {
+        "min" : "94.0",
+        "max" : "103.0"
+      },
+      "13" : {
+        "min" : "2021-12-30",
+        "max" : "2021-12-30"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "20",
+        "max" : "21"
+      },
+      "16" : {
+        "min" : "2021-12-30",
+        "max" : "2021-12-31"
+      },
+      "17" : {
+        "min" : "10009266",
+        "max" : "10010129"
+      },
+      "18" : {
+        "min" : "2021-12-30 00:02:19.0",
+        "max" : "2021-12-31 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "94.0",
+        "max" : "103.0"
+      },
+      "1" : {
+        "min" : "2021-12-30",
+        "max" : "2021-12-30"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "20",
+        "max" : "21"
+      },
+      "4" : {
+        "min" : "2021-12-30",
+        "max" : "2021-12-31"
+      },
+      "5" : {
+        "min" : "10009266",
+        "max" : "10010129"
+      },
+      "6" : {
+        "min" : "2021-12-30 00:02:19.0",
+        "max" : "2021-12-31 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "18.00",
+        "max" : "19.00"
+      },
+      "9" : {
+        "min" : "'abc_4_10000'",
+        "max" : "'abc_4_9999'"
+      },
+      "20" : {
+        "min" : "18.00",
+        "max" : "19.00"
+      },
+      "21" : {
+        "min" : "'abc_4_10000'",
+        "max" : "'abc_4_9999'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641810121960,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10498,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3586,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3586,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3786,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3586,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3786,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10498,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "ff54dc0d-52b2-c1fb-565e-a81d473142cd",
+    "name" : "20211231000000_20220101000000",
+    "create_time_utc" : 1641809179174,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1640930400000,
+      "date_range_end" : 1641016800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "8402",
+        "max" : "9265"
+      },
+      "23" : {
+        "min" : "8402",
+        "max" : "9265"
+      },
+      "24" : {
+        "min" : "1640880128998",
+        "max" : "1640966428977"
+      },
+      "10" : {
+        "min" : "8402",
+        "max" : "9265"
+      },
+      "11" : {
+        "min" : "1640880128998",
+        "max" : "1640966428977"
+      },
+      "12" : {
+        "min" : "86.0",
+        "max" : "94.0"
+      },
+      "13" : {
+        "min" : "2021-12-31",
+        "max" : "2021-12-31"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "19",
+        "max" : "20"
+      },
+      "16" : {
+        "min" : "2021-12-31",
+        "max" : "2022-01-01"
+      },
+      "17" : {
+        "min" : "10008402",
+        "max" : "10009265"
+      },
+      "18" : {
+        "min" : "2021-12-31 00:02:18.0",
+        "max" : "2022-01-01 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "86.0",
+        "max" : "94.0"
+      },
+      "1" : {
+        "min" : "2021-12-31",
+        "max" : "2021-12-31"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "19",
+        "max" : "20"
+      },
+      "4" : {
+        "min" : "2021-12-31",
+        "max" : "2022-01-01"
+      },
+      "5" : {
+        "min" : "10008402",
+        "max" : "10009265"
+      },
+      "6" : {
+        "min" : "2021-12-31 00:02:18.0",
+        "max" : "2022-01-01 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "17.00",
+        "max" : "18.00"
+      },
+      "9" : {
+        "min" : "'abc_4_8402'",
+        "max" : "'abc_4_9265'"
+      },
+      "20" : {
+        "min" : "17.00",
+        "max" : "18.00"
+      },
+      "21" : {
+        "min" : "'abc_4_8402'",
+        "max" : "'abc_4_9265'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809680458,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "dbe22975-2a6a-b0c9-5bf2-a99f5ccb5dfd",
+    "name" : "20220101000000_20220102000000",
+    "create_time_utc" : 1641809187223,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641016800000,
+      "date_range_end" : 1641103200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "7538",
+        "max" : "8401"
+      },
+      "23" : {
+        "min" : "7538",
+        "max" : "8401"
+      },
+      "24" : {
+        "min" : "1640966528977",
+        "max" : "1641052828960"
+      },
+      "10" : {
+        "min" : "7538",
+        "max" : "8401"
+      },
+      "11" : {
+        "min" : "1640966528977",
+        "max" : "1641052828960"
+      },
+      "12" : {
+        "min" : "77.0",
+        "max" : "86.0"
+      },
+      "13" : {
+        "min" : "2022-01-01",
+        "max" : "2022-01-01"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "18",
+        "max" : "19"
+      },
+      "16" : {
+        "min" : "2022-01-01",
+        "max" : "2022-01-02"
+      },
+      "17" : {
+        "min" : "10007538",
+        "max" : "10008401"
+      },
+      "18" : {
+        "min" : "2022-01-01 00:02:18.0",
+        "max" : "2022-01-02 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "77.0",
+        "max" : "86.0"
+      },
+      "1" : {
+        "min" : "2022-01-01",
+        "max" : "2022-01-01"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "18",
+        "max" : "19"
+      },
+      "4" : {
+        "min" : "2022-01-01",
+        "max" : "2022-01-02"
+      },
+      "5" : {
+        "min" : "10007538",
+        "max" : "10008401"
+      },
+      "6" : {
+        "min" : "2022-01-01 00:02:18.0",
+        "max" : "2022-01-02 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "16.00",
+        "max" : "17.00"
+      },
+      "9" : {
+        "min" : "'abc_4_7538'",
+        "max" : "'abc_4_8401'"
+      },
+      "20" : {
+        "min" : "16.00",
+        "max" : "17.00"
+      },
+      "21" : {
+        "min" : "'abc_4_7538'",
+        "max" : "'abc_4_8401'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809688930,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "2a6d175b-e4b6-2177-6dd7-aff5b8e7f71d",
+    "name" : "20220102000000_20220103000000",
+    "create_time_utc" : 1641809194400,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641103200000,
+      "date_range_end" : 1641189600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "6674",
+        "max" : "7537"
+      },
+      "23" : {
+        "min" : "6674",
+        "max" : "7537"
+      },
+      "24" : {
+        "min" : "1641052928960",
+        "max" : "1641139228938"
+      },
+      "10" : {
+        "min" : "6674",
+        "max" : "7537"
+      },
+      "11" : {
+        "min" : "1641052928960",
+        "max" : "1641139228938"
+      },
+      "12" : {
+        "min" : "68.0",
+        "max" : "77.0"
+      },
+      "13" : {
+        "min" : "2022-01-02",
+        "max" : "2022-01-02"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "17",
+        "max" : "18"
+      },
+      "16" : {
+        "min" : "2022-01-02",
+        "max" : "2022-01-03"
+      },
+      "17" : {
+        "min" : "10006674",
+        "max" : "10007537"
+      },
+      "18" : {
+        "min" : "2022-01-02 00:02:18.0",
+        "max" : "2022-01-03 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "68.0",
+        "max" : "77.0"
+      },
+      "1" : {
+        "min" : "2022-01-02",
+        "max" : "2022-01-02"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "17",
+        "max" : "18"
+      },
+      "4" : {
+        "min" : "2022-01-02",
+        "max" : "2022-01-03"
+      },
+      "5" : {
+        "min" : "10006674",
+        "max" : "10007537"
+      },
+      "6" : {
+        "min" : "2022-01-02 00:02:18.0",
+        "max" : "2022-01-03 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "15.00",
+        "max" : "16.00"
+      },
+      "9" : {
+        "min" : "'abc_4_6674'",
+        "max" : "'abc_4_7537'"
+      },
+      "20" : {
+        "min" : "15.00",
+        "max" : "16.00"
+      },
+      "21" : {
+        "min" : "'abc_4_6674'",
+        "max" : "'abc_4_7537'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809678008,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "58149670-3e49-aba5-21cf-80ae36cac679",
+    "name" : "20220103000000_20220104000000",
+    "create_time_utc" : 1641809204687,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641189600000,
+      "date_range_end" : 1641276000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "5810",
+        "max" : "6673"
+      },
+      "23" : {
+        "min" : "5810",
+        "max" : "6673"
+      },
+      "24" : {
+        "min" : "1641139328938",
+        "max" : "1641225628911"
+      },
+      "10" : {
+        "min" : "5810",
+        "max" : "6673"
+      },
+      "11" : {
+        "min" : "1641139328938",
+        "max" : "1641225628911"
+      },
+      "12" : {
+        "min" : "60.0",
+        "max" : "68.0"
+      },
+      "13" : {
+        "min" : "2022-01-03",
+        "max" : "2022-01-03"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "16",
+        "max" : "17"
+      },
+      "16" : {
+        "min" : "2022-01-03",
+        "max" : "2022-01-04"
+      },
+      "17" : {
+        "min" : "10005810",
+        "max" : "10006673"
+      },
+      "18" : {
+        "min" : "2022-01-03 00:02:18.0",
+        "max" : "2022-01-04 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "60.0",
+        "max" : "68.0"
+      },
+      "1" : {
+        "min" : "2022-01-03",
+        "max" : "2022-01-03"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "16",
+        "max" : "17"
+      },
+      "4" : {
+        "min" : "2022-01-03",
+        "max" : "2022-01-04"
+      },
+      "5" : {
+        "min" : "10005810",
+        "max" : "10006673"
+      },
+      "6" : {
+        "min" : "2022-01-03 00:02:18.0",
+        "max" : "2022-01-04 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "14.00",
+        "max" : "15.00"
+      },
+      "9" : {
+        "min" : "'abc_4_5810'",
+        "max" : "'abc_4_6673'"
+      },
+      "20" : {
+        "min" : "14.00",
+        "max" : "15.00"
+      },
+      "21" : {
+        "min" : "'abc_4_5810'",
+        "max" : "'abc_4_6673'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809871409,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "9784f6fb-3e31-a164-2bd6-b2c37e45a00e",
+    "name" : "20220104000000_20220105000000",
+    "create_time_utc" : 1641809214957,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641276000000,
+      "date_range_end" : 1641362400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "4946",
+        "max" : "5809"
+      },
+      "23" : {
+        "min" : "4946",
+        "max" : "5809"
+      },
+      "24" : {
+        "min" : "1641225728910",
+        "max" : "1641312028887"
+      },
+      "10" : {
+        "min" : "4946",
+        "max" : "5809"
+      },
+      "11" : {
+        "min" : "1641225728910",
+        "max" : "1641312028887"
+      },
+      "12" : {
+        "min" : "51.0",
+        "max" : "60.0"
+      },
+      "13" : {
+        "min" : "2022-01-04",
+        "max" : "2022-01-04"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "15",
+        "max" : "16"
+      },
+      "16" : {
+        "min" : "2022-01-04",
+        "max" : "2022-01-05"
+      },
+      "17" : {
+        "min" : "10004946",
+        "max" : "10005809"
+      },
+      "18" : {
+        "min" : "2022-01-04 00:02:18.0",
+        "max" : "2022-01-05 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "51.0",
+        "max" : "60.0"
+      },
+      "1" : {
+        "min" : "2022-01-04",
+        "max" : "2022-01-04"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "15",
+        "max" : "16"
+      },
+      "4" : {
+        "min" : "2022-01-04",
+        "max" : "2022-01-05"
+      },
+      "5" : {
+        "min" : "10004946",
+        "max" : "10005809"
+      },
+      "6" : {
+        "min" : "2022-01-04 00:02:18.0",
+        "max" : "2022-01-05 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "13.00",
+        "max" : "14.00"
+      },
+      "9" : {
+        "min" : "'abc_4_4946'",
+        "max" : "'abc_4_5809'"
+      },
+      "20" : {
+        "min" : "13.00",
+        "max" : "14.00"
+      },
+      "21" : {
+        "min" : "'abc_4_4946'",
+        "max" : "'abc_4_5809'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641810272949,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "acafcfe5-cb21-df26-35a4-f370171dd3b7",
+    "name" : "20220105000000_20220106000000",
+    "create_time_utc" : 1641809228252,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641362400000,
+      "date_range_end" : 1641448800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "4082",
+        "max" : "4945"
+      },
+      "23" : {
+        "min" : "4082",
+        "max" : "4945"
+      },
+      "24" : {
+        "min" : "1641312128887",
+        "max" : "1641398428864"
+      },
+      "10" : {
+        "min" : "4082",
+        "max" : "4945"
+      },
+      "11" : {
+        "min" : "1641312128887",
+        "max" : "1641398428864"
+      },
+      "12" : {
+        "min" : "42.0",
+        "max" : "51.0"
+      },
+      "13" : {
+        "min" : "2022-01-05",
+        "max" : "2022-01-05"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "15",
+        "max" : "15"
+      },
+      "16" : {
+        "min" : "2022-01-05",
+        "max" : "2022-01-06"
+      },
+      "17" : {
+        "min" : "10004082",
+        "max" : "10004945"
+      },
+      "18" : {
+        "min" : "2022-01-05 00:02:18.0",
+        "max" : "2022-01-06 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "42.0",
+        "max" : "51.0"
+      },
+      "1" : {
+        "min" : "2022-01-05",
+        "max" : "2022-01-05"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "15",
+        "max" : "15"
+      },
+      "4" : {
+        "min" : "2022-01-05",
+        "max" : "2022-01-06"
+      },
+      "5" : {
+        "min" : "10004082",
+        "max" : "10004945"
+      },
+      "6" : {
+        "min" : "2022-01-05 00:02:18.0",
+        "max" : "2022-01-06 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "13.00",
+        "max" : "13.00"
+      },
+      "9" : {
+        "min" : "'abc_4_4082'",
+        "max" : "'abc_4_4945'"
+      },
+      "20" : {
+        "min" : "13.00",
+        "max" : "13.00"
+      },
+      "21" : {
+        "min" : "'abc_4_4082'",
+        "max" : "'abc_4_4945'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641810134972,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "7d4d2d7f-0d2d-67bd-80b0-4997b5703c00",
+    "name" : "20220106000000_20220107000000",
+    "create_time_utc" : 1641809246651,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641448800000,
+      "date_range_end" : 1641535200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "3218",
+        "max" : "4081"
+      },
+      "23" : {
+        "min" : "3218",
+        "max" : "4081"
+      },
+      "24" : {
+        "min" : "1641398528864",
+        "max" : "1641484828829"
+      },
+      "10" : {
+        "min" : "3218",
+        "max" : "4081"
+      },
+      "11" : {
+        "min" : "1641398528864",
+        "max" : "1641484828829"
+      },
+      "12" : {
+        "min" : "34.0",
+        "max" : "42.0"
+      },
+      "13" : {
+        "min" : "2022-01-06",
+        "max" : "2022-01-06"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "14",
+        "max" : "15"
+      },
+      "16" : {
+        "min" : "2022-01-06",
+        "max" : "2022-01-07"
+      },
+      "17" : {
+        "min" : "10003218",
+        "max" : "10004081"
+      },
+      "18" : {
+        "min" : "2022-01-06 00:02:18.0",
+        "max" : "2022-01-07 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "34.0",
+        "max" : "42.0"
+      },
+      "1" : {
+        "min" : "2022-01-06",
+        "max" : "2022-01-06"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "14",
+        "max" : "15"
+      },
+      "4" : {
+        "min" : "2022-01-06",
+        "max" : "2022-01-07"
+      },
+      "5" : {
+        "min" : "10003218",
+        "max" : "10004081"
+      },
+      "6" : {
+        "min" : "2022-01-06 00:02:18.0",
+        "max" : "2022-01-07 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "12.00",
+        "max" : "13.00"
+      },
+      "9" : {
+        "min" : "'abc_4_3218'",
+        "max" : "'abc_4_4081'"
+      },
+      "20" : {
+        "min" : "12.00",
+        "max" : "13.00"
+      },
+      "21" : {
+        "min" : "'abc_4_3218'",
+        "max" : "'abc_4_4081'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641809763169,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "cb4fe549-16ee-6f17-8d06-85515259277e",
+    "name" : "20220107000000_20220108000000",
+    "create_time_utc" : 1641809258459,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1641535200000,
+      "date_range_end" : 1641621600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "22" : {
+        "min" : "2354",
+        "max" : "3217"
+      },
+      "23" : {
+        "min" : "2354",
+        "max" : "3217"
+      },
+      "24" : {
+        "min" : "1641484928829",
+        "max" : "1641571228780"
+      },
+      "10" : {
+        "min" : "2354",
+        "max" : "3217"
+      },
+      "11" : {
+        "min" : "1641484928829",
+        "max" : "1641571228780"
+      },
+      "12" : {
+        "min" : "25.0",
+        "max" : "34.0"
+      },
+      "13" : {
+        "min" : "2022-01-07",
+        "max" : "2022-01-07"
+      },
+      "14" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "15" : {
+        "min" : "13",
+        "max" : "14"
+      },
+      "16" : {
+        "min" : "2022-01-07",
+        "max" : "2022-01-08"
+      },
+      "17" : {
+        "min" : "10002354",
+        "max" : "10003217"
+      },
+      "18" : {
+        "min" : "2022-01-07 00:02:18.0",
+        "max" : "2022-01-08 00:00:38.0"
+      },
+      "19" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "0" : {
+        "min" : "25.0",
+        "max" : "34.0"
+      },
+      "1" : {
+        "min" : "2022-01-07",
+        "max" : "2022-01-07"
+      },
+      "2" : {
+        "min" : "8",
+        "max" : "8"
+      },
+      "3" : {
+        "min" : "13",
+        "max" : "14"
+      },
+      "4" : {
+        "min" : "2022-01-07",
+        "max" : "2022-01-08"
+      },
+      "5" : {
+        "min" : "10002354",
+        "max" : "10003217"
+      },
+      "6" : {
+        "min" : "2022-01-07 00:02:18.0",
+        "max" : "2022-01-08 00:00:38.0"
+      },
+      "7" : {
+        "min" : "7",
+        "max" : "7"
+      },
+      "8" : {
+        "min" : "11.00",
+        "max" : "12.00"
+      },
+      "9" : {
+        "min" : "'abc_4_2354'",
+        "max" : "'abc_4_3217'"
+      },
+      "20" : {
+        "min" : "11.00",
+        "max" : "12.00"
+      },
+      "21" : {
+        "min" : "'abc_4_2354'",
+        "max" : "'abc_4_3217'"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641810442875,
+    "source_count" : 864,
+    "source_bytes_size" : 4001250,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_24_2W.STRING_8" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.INT_1" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_13" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.INT_15" : 864,
+      "TEST_DB.TEST_FACT_24_2W.ID" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.DATE_7" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_10" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_4" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_16" : 864,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_12" : 11232,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_23" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DATE_6" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.INT_0" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_3" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_19" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_21" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.DOUBLE_5" : 3456,
+      "TEST_DB.TEST_FACT_24_2W.STRING_NUM_17" : 864,
+      "TEST_DB.TEST_FACT_24_2W.STRING_9" : 10368,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DECIMAL_22" : 1728,
+      "TEST_DB.TEST_FACT_24_2W.DECIMAL_18" : 4320,
+      "TEST_DB.TEST_FACT_24_2W.TIMESTAMP_11" : 18144,
+      "TEST_DB.TEST_FACT_24_2W.STRING_DATE_20" : 8640,
+      "TEST_DB.TEST_FACT_24_2W.BIGINT_2" : 6912,
+      "TEST_DB.TEST_FACT_24_2W.INT_14" : 864
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  } ]
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/3718b614-5191-2254-77e9-f4c5ca64e309.json b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/3718b614-5191-2254-77e9-f4c5ca64e309.json
new file mode 100644
index 0000000000..7d0738fc4b
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/3718b614-5191-2254-77e9-f4c5ca64e309.json
@@ -0,0 +1,1812 @@
+{
+  "uuid" : "3718b614-5191-2254-77e9-f4c5ca64e309",
+  "last_modified" : 1641894356376,
+  "create_time" : 1641379702642,
+  "version" : "4.0.0.0",
+  "status" : "ONLINE",
+  "cost" : 50,
+  "query_hit_count" : 152584,
+  "last_query_time" : 1641893174952,
+  "layout_query_hit_count" : {
+    "20000000001" : {
+      "1641398400000" : 14985,
+      "1641448800000" : 3207,
+      "1641484800000" : 134367,
+      "1641744000000" : 11,
+      "1641830400000" : 14
+    }
+  },
+  "segments" : [ {
+    "id" : "c9dd757c-c62a-eab9-cb12-021adac2ac26",
+    "name" : "20211011000000_20211012000000",
+    "create_time_utc" : 1641379821139,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1633928400000,
+      "date_range_end" : 1634014800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_21192'",
+        "max" : "'abc_4_64424'"
+      },
+      "1" : {
+        "min" : "10021192",
+        "max" : "10064424"
+      },
+      "12" : {
+        "min" : "2021-10-11",
+        "max" : "2021-10-11"
+      },
+      "2" : {
+        "min" : "2021-10-11 16:08:21.0",
+        "max" : "2021-10-11 23:58:53.0"
+      },
+      "3" : {
+        "min" : "21192",
+        "max" : "64424"
+      },
+      "4" : {
+        "min" : "213",
+        "max" : "646"
+      },
+      "5" : {
+        "min" : "2119221192",
+        "max" : "6442464424"
+      },
+      "6" : {
+        "min" : "2021-10-11 16:08:21",
+        "max" : "2021-10-11 23:58:53"
+      },
+      "7" : {
+        "min" : "10021192",
+        "max" : "10064424"
+      },
+      "10" : {
+        "min" : "213.0",
+        "max" : "646.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641380385323,
+    "source_count" : 566,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 4528,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 7358,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 5660,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 11886,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 2830,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 10754,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 1698,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 5660,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 4528,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 2830
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "7c90cd71-2a61-afbe-ef81-956830d60a2a",
+    "name" : "20211012000000_20211013000000",
+    "create_time_utc" : 1641379832626,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634014800000,
+      "date_range_end" : 1634101200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_20328'",
+        "max" : "'abc_4_64141'"
+      },
+      "1" : {
+        "min" : "10020328",
+        "max" : "10064141"
+      },
+      "12" : {
+        "min" : "2021-10-12",
+        "max" : "2021-10-12"
+      },
+      "2" : {
+        "min" : "2021-10-12 00:00:01.0",
+        "max" : "2021-10-12 23:58:53.0"
+      },
+      "3" : {
+        "min" : "20328",
+        "max" : "64141"
+      },
+      "4" : {
+        "min" : "205",
+        "max" : "643"
+      },
+      "5" : {
+        "min" : "2032820328",
+        "max" : "6414164141"
+      },
+      "6" : {
+        "min" : "2021-10-12 00:00:01",
+        "max" : "2021-10-12 23:58:53"
+      },
+      "7" : {
+        "min" : "10020328",
+        "max" : "10064141"
+      },
+      "10" : {
+        "min" : "205.0",
+        "max" : "643.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641380736727,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "a8119cff-9a0b-5cd0-374d-e4e1d3e4722c",
+    "name" : "20211013000000_20211014000000",
+    "create_time_utc" : 1641379840787,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634101200000,
+      "date_range_end" : 1634187600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_19464'",
+        "max" : "'abc_4_63277'"
+      },
+      "1" : {
+        "min" : "10019464",
+        "max" : "10063277"
+      },
+      "12" : {
+        "min" : "2021-10-13",
+        "max" : "2021-10-13"
+      },
+      "2" : {
+        "min" : "2021-10-13 00:00:01.0",
+        "max" : "2021-10-13 23:58:53.0"
+      },
+      "3" : {
+        "min" : "19464",
+        "max" : "63277"
+      },
+      "4" : {
+        "min" : "196",
+        "max" : "634"
+      },
+      "5" : {
+        "min" : "1946419464",
+        "max" : "6327763277"
+      },
+      "6" : {
+        "min" : "2021-10-13 00:00:01",
+        "max" : "2021-10-13 23:58:53"
+      },
+      "7" : {
+        "min" : "10019464",
+        "max" : "10063277"
+      },
+      "10" : {
+        "min" : "196.0",
+        "max" : "634.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641380313574,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "360737db-cf5e-092e-996b-78e15e1efcf2",
+    "name" : "20211014000000_20211015000000",
+    "create_time_utc" : 1641379849626,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634187600000,
+      "date_range_end" : 1634274000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_18600'",
+        "max" : "'abc_4_62413'"
+      },
+      "1" : {
+        "min" : "10018600",
+        "max" : "10062413"
+      },
+      "12" : {
+        "min" : "2021-10-14",
+        "max" : "2021-10-14"
+      },
+      "2" : {
+        "min" : "2021-10-14 00:00:01.0",
+        "max" : "2021-10-14 23:58:53.0"
+      },
+      "3" : {
+        "min" : "18600",
+        "max" : "62413"
+      },
+      "4" : {
+        "min" : "188",
+        "max" : "626"
+      },
+      "5" : {
+        "min" : "1860018600",
+        "max" : "6241362413"
+      },
+      "6" : {
+        "min" : "2021-10-14 00:00:01",
+        "max" : "2021-10-14 23:58:53"
+      },
+      "7" : {
+        "min" : "10018600",
+        "max" : "10062413"
+      },
+      "10" : {
+        "min" : "188.0",
+        "max" : "626.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383102670,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "7ccbf584-e6c0-a8db-bcc7-19e3c0671697",
+    "name" : "20211015000000_20211016000000",
+    "create_time_utc" : 1641379858311,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634274000000,
+      "date_range_end" : 1634360400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_17736'",
+        "max" : "'abc_4_61549'"
+      },
+      "1" : {
+        "min" : "10017736",
+        "max" : "10061549"
+      },
+      "12" : {
+        "min" : "2021-10-15",
+        "max" : "2021-10-15"
+      },
+      "2" : {
+        "min" : "2021-10-15 00:00:01.0",
+        "max" : "2021-10-15 23:58:53.0"
+      },
+      "3" : {
+        "min" : "17736",
+        "max" : "61549"
+      },
+      "4" : {
+        "min" : "179",
+        "max" : "617"
+      },
+      "5" : {
+        "min" : "1773617736",
+        "max" : "6154961549"
+      },
+      "6" : {
+        "min" : "2021-10-15 00:00:01",
+        "max" : "2021-10-15 23:58:53"
+      },
+      "7" : {
+        "min" : "10017736",
+        "max" : "10061549"
+      },
+      "10" : {
+        "min" : "179.0",
+        "max" : "617.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641384117443,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "64ff2fcc-755f-83cc-3edc-03b3d2ac3db2",
+    "name" : "20211016000000_20211017000000",
+    "create_time_utc" : 1641379865932,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634360400000,
+      "date_range_end" : 1634446800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_16872'",
+        "max" : "'abc_4_60685'"
+      },
+      "1" : {
+        "min" : "10016872",
+        "max" : "10060685"
+      },
+      "12" : {
+        "min" : "2021-10-16",
+        "max" : "2021-10-16"
+      },
+      "2" : {
+        "min" : "2021-10-16 00:00:01.0",
+        "max" : "2021-10-16 23:58:53.0"
+      },
+      "3" : {
+        "min" : "16872",
+        "max" : "60685"
+      },
+      "4" : {
+        "min" : "170",
+        "max" : "608"
+      },
+      "5" : {
+        "min" : "1687216872",
+        "max" : "6068560685"
+      },
+      "6" : {
+        "min" : "2021-10-16 00:00:01",
+        "max" : "2021-10-16 23:58:53"
+      },
+      "7" : {
+        "min" : "10016872",
+        "max" : "10060685"
+      },
+      "10" : {
+        "min" : "170.0",
+        "max" : "608.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383113097,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "7889e91e-2b0f-8310-3d8d-c3997bb8d715",
+    "name" : "20211017000000_20211018000000",
+    "create_time_utc" : 1641379873891,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634446800000,
+      "date_range_end" : 1634533200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_16008'",
+        "max" : "'abc_4_59821'"
+      },
+      "1" : {
+        "min" : "10016008",
+        "max" : "10059821"
+      },
+      "12" : {
+        "min" : "2021-10-17",
+        "max" : "2021-10-17"
+      },
+      "2" : {
+        "min" : "2021-10-17 00:00:01.0",
+        "max" : "2021-10-17 23:58:53.0"
+      },
+      "3" : {
+        "min" : "16008",
+        "max" : "59821"
+      },
+      "4" : {
+        "min" : "162",
+        "max" : "600"
+      },
+      "5" : {
+        "min" : "1600816008",
+        "max" : "5982159821"
+      },
+      "6" : {
+        "min" : "2021-10-17 00:00:01",
+        "max" : "2021-10-17 23:58:53"
+      },
+      "7" : {
+        "min" : "10016008",
+        "max" : "10059821"
+      },
+      "10" : {
+        "min" : "162.0",
+        "max" : "600.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383733641,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "637e3dfa-6651-1ee1-4a66-c9ac917ce977",
+    "name" : "20211018000000_20211019000000",
+    "create_time_utc" : 1641379882100,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634533200000,
+      "date_range_end" : 1634619600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_15144'",
+        "max" : "'abc_4_58957'"
+      },
+      "1" : {
+        "min" : "10015144",
+        "max" : "10058957"
+      },
+      "12" : {
+        "min" : "2021-10-18",
+        "max" : "2021-10-18"
+      },
+      "2" : {
+        "min" : "2021-10-18 00:00:01.0",
+        "max" : "2021-10-18 23:58:53.0"
+      },
+      "3" : {
+        "min" : "15144",
+        "max" : "58957"
+      },
+      "4" : {
+        "min" : "153",
+        "max" : "591"
+      },
+      "5" : {
+        "min" : "1514415144",
+        "max" : "5895758957"
+      },
+      "6" : {
+        "min" : "2021-10-18 00:00:01",
+        "max" : "2021-10-18 23:58:53"
+      },
+      "7" : {
+        "min" : "10015144",
+        "max" : "10058957"
+      },
+      "10" : {
+        "min" : "153.0",
+        "max" : "591.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383858207,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "7718ae3c-3e74-0e17-956e-6a7157225808",
+    "name" : "20211019000000_20211020000000",
+    "create_time_utc" : 1641379889061,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634619600000,
+      "date_range_end" : 1634706000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_14280'",
+        "max" : "'abc_4_58093'"
+      },
+      "1" : {
+        "min" : "10014280",
+        "max" : "10058093"
+      },
+      "12" : {
+        "min" : "2021-10-19",
+        "max" : "2021-10-19"
+      },
+      "2" : {
+        "min" : "2021-10-19 00:00:01.0",
+        "max" : "2021-10-19 23:58:53.0"
+      },
+      "3" : {
+        "min" : "14280",
+        "max" : "58093"
+      },
+      "4" : {
+        "min" : "144",
+        "max" : "582"
+      },
+      "5" : {
+        "min" : "1428014280",
+        "max" : "5809358093"
+      },
+      "6" : {
+        "min" : "2021-10-19 00:00:01",
+        "max" : "2021-10-19 23:58:53"
+      },
+      "7" : {
+        "min" : "10014280",
+        "max" : "10058093"
+      },
+      "10" : {
+        "min" : "144.0",
+        "max" : "582.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641384110435,
+    "source_count" : 1728,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 22464,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 36288,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 8640,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 32832,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5184,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 17280,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 13824,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 8640
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "7fffa8c3-ea8e-03c5-8afb-540048848dad",
+    "name" : "20211020000000_20211021000000",
+    "create_time_utc" : 1641379896384,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634706000000,
+      "date_range_end" : 1634792400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_13416'",
+        "max" : "'abc_4_99999'"
+      },
+      "1" : {
+        "min" : "10013416",
+        "max" : "10099999"
+      },
+      "12" : {
+        "min" : "2021-10-20",
+        "max" : "2021-10-20"
+      },
+      "2" : {
+        "min" : "2021-10-20 00:00:01.0",
+        "max" : "2021-10-20 23:59:29.0"
+      },
+      "3" : {
+        "min" : "13416",
+        "max" : "99999"
+      },
+      "4" : {
+        "min" : "136",
+        "max" : "1001"
+      },
+      "5" : {
+        "min" : "1341613416",
+        "max" : "9999999999"
+      },
+      "6" : {
+        "min" : "2021-10-20 00:00:01",
+        "max" : "2021-10-20 23:59:29"
+      },
+      "7" : {
+        "min" : "10013416",
+        "max" : "10099999"
+      },
+      "10" : {
+        "min" : "136.0",
+        "max" : "1001.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383847906,
+    "source_count" : 2413,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 19304,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 31369,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 24130,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 50673,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12065,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 45847,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7239,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 24130,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 19304,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12065
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "d4636097-7b3a-52fa-d6ed-52c89c048d2e",
+    "name" : "20211021000000_20211022000000",
+    "create_time_utc" : 1641379905370,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634792400000,
+      "date_range_end" : 1634878800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_12552'",
+        "max" : "'abc_4_99314'"
+      },
+      "1" : {
+        "min" : "10012552",
+        "max" : "10099314"
+      },
+      "12" : {
+        "min" : "2021-10-21",
+        "max" : "2021-10-21"
+      },
+      "2" : {
+        "min" : "2021-10-21 00:00:01.0",
+        "max" : "2021-10-21 23:59:29.0"
+      },
+      "3" : {
+        "min" : "12552",
+        "max" : "99314"
+      },
+      "4" : {
+        "min" : "127",
+        "max" : "995"
+      },
+      "5" : {
+        "min" : "1255212552",
+        "max" : "9931499314"
+      },
+      "6" : {
+        "min" : "2021-10-21 00:00:01",
+        "max" : "2021-10-21 23:59:29"
+      },
+      "7" : {
+        "min" : "10012552",
+        "max" : "10099314"
+      },
+      "10" : {
+        "min" : "127.0",
+        "max" : "995.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383452339,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "efa41d28-b9a1-173b-4a6a-f26884ceafc5",
+    "name" : "20211022000000_20211023000000",
+    "create_time_utc" : 1641379912725,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634878800000,
+      "date_range_end" : 1634965200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_11688'",
+        "max" : "'abc_4_98450'"
+      },
+      "1" : {
+        "min" : "10011688",
+        "max" : "10098450"
+      },
+      "12" : {
+        "min" : "2021-10-22",
+        "max" : "2021-10-22"
+      },
+      "2" : {
+        "min" : "2021-10-22 00:00:01.0",
+        "max" : "2021-10-22 23:59:29.0"
+      },
+      "3" : {
+        "min" : "11688",
+        "max" : "98450"
+      },
+      "4" : {
+        "min" : "118",
+        "max" : "986"
+      },
+      "5" : {
+        "min" : "1168811688",
+        "max" : "9845098450"
+      },
+      "6" : {
+        "min" : "2021-10-22 00:00:01",
+        "max" : "2021-10-22 23:59:29"
+      },
+      "7" : {
+        "min" : "10011688",
+        "max" : "10098450"
+      },
+      "10" : {
+        "min" : "118.0",
+        "max" : "986.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383452420,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "8f378a3f-2f37-7d45-d8cd-436427fbdeb7",
+    "name" : "20211023000000_20211024000000",
+    "create_time_utc" : 1641379921015,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1634965200000,
+      "date_range_end" : 1635051600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_10824'",
+        "max" : "'abc_4_97586'"
+      },
+      "1" : {
+        "min" : "10010824",
+        "max" : "10097586"
+      },
+      "12" : {
+        "min" : "2021-10-23",
+        "max" : "2021-10-23"
+      },
+      "2" : {
+        "min" : "2021-10-23 00:00:01.0",
+        "max" : "2021-10-23 23:59:29.0"
+      },
+      "3" : {
+        "min" : "10824",
+        "max" : "97586"
+      },
+      "4" : {
+        "min" : "110",
+        "max" : "977"
+      },
+      "5" : {
+        "min" : "1082410824",
+        "max" : "9758697586"
+      },
+      "6" : {
+        "min" : "2021-10-23 00:00:01",
+        "max" : "2021-10-23 23:59:29"
+      },
+      "7" : {
+        "min" : "10010824",
+        "max" : "10097586"
+      },
+      "10" : {
+        "min" : "110.0",
+        "max" : "977.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383448674,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "a4ff6463-498b-a604-75a8-e983fbb65587",
+    "name" : "20211024000000_20211025000000",
+    "create_time_utc" : 1641379928313,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635051600000,
+      "date_range_end" : 1635138000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_10000'",
+        "max" : "'abc_4_9999'"
+      },
+      "1" : {
+        "min" : "10009960",
+        "max" : "10096722"
+      },
+      "12" : {
+        "min" : "2021-10-24",
+        "max" : "2021-10-24"
+      },
+      "2" : {
+        "min" : "2021-10-24 00:00:01.0",
+        "max" : "2021-10-24 23:59:29.0"
+      },
+      "3" : {
+        "min" : "9960",
+        "max" : "96722"
+      },
+      "4" : {
+        "min" : "101",
+        "max" : "969"
+      },
+      "5" : {
+        "min" : "99609960",
+        "max" : "9672296722"
+      },
+      "6" : {
+        "min" : "2021-10-24 00:00:01",
+        "max" : "2021-10-24 23:59:29"
+      },
+      "7" : {
+        "min" : "10009960",
+        "max" : "10096722"
+      },
+      "10" : {
+        "min" : "101.0",
+        "max" : "969.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383589265,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "a99092e2-1e74-32e7-2e88-a48d79163396",
+    "name" : "20211025000000_20211026000000",
+    "create_time_utc" : 1641379936949,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635138000000,
+      "date_range_end" : 1635224400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_52046'",
+        "max" : "'abc_4_9959'"
+      },
+      "1" : {
+        "min" : "10009096",
+        "max" : "10095858"
+      },
+      "12" : {
+        "min" : "2021-10-25",
+        "max" : "2021-10-25"
+      },
+      "2" : {
+        "min" : "2021-10-25 00:00:01.0",
+        "max" : "2021-10-25 23:59:28.0"
+      },
+      "3" : {
+        "min" : "9096",
+        "max" : "95858"
+      },
+      "4" : {
+        "min" : "92",
+        "max" : "960"
+      },
+      "5" : {
+        "min" : "90969096",
+        "max" : "9585895858"
+      },
+      "6" : {
+        "min" : "2021-10-25 00:00:01",
+        "max" : "2021-10-25 23:59:28"
+      },
+      "7" : {
+        "min" : "10009096",
+        "max" : "10095858"
+      },
+      "10" : {
+        "min" : "92.0",
+        "max" : "960.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383188300,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "c7cd2fe1-245c-a896-6d6e-b0aae56eb395",
+    "name" : "20211026000000_20211027000000",
+    "create_time_utc" : 1641379944497,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635224400000,
+      "date_range_end" : 1635310800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_51182'",
+        "max" : "'abc_4_94994'"
+      },
+      "1" : {
+        "min" : "10008232",
+        "max" : "10094994"
+      },
+      "12" : {
+        "min" : "2021-10-26",
+        "max" : "2021-10-26"
+      },
+      "2" : {
+        "min" : "2021-10-26 00:00:01.0",
+        "max" : "2021-10-26 23:59:28.0"
+      },
+      "3" : {
+        "min" : "8232",
+        "max" : "94994"
+      },
+      "4" : {
+        "min" : "84",
+        "max" : "951"
+      },
+      "5" : {
+        "min" : "82328232",
+        "max" : "9499494994"
+      },
+      "6" : {
+        "min" : "2021-10-26 00:00:01",
+        "max" : "2021-10-26 23:59:28"
+      },
+      "7" : {
+        "min" : "10008232",
+        "max" : "10094994"
+      },
+      "10" : {
+        "min" : "84.0",
+        "max" : "951.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383751314,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "dfbc10e5-6a1a-a691-e868-4848aac827b1",
+    "name" : "20211027000000_20211028000000",
+    "create_time_utc" : 1641379951963,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635310800000,
+      "date_range_end" : 1635397200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_50318'",
+        "max" : "'abc_4_94130'"
+      },
+      "1" : {
+        "min" : "10007368",
+        "max" : "10094130"
+      },
+      "12" : {
+        "min" : "2021-10-27",
+        "max" : "2021-10-27"
+      },
+      "2" : {
+        "min" : "2021-10-27 00:00:01.0",
+        "max" : "2021-10-27 23:59:28.0"
+      },
+      "3" : {
+        "min" : "7368",
+        "max" : "94130"
+      },
+      "4" : {
+        "min" : "75",
+        "max" : "943"
+      },
+      "5" : {
+        "min" : "73687368",
+        "max" : "9413094130"
+      },
+      "6" : {
+        "min" : "2021-10-27 00:00:01",
+        "max" : "2021-10-27 23:59:28"
+      },
+      "7" : {
+        "min" : "10007368",
+        "max" : "10094130"
+      },
+      "10" : {
+        "min" : "75.0",
+        "max" : "943.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641384017168,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 33696,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 12960,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 7776,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 12960
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "19f17c24-6d8f-167a-fc46-ea442b076ed7",
+    "name" : "20211028000000_20211029000000",
+    "create_time_utc" : 1641379959932,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635397200000,
+      "date_range_end" : 1635483600000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_49454'",
+        "max" : "'abc_4_93266'"
+      },
+      "1" : {
+        "min" : "10006504",
+        "max" : "10093266"
+      },
+      "12" : {
+        "min" : "2021-10-28",
+        "max" : "2021-10-28"
+      },
+      "2" : {
+        "min" : "2021-10-28 00:00:01.0",
+        "max" : "2021-10-28 23:59:28.0"
+      },
+      "3" : {
+        "min" : "6504",
+        "max" : "93266"
+      },
+      "4" : {
+        "min" : "67",
+        "max" : "934"
+      },
+      "5" : {
+        "min" : "65046504",
+        "max" : "9326693266"
+      },
+      "6" : {
+        "min" : "2021-10-28 00:00:01",
+        "max" : "2021-10-28 23:59:28"
+      },
+      "7" : {
+        "min" : "10006504",
+        "max" : "10093266"
+      },
+      "10" : {
+        "min" : "67.0",
+        "max" : "934.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641383957483,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 31456,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 10720,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5536,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 21441,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 10720
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "2f745b27-070c-8d2c-9ea2-4766cd9d580e",
+    "name" : "20211029000000_20211030000000",
+    "create_time_utc" : 1641379968786,
+    "status" : "NEW",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635483600000,
+      "date_range_end" : 1635570000000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : { },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 0,
+    "source_count" : 0,
+    "source_bytes_size" : 0,
+    "column_source_bytes" : { },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : false,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "e7a5203b-2b06-c862-416a-e37cb690ae57",
+    "name" : "20211030000000_20211031000000",
+    "create_time_utc" : 1641379977248,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635570000000,
+      "date_range_end" : 1635656400000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_47726'",
+        "max" : "'abc_4_91538'"
+      },
+      "1" : {
+        "min" : "10004776",
+        "max" : "10091538"
+      },
+      "12" : {
+        "min" : "2021-10-30",
+        "max" : "2021-10-30"
+      },
+      "2" : {
+        "min" : "2021-10-30 00:00:01.0",
+        "max" : "2021-10-30 23:59:28.0"
+      },
+      "3" : {
+        "min" : "4776",
+        "max" : "91538"
+      },
+      "4" : {
+        "min" : "49",
+        "max" : "917"
+      },
+      "5" : {
+        "min" : "47764776",
+        "max" : "9153891538"
+      },
+      "6" : {
+        "min" : "2021-10-30 00:00:01",
+        "max" : "2021-10-30 23:59:28"
+      },
+      "7" : {
+        "min" : "10004776",
+        "max" : "10091538"
+      },
+      "10" : {
+        "min" : "49.0",
+        "max" : "917.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641384231770,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 31456,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 10720,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5536,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 21441,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 10720
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "44c7bce0-6852-f64d-3d9f-93b056b2f71a",
+    "name" : "20211031000000_20211101000000",
+    "create_time_utc" : 1641380003303,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635656400000,
+      "date_range_end" : 1635742800000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_3912'",
+        "max" : "'abc_4_90674'"
+      },
+      "1" : {
+        "min" : "10003912",
+        "max" : "10090674"
+      },
+      "12" : {
+        "min" : "2021-10-31",
+        "max" : "2021-10-31"
+      },
+      "2" : {
+        "min" : "2021-10-31 00:00:01.0",
+        "max" : "2021-10-31 23:59:28.0"
+      },
+      "3" : {
+        "min" : "3912",
+        "max" : "90674"
+      },
+      "4" : {
+        "min" : "41",
+        "max" : "908"
+      },
+      "5" : {
+        "min" : "39123912",
+        "max" : "9067490674"
+      },
+      "6" : {
+        "min" : "2021-10-31 00:00:01",
+        "max" : "2021-10-31 23:59:28"
+      },
+      "7" : {
+        "min" : "10003912",
+        "max" : "10090674"
+      },
+      "10" : {
+        "min" : "41.0",
+        "max" : "908.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641384285656,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 31456,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 10720,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5536,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 21441,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 10720
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  }, {
+    "id" : "4c17293a-92f5-c61c-1392-1d573ef20637",
+    "name" : "20211101000000_20211102000000",
+    "create_time_utc" : 1641380027089,
+    "status" : "READY",
+    "segRange" : {
+      "@class" : "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+      "date_range_start" : 1635742800000,
+      "date_range_end" : 1635829200000
+    },
+    "timeRange" : null,
+    "dimension_range_info_map" : {
+      "0" : {
+        "min" : "'abc_4_3048'",
+        "max" : "'abc_4_89810'"
+      },
+      "1" : {
+        "min" : "10003048",
+        "max" : "10089810"
+      },
+      "12" : {
+        "min" : "2021-11-01",
+        "max" : "2021-11-01"
+      },
+      "2" : {
+        "min" : "2021-11-01 00:00:01.0",
+        "max" : "2021-11-01 23:59:28.0"
+      },
+      "3" : {
+        "min" : "3048",
+        "max" : "89810"
+      },
+      "4" : {
+        "min" : "32",
+        "max" : "900"
+      },
+      "5" : {
+        "min" : "30483048",
+        "max" : "8981089810"
+      },
+      "6" : {
+        "min" : "2021-11-01 00:00:01",
+        "max" : "2021-11-01 23:59:28"
+      },
+      "7" : {
+        "min" : "10003048",
+        "max" : "10089810"
+      },
+      "10" : {
+        "min" : "32.0",
+        "max" : "900.0"
+      }
+    },
+    "parameters" : null,
+    "dictionaries" : null,
+    "snapshots" : null,
+    "last_build_time" : 1641384234210,
+    "source_count" : 2592,
+    "source_bytes_size" : 14623650,
+    "column_source_bytes" : {
+      "TEST_DB.TEST_FACT_13_10W.INT_1" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_5" : 0,
+      "TEST_DB.TEST_FACT_13_10W.STRING_8" : 31456,
+      "TEST_DB.TEST_FACT_13_10W.DATE_6" : 25920,
+      "TEST_DB.TEST_FACT_13_10W.DATE_7" : 0,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_10" : 54432,
+      "TEST_DB.TEST_FACT_13_10W.INT_0" : 10720,
+      "TEST_DB.TEST_FACT_13_10W.STRING_9" : 49248,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_12" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_3" : 5536,
+      "TEST_DB.TEST_FACT_13_10W.ID" : 21441,
+      "TEST_DB.TEST_FACT_13_10W.TIMESTAMP_11" : 0,
+      "TEST_DB.TEST_FACT_13_10W.BIGINT_2" : 20736,
+      "TEST_DB.TEST_FACT_13_10W.DOUBLE_4" : 10720
+    },
+    "ori_snapshot_size" : { },
+    "additionalInfo" : { },
+    "is_realtime_segment" : false,
+    "is_snapshot_ready" : false,
+    "is_dict_ready" : false,
+    "is_flat_table_ready" : true,
+    "is_fact_view_ready" : false,
+    "multi_partitions" : [ ],
+    "max_bucket_id" : -1
+  } ]
+}
\ No newline at end of file
diff --git a/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/3718b614-5191-2254-77e9-f4c5ca64e310.json b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/3718b614-5191-2254-77e9-f4c5ca64e310.json
new file mode 100644
index 0000000000..d4990f47a7
--- /dev/null
+++ b/src/kylin-it/src/test/resources/ut_meta/multi_partition_date_type/metadata/multi_partition_date_type/dataflow/3718b614-5191-2254-77e9-f4c5ca64e310.json
@@ -0,0 +1,1835 @@
+{
+  "uuid": "3718b614-5191-2254-77e9-f4c5ca64e310",
+  "last_modified": 1641894356376,
+  "create_time": 1641379702642,
+  "version": "4.0.0.0",
+  "status": "ONLINE",
+  "cost": 50,
+  "query_hit_count": 152584,
+  "last_query_time": 1641893174952,
+  "layout_query_hit_count": {
+    "20000000001": {
+      "1641398400000": 14985,
+      "1641448800000": 3207,
+      "1641484800000": 134367,
+      "1641744000000": 11,
+      "1641830400000": 14
+    }
+  },
+  "segments": [
+    {
+      "id": "c9dd757c-c62a-eab9-cb12-021adac2ac26",
+      "name": "20211011000000_20211012000000",
+      "create_time_utc": 1641379821139,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1633928400000,
+        "date_range_end": 1634014800000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_21192'",
+          "max": "'abc_4_64424'"
+        },
+        "1": {
+          "min": "10021192",
+          "max": "10064424"
+        },
+        "12": {
+          "min": "2021-10-11",
+          "max": "2021-10-11"
+        },
+        "2": {
+          "min": "2021-10-11 16:08:21.0",
+          "max": "2021-10-11 23:58:53.0"
+        },
+        "3": {
+          "min": "21192",
+          "max": "64424"
+        },
+        "4": {
+          "min": "213",
+          "max": "646"
+        },
+        "5": {
+          "min": "2119221192",
+          "max": "6442464424"
+        },
+        "6": {
+          "min": "2021-10-11 16:08:21",
+          "max": "2021-10-11 23:58:53"
+        },
+        "7": {
+          "min": "10021192",
+          "max": "10064424"
+        },
+        "10": {
+          "min": "213.0",
+          "max": "646.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641380385323,
+      "source_count": 566,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 4528,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 7358,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 5660,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 11886,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 2830,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 10754,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 1698,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 5660,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 4528,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 2830
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "7c90cd71-2a61-afbe-ef81-956830d60a2a",
+      "name": "20211012000000_20211013000000",
+      "create_time_utc": 1641379832626,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634014800000,
+        "date_range_end": 1634101200000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_20328'",
+          "max": "'abc_4_64141'"
+        },
+        "1": {
+          "min": "10020328",
+          "max": "10064141"
+        },
+        "12": {
+          "min": "2021-10-12",
+          "max": "2021-10-12"
+        },
+        "2": {
+          "min": "2021-10-12 00:00:01.0",
+          "max": "2021-10-12 23:58:53.0"
+        },
+        "3": {
+          "min": "20328",
+          "max": "64141"
+        },
+        "4": {
+          "min": "205",
+          "max": "643"
+        },
+        "5": {
+          "min": "2032820328",
+          "max": "6414164141"
+        },
+        "6": {
+          "min": "2021-10-12 00:00:01",
+          "max": "2021-10-12 23:58:53"
+        },
+        "7": {
+          "min": "10020328",
+          "max": "10064141"
+        },
+        "10": {
+          "min": "205.0",
+          "max": "643.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641380736727,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "a8119cff-9a0b-5cd0-374d-e4e1d3e4722c",
+      "name": "20211013000000_20211014000000",
+      "create_time_utc": 1641379840787,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634101200000,
+        "date_range_end": 1634187600000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_19464'",
+          "max": "'abc_4_63277'"
+        },
+        "1": {
+          "min": "10019464",
+          "max": "10063277"
+        },
+        "12": {
+          "min": "2021-10-13",
+          "max": "2021-10-13"
+        },
+        "2": {
+          "min": "2021-10-13 00:00:01.0",
+          "max": "2021-10-13 23:58:53.0"
+        },
+        "3": {
+          "min": "19464",
+          "max": "63277"
+        },
+        "4": {
+          "min": "196",
+          "max": "634"
+        },
+        "5": {
+          "min": "1946419464",
+          "max": "6327763277"
+        },
+        "6": {
+          "min": "2021-10-13 00:00:01",
+          "max": "2021-10-13 23:58:53"
+        },
+        "7": {
+          "min": "10019464",
+          "max": "10063277"
+        },
+        "10": {
+          "min": "196.0",
+          "max": "634.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641380313574,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "360737db-cf5e-092e-996b-78e15e1efcf2",
+      "name": "20211014000000_20211015000000",
+      "create_time_utc": 1641379849626,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634187600000,
+        "date_range_end": 1634274000000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_18600'",
+          "max": "'abc_4_62413'"
+        },
+        "1": {
+          "min": "10018600",
+          "max": "10062413"
+        },
+        "12": {
+          "min": "2021-10-14",
+          "max": "2021-10-14"
+        },
+        "2": {
+          "min": "2021-10-14 00:00:01.0",
+          "max": "2021-10-14 23:58:53.0"
+        },
+        "3": {
+          "min": "18600",
+          "max": "62413"
+        },
+        "4": {
+          "min": "188",
+          "max": "626"
+        },
+        "5": {
+          "min": "1860018600",
+          "max": "6241362413"
+        },
+        "6": {
+          "min": "2021-10-14 00:00:01",
+          "max": "2021-10-14 23:58:53"
+        },
+        "7": {
+          "min": "10018600",
+          "max": "10062413"
+        },
+        "10": {
+          "min": "188.0",
+          "max": "626.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641383102670,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "7ccbf584-e6c0-a8db-bcc7-19e3c0671697",
+      "name": "20211015000000_20211016000000",
+      "create_time_utc": 1641379858311,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634274000000,
+        "date_range_end": 1634360400000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_17736'",
+          "max": "'abc_4_61549'"
+        },
+        "1": {
+          "min": "10017736",
+          "max": "10061549"
+        },
+        "12": {
+          "min": "2021-10-15",
+          "max": "2021-10-15"
+        },
+        "2": {
+          "min": "2021-10-15 00:00:01.0",
+          "max": "2021-10-15 23:58:53.0"
+        },
+        "3": {
+          "min": "17736",
+          "max": "61549"
+        },
+        "4": {
+          "min": "179",
+          "max": "617"
+        },
+        "5": {
+          "min": "1773617736",
+          "max": "6154961549"
+        },
+        "6": {
+          "min": "2021-10-15 00:00:01",
+          "max": "2021-10-15 23:58:53"
+        },
+        "7": {
+          "min": "10017736",
+          "max": "10061549"
+        },
+        "10": {
+          "min": "179.0",
+          "max": "617.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641384117443,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "64ff2fcc-755f-83cc-3edc-03b3d2ac3db2",
+      "name": "20211016000000_20211017000000",
+      "create_time_utc": 1641379865932,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634360400000,
+        "date_range_end": 1634446800000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_16872'",
+          "max": "'abc_4_60685'"
+        },
+        "1": {
+          "min": "10016872",
+          "max": "10060685"
+        },
+        "12": {
+          "min": "2021-10-16",
+          "max": "2021-10-16"
+        },
+        "2": {
+          "min": "2021-10-16 00:00:01.0",
+          "max": "2021-10-16 23:58:53.0"
+        },
+        "3": {
+          "min": "16872",
+          "max": "60685"
+        },
+        "4": {
+          "min": "170",
+          "max": "608"
+        },
+        "5": {
+          "min": "1687216872",
+          "max": "6068560685"
+        },
+        "6": {
+          "min": "2021-10-16 00:00:01",
+          "max": "2021-10-16 23:58:53"
+        },
+        "7": {
+          "min": "10016872",
+          "max": "10060685"
+        },
+        "10": {
+          "min": "170.0",
+          "max": "608.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641383113097,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "7889e91e-2b0f-8310-3d8d-c3997bb8d715",
+      "name": "20211017000000_20211018000000",
+      "create_time_utc": 1641379873891,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634446800000,
+        "date_range_end": 1634533200000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_16008'",
+          "max": "'abc_4_59821'"
+        },
+        "1": {
+          "min": "10016008",
+          "max": "10059821"
+        },
+        "12": {
+          "min": "2021-10-17",
+          "max": "2021-10-17"
+        },
+        "2": {
+          "min": "2021-10-17 00:00:01.0",
+          "max": "2021-10-17 23:58:53.0"
+        },
+        "3": {
+          "min": "16008",
+          "max": "59821"
+        },
+        "4": {
+          "min": "162",
+          "max": "600"
+        },
+        "5": {
+          "min": "1600816008",
+          "max": "5982159821"
+        },
+        "6": {
+          "min": "2021-10-17 00:00:01",
+          "max": "2021-10-17 23:58:53"
+        },
+        "7": {
+          "min": "10016008",
+          "max": "10059821"
+        },
+        "10": {
+          "min": "162.0",
+          "max": "600.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641383733641,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "637e3dfa-6651-1ee1-4a66-c9ac917ce977",
+      "name": "20211018000000_20211019000000",
+      "create_time_utc": 1641379882100,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634533200000,
+        "date_range_end": 1634619600000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_15144'",
+          "max": "'abc_4_58957'"
+        },
+        "1": {
+          "min": "10015144",
+          "max": "10058957"
+        },
+        "12": {
+          "min": "2021-10-18",
+          "max": "2021-10-18"
+        },
+        "2": {
+          "min": "2021-10-18 00:00:01.0",
+          "max": "2021-10-18 23:58:53.0"
+        },
+        "3": {
+          "min": "15144",
+          "max": "58957"
+        },
+        "4": {
+          "min": "153",
+          "max": "591"
+        },
+        "5": {
+          "min": "1514415144",
+          "max": "5895758957"
+        },
+        "6": {
+          "min": "2021-10-18 00:00:01",
+          "max": "2021-10-18 23:58:53"
+        },
+        "7": {
+          "min": "10015144",
+          "max": "10058957"
+        },
+        "10": {
+          "min": "153.0",
+          "max": "591.0"
+        }
+      },
+      "parameters": null,
+      "dictionaries": null,
+      "snapshots": null,
+      "last_build_time": 1641383858207,
+      "source_count": 1728,
+      "source_bytes_size": 14623650,
+      "column_source_bytes": {
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_1": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_5": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_8": 22464,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_6": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DATE_7": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_10": 36288,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.INT_0": 8640,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.STRING_9": 32832,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_12": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_3": 5184,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.ID": 17280,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.TIMESTAMP_11": 0,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.BIGINT_2": 13824,
+        "TEST_DB.DATE_TIMESTAMP_TABLE.DOUBLE_4": 8640
+      },
+      "ori_snapshot_size": {},
+      "additionalInfo": {},
+      "is_realtime_segment": false,
+      "is_snapshot_ready": false,
+      "is_dict_ready": false,
+      "is_flat_table_ready": true,
+      "is_fact_view_ready": false,
+      "multi_partitions": [],
+      "max_bucket_id": -1
+    },
+    {
+      "id": "7718ae3c-3e74-0e17-956e-6a7157225808",
+      "name": "20211019000000_20211020000000",
+      "create_time_utc": 1641379889061,
+      "status": "READY",
+      "segRange": {
+        "@class": "org.apache.kylin.metadata.model.SegmentRange$TimePartitionedSegmentRange",
+        "date_range_start": 1634619600000,
+        "date_range_end": 1634706000000
+      },
+      "timeRange": null,
+      "dimension_range_info_map": {
+        "0": {
+          "min": "'abc_4_14280'",
+          "max": "'abc_4_58093'"
+        },
+        "1": {
+          "min": "10014280",
+          "max": "10058093"
+        },
+        "12": {
+          "min": "2021-10-19",
+          "max": "2021-10-19"
+        },
+        "2": {
+          "min": "2021-10-19 00:00:01.0",
+          "max": "2021-10-19 23:58:53.0"
+        },
+        "3": {
+          "min": "14280",
+          "max": "58093"
+        },
+        "4": {
+          "min": "144",
+          "max": "582"
+        },
+        "5": {
+          "min": "1428014280",
+          "max": "5809358093"
+        },
+        "6": {
... 15259 lines suppressed ...