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

Reply via email to