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 <[email protected]> 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)); + + } + } + } }
