You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2018/06/30 12:22:57 UTC

[kylin] 11/12: KYLIN-3370 fix bug for non-constant filter

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 <li...@apache.org>
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;
     }