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 ...