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/05/06 11:13:52 UTC
[kylin] branch 2.6.x updated: KYLIN-4354 Prune segment not using
given filter when using jdbc preparestatement
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 <59...@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();