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 07:04:03 UTC

[kylin] 03/14: 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 2.6.x
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit b6b2e162a4453799015afd1c529a4539b55c9e8b
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));
+
+            }
+        }
+    }
 }