You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2015/10/26 10:07:59 UTC

[13/45] incubator-kylin git commit: KYLIN-1039 Fix un-evaluatable in LogicalTupleFilter

KYLIN-1039 Fix un-evaluatable in LogicalTupleFilter


Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/38f4fd01
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/38f4fd01
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/38f4fd01

Branch: refs/heads/master
Commit: 38f4fd01f47b37357a0f98501e5f71a31aaaa268
Parents: be9c484
Author: Yang Li <li...@apache.org>
Authored: Sat Sep 26 09:56:05 2015 +0800
Committer: Yang Li <li...@apache.org>
Committed: Sat Sep 26 09:56:05 2015 +0800

----------------------------------------------------------------------
 .../metadata/filter/LogicalTupleFilter.java     | 22 +++++++++++++++++++-
 .../hbase/coprocessor/CoprocessorFilter.java    |  8 +++----
 2 files changed, 24 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/38f4fd01/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
index c17310a..1421440 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
@@ -112,7 +112,27 @@ public class LogicalTupleFilter extends TupleFilter {
 
     @Override
     public boolean isEvaluable() {
-        return true;
+        switch (operator) {
+        case NOT:
+            // Un-evaluatable branch will be pruned and be replaced with TRUE.
+            // And this must happen at the top NOT, otherwise NOT (TRUE) becomes false.
+            for (TupleFilter child : children) {
+                if (TupleFilter.isEvaluableRecursively(child) == false)
+                    return false;
+            }
+            return true;
+        case OR:
+            // (anything OR un-evaluable) will become (anything or TRUE) which is effectively TRUE.
+            // The "anything" is not evaluated, kinda disabled, by the un-evaluable part.
+            // If it's partially un-evaluable, then "anything" is partially disabled, and the OR is still not fully evaluatable.
+            for (TupleFilter child : children) {
+                if (TupleFilter.isEvaluableRecursively(child) == false)
+                    return false;
+            }
+            return true;
+        default:
+            return true;
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/38f4fd01/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
index 70d59ca..65fddd2 100644
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
+++ b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
@@ -30,7 +30,6 @@ import org.apache.kylin.metadata.filter.ColumnTupleFilter;
 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.filter.TupleFilter.FilterOperatorEnum;
 import org.apache.kylin.metadata.filter.TupleFilterSerializer;
 import org.apache.kylin.metadata.filter.TupleFilterSerializer.Decorator;
 import org.apache.kylin.metadata.model.TblColRef;
@@ -62,10 +61,8 @@ public class CoprocessorFilter {
             if (filter == null)
                 return null;
 
-            // In case of NOT(unEvaluatableFilter), we should immediatedly replace it as TRUE,
-            // Otherwise, unEvaluatableFilter will later be replace with TRUE and NOT(unEvaluatableFilter) will
-            // always return FALSE
-            if (filter.getOperator() == FilterOperatorEnum.NOT && !TupleFilter.isEvaluableRecursively(filter)) {
+            // un-evaluatable filter is replaced with TRUE
+            if (!filter.isEvaluable()) {
                 TupleFilter.collectColumns(filter, unstrictlyFilteredColumns);
                 return ConstantTupleFilter.TRUE;
             }
@@ -73,6 +70,7 @@ public class CoprocessorFilter {
             if (!(filter instanceof CompareTupleFilter))
                 return filter;
 
+            // double check all internal of CompareTupleFilter is evaluatable
             if (!TupleFilter.isEvaluableRecursively(filter)) {
                 TupleFilter.collectColumns(filter, unstrictlyFilteredColumns);
                 return ConstantTupleFilter.TRUE;