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();