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;