Repository: incubator-kylin Updated Branches: refs/heads/1.x-staging be9c48464 -> 38f4fd01f
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/1.x-staging Commit: 38f4fd01f47b37357a0f98501e5f71a31aaaa268 Parents: be9c484 Author: Yang Li <liy...@apache.org> Authored: Sat Sep 26 09:56:05 2015 +0800 Committer: Yang Li <liy...@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;