You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2020/02/07 14:26:00 UTC
[kylin] 05/44: KYLIN-4287 segmenPruner satisfy "IN" filter bug
This is an automated email from the ASF dual-hosted git repository.
nic pushed a commit to branch 3.0.x
in repository https://gitbox.apache.org/repos/asf/kylin.git
commit c5818262b1ae01fd5f7f044fb9bc2d4be7841b99
Author: zhangbushi5 <84...@qq.com>
AuthorDate: Tue Dec 10 17:15:54 2019 +0800
KYLIN-4287 segmenPruner satisfy "IN" filter bug
---
.../apache/kylin/cube/common/SegmentPruner.java | 8 ++++---
.../kylin/cube/common/SegmentPrunerTest.java | 25 ++++++++++++++++++++++
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/common/SegmentPruner.java b/core-cube/src/main/java/org/apache/kylin/cube/common/SegmentPruner.java
index ae21a4d..2de62de 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/common/SegmentPruner.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/common/SegmentPruner.java
@@ -137,9 +137,11 @@ public class SegmentPruner {
switch (comp.getOperator()) {
case EQ:
case IN:
- String filterMin = order.min((Set<String>) comp.getValues());
- String filterMax = order.max((Set<String>) comp.getValues());
- return order.compare(filterMin, maxVal) <= 0 && order.compare(minVal, filterMax) <= 0;
+ for (String filterValue : (Set<String>) comp.getValues()) {
+ if (order.compare(filterValue, maxVal) <= 0 && order.compare(minVal, filterValue) <= 0)
+ return true;
+ }
+ return false;
case LT:
return order.compare(minVal, filterVal) < 0;
case LTE:
diff --git a/core-cube/src/test/java/org/apache/kylin/cube/common/SegmentPrunerTest.java b/core-cube/src/test/java/org/apache/kylin/cube/common/SegmentPrunerTest.java
index 69f9b10..5d98d06 100644
--- a/core-cube/src/test/java/org/apache/kylin/cube/common/SegmentPrunerTest.java
+++ b/core-cube/src/test/java/org/apache/kylin/cube/common/SegmentPrunerTest.java
@@ -343,4 +343,29 @@ public class SegmentPrunerTest extends LocalFileMetadataTestCase {
}
}
}
+
+ @Test
+ public void testPruneSegWithFilterIN() {
+ // legacy cube segments does not have DimensionRangeInfo, but with TSRange can do some pruning
+ CubeInstance cube = CubeManager.getInstance(getTestConfig())
+ .getCube("test_kylin_cube_without_slr_left_join_ready_2_segments");
+ TblColRef col = cube.getModel().findColumn("TEST_KYLIN_FACT.CAL_DT");
+ CubeSegment seg = cube.getSegments(SegmentStatusEnum.READY).get(0);
+ TSRange tsRange = seg.getTSRange();
+ String start = DateFormat.formatToTimeStr(tsRange.start.v, "yyyy-MM-dd");
+ CubeSegment seg2 = cube.getSegments(SegmentStatusEnum.READY).get(1);
+ TSRange tsRange2 = seg2.getTSRange();
+ try (SetAndUnsetSystemProp sns = new SetAndUnsetSystemProp("kylin.query.skip-empty-segments", "false")) {
+
+ {
+ TupleFilter inFilter = new ConstantTupleFilter(Sets.newHashSet(start,
+ DateFormat.formatToTimeStr(tsRange2.end.v + 1000 * 60 * 60 * 24L, "yyyy-MM-dd")));
+ TupleFilter filter = compare(col, FilterOperatorEnum.IN, inFilter);
+ SegmentPruner segmentPruner = new SegmentPruner(filter);
+ Assert.assertTrue(segmentPruner.check(seg));
+ Assert.assertFalse(segmentPruner.check(seg2));
+
+ }
+ }
+ }
}