Repository: incubator-kylin
Updated Branches:
  refs/heads/2.x-staging 1f4081f51 -> 89029f57b


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/89029f57
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/89029f57
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/89029f57

Branch: refs/heads/2.x-staging
Commit: 89029f57be0d782c1aad9f61550fa67c1985a590
Parents: 1f4081f
Author: Yang Li <liy...@apache.org>
Authored: Sat Sep 26 10:23:43 2015 +0800
Committer: Yang Li <liy...@apache.org>
Committed: Sat Sep 26 10:23:43 2015 +0800

----------------------------------------------------------------------
 .../metadata/filter/LogicalTupleFilter.java     | 22 +++++++++++++++++++-
 .../common/coprocessor/FilterDecorator.java     |  7 +++----
 2 files changed, 24 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/89029f57/core-metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
index e444a7d..83404eb 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
+++ 
b/core-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/89029f57/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/common/coprocessor/FilterDecorator.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/common/coprocessor/FilterDecorator.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/common/coprocessor/FilterDecorator.java
index 4fc922a..9b12bfd 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/common/coprocessor/FilterDecorator.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/common/coprocessor/FilterDecorator.java
@@ -129,10 +129,8 @@ public class FilterDecorator implements 
TupleFilterSerializer.Decorator {
         if (filter == null)
             return null;
 
-        // In case of NOT(inEvaluatableFilter), we should immediately replace 
it as TRUE,
-        // Otherwise, inEvaluatableFilter will later be replace with TRUE and 
NOT(unEvaluatableFilter) will
-        // always return FALSE
-        if (filter.getOperator() == TupleFilter.FilterOperatorEnum.NOT && 
!TupleFilter.isEvaluableRecursively(filter)) {
+        // un-evaluatable filter is replaced with TRUE
+        if (!filter.isEvaluable()) {
             TupleFilter.collectColumns(filter, inevaluableColumns);
             return ConstantTupleFilter.TRUE;
         }
@@ -140,6 +138,7 @@ public class FilterDecorator implements 
TupleFilterSerializer.Decorator {
         if (!(filter instanceof CompareTupleFilter))
             return filter;
 
+        // double check all internal of CompareTupleFilter is evaluatable
         if (!TupleFilter.isEvaluableRecursively(filter)) {
             TupleFilter.collectColumns(filter, inevaluableColumns);
             return ConstantTupleFilter.TRUE;

Reply via email to