This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch sync in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 353319a1aee19868295196901dbd5c49dec282cd Author: Li Yang <[email protected]> AuthorDate: Fri Jun 22 13:24:36 2018 +0800 KYLIN-3370 fix bug for non-constant filter --- .../main/java/org/apache/kylin/cube/common/SegmentPruner.java | 5 +++++ .../java/org/apache/kylin/cube/common/SegmentPrunerTest.java | 9 +++++++++ .../main/java/org/apache/kylin/metadata/filter/TupleFilter.java | 7 ++++++- 3 files changed, 20 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 b7f0809..de77511 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 @@ -32,6 +32,7 @@ import org.apache.kylin.cube.DimensionRangeInfo; 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.TupleFilter; import org.apache.kylin.metadata.model.DataModelDesc; import org.apache.kylin.metadata.model.PartitionDesc; @@ -140,6 +141,10 @@ public class SegmentPruner { // result of null comparison is query engine specific. if (minVal == null && maxVal == null) return true; + + // pass on non-constant filter + if (comp.getChildren().size() > 1 && !(comp.getChildren().get(1) instanceof ConstantTupleFilter)) + return true; TblColRef col = comp.getColumn(); DataTypeOrder order = col.getType().getOrder(); 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 7bf7a87..603db97 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 @@ -74,6 +74,8 @@ public class SegmentPrunerTest extends LocalFileMetadataTestCase { //integer TblColRef qtyCol = cube.getModel().findColumn("V_LINEORDER.LO_QUANTITY"); + TblColRef revCol = cube.getModel().findColumn("V_LINEORDER.V_REVENUE"); + TupleFilter constFilter_LO_QUANTITY0 = new ConstantTupleFilter(Sets.newHashSet("8", "18", "28"));//between min and max value TupleFilter constFilter_LO_QUANTITY1 = new ConstantTupleFilter("1");//min value TupleFilter constFilter_LO_QUANTITY2 = new ConstantTupleFilter("50");//max value @@ -81,6 +83,13 @@ public class SegmentPrunerTest extends LocalFileMetadataTestCase { TupleFilter constFilter_LO_QUANTITY4 = new ConstantTupleFilter("200");//gt max value TupleFilter constFilter_LO_QUANTITY5 = new ConstantTupleFilter(Sets.newHashSet("51", "52", "53"));//gt max values + // non-constant filter + { + TupleFilter f = compare(qtyCol, FilterOperatorEnum.EQ, revCol); + SegmentPruner segmentPruner = new SegmentPruner(f); + Assert.assertTrue(segmentPruner.check(cubeSegment)); + } + // is null { TupleFilter f = compare(qtyCol, FilterOperatorEnum.ISNULL); diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java index 43b204a..672aba0 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java @@ -93,7 +93,12 @@ public abstract class TupleFilter { public static CompareTupleFilter compare(TblColRef col, FilterOperatorEnum op, Object val) { CompareTupleFilter r = new CompareTupleFilter(op); r.addChild(new ColumnTupleFilter(col)); - r.addChild(val instanceof ConstantTupleFilter ? (ConstantTupleFilter) val : new ConstantTupleFilter(val)); + if (val instanceof TupleFilter) + r.addChild((TupleFilter) val); + else if (val instanceof TblColRef) + r.addChild(new ColumnTupleFilter((TblColRef) col)); + else + r.addChild(new ConstantTupleFilter(val)); return r; }
