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


The following commit(s) were added to refs/heads/2.6.x by this push:
     new 579ae97  KYLIN-4354 Prune segment not using given filter when using 
jdbc preparestatement
579ae97 is described below

commit 579ae9707c86fe3c5fa8124664208a050a2f1d16
Author: yaqian.zhang <598593...@qq.com>
AuthorDate: Fri Mar 20 15:37:41 2020 +0800

    KYLIN-4354 Prune segment not using given filter when using jdbc 
preparestatement
---
 .../apache/kylin/cube/common/SegmentPruner.java    |  7 +++++-
 .../kylin/cube/common/SegmentPrunerTest.java       | 26 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

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 2de62de..0d74eb9 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
@@ -31,6 +31,7 @@ import org.apache.kylin.metadata.datatype.DataType;
 import org.apache.kylin.metadata.datatype.DataTypeOrder;
 import org.apache.kylin.metadata.filter.CompareTupleFilter;
 import org.apache.kylin.metadata.filter.ConstantTupleFilter;
+import org.apache.kylin.metadata.filter.DynamicTupleFilter;
 import org.apache.kylin.metadata.filter.TupleFilter;
 import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.model.PartitionDesc;
@@ -127,7 +128,7 @@ public class SegmentPruner {
             return true;
         
         // pass on non-constant filter
-        if (comp.getChildren().size() > 1 && !(comp.getChildren().get(1) 
instanceof ConstantTupleFilter))
+        if (comp.getChildren().size() <= 1 || 
!isConstantValue(comp.getChildren().get(1)))
             return true;
 
         TblColRef col = comp.getColumn();
@@ -159,6 +160,10 @@ public class SegmentPruner {
         }
     }
 
+    private static boolean isConstantValue(TupleFilter tupleFilter) {
+        return tupleFilter instanceof ConstantTupleFilter || tupleFilter 
instanceof DynamicTupleFilter;
+    }
+
     private static String toString(Object v) {
         return v == null ? null : v.toString();
     }
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 5d98d06..b9bc112 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
@@ -31,6 +31,8 @@ import org.apache.kylin.cube.CubeInstance;
 import org.apache.kylin.cube.CubeManager;
 import org.apache.kylin.cube.CubeSegment;
 import org.apache.kylin.cube.DimensionRangeInfo;
+import org.apache.kylin.metadata.filter.DynamicTupleFilter;
+import org.apache.kylin.metadata.filter.CompareTupleFilter;
 import org.apache.kylin.metadata.filter.ConstantTupleFilter;
 import org.apache.kylin.metadata.filter.LogicalTupleFilter;
 import org.apache.kylin.metadata.filter.TupleFilter;
@@ -77,6 +79,30 @@ public class SegmentPrunerTest extends 
LocalFileMetadataTestCase {
     }
 
     @Test
+    public void testDynamicFilter() {
+        CubeSegment seg = cube.getFirstSegment();
+        TblColRef col = cube.getModel().findColumn("CUSTOMER.C_NATION");
+
+        // pass case of a dynamic filter
+        {
+            DynamicTupleFilter dyna = new DynamicTupleFilter("$0");
+            CompareTupleFilter f = compare(col, FilterOperatorEnum.EQ, dyna);
+            f.bindVariable("$0", "CHINA");
+            SegmentPruner segmentPruner = new SegmentPruner(f);
+            Assert.assertTrue(segmentPruner.check(seg));
+        }
+
+        // prune case of a dynamic filter
+        {
+            DynamicTupleFilter dyna = new DynamicTupleFilter("$0");
+            CompareTupleFilter f = compare(col, FilterOperatorEnum.EQ, dyna);
+            f.bindVariable("$0", "XXXX");
+            SegmentPruner segmentPruner = new SegmentPruner(f);
+            Assert.assertTrue(segmentPruner.check(seg) == false);
+        }
+    }
+
+    @Test
     public void testDimensionRangeCheck() {
         CubeSegment cubeSegment = cube.getSegments().getFirstSegment();
 

Reply via email to