You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2019/05/08 01:53:16 UTC

[kylin] 02/03: KYLIN-3813 don't do push down when both of the children of CompareTupleFilter are CompareTupleFilter with column included

This is an automated email from the ASF dual-hosted git repository.

nic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 7bfa5d136fdb8cdba5cc714213e3ef4fa4f1ed62
Author: kyotoYaho <nj...@apache.org>
AuthorDate: Tue Mar 19 09:57:09 2019 +0800

    KYLIN-3813 don't do push down when both of the children of CompareTupleFilter are CompareTupleFilter with column included
---
 .../org/apache/kylin/metadata/expression/CaseTupleExpression.java  | 3 ++-
 .../java/org/apache/kylin/metadata/filter/CompareTupleFilter.java  | 7 ++++++-
 .../main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java | 2 +-
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/expression/CaseTupleExpression.java b/core-metadata/src/main/java/org/apache/kylin/metadata/expression/CaseTupleExpression.java
index 6b9034b..a6122e5 100644
--- a/core-metadata/src/main/java/org/apache/kylin/metadata/expression/CaseTupleExpression.java
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/expression/CaseTupleExpression.java
@@ -47,7 +47,8 @@ public class CaseTupleExpression extends TupleExpression {
     protected boolean ifAbleToPushDown() {
         if (ifAbleToPushDown == null) {
             for (Pair<TupleFilter, TupleExpression> whenEntry : whenList) {
-                ifAbleToPushDown = whenEntry.getSecond().ifAbleToPushDown();
+                ifAbleToPushDown = TupleFilter.isEvaluableRecursively(whenEntry.getFirst())
+                        && whenEntry.getSecond().ifAbleToPushDown();
                 if (!ifAbleToPushDown) {
                     break;
                 }
diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
index 1d0c7c3..6ae478f 100644
--- a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
@@ -38,6 +38,9 @@ public class CompareTupleFilter extends TupleFilter implements IOptimizeableTupl
         AlwaysTrue, AlwaysFalse, Unknown
     }
 
+    // if the two children are both CompareTupleFilter, isNormal will be false
+    private boolean isNormal = true;
+
     // operand 1 is either a column or a function
     private TblColRef column;
     private FunctionTupleFilter function;
@@ -237,7 +240,7 @@ public class CompareTupleFilter extends TupleFilter implements IOptimizeableTupl
 
     @Override
     public boolean isEvaluable() {
-        return (column != null || (function != null && function.isEvaluable())) //
+        return isNormal && (column != null || (function != null && function.isEvaluable())) //
                 && (!conditionValues.isEmpty() || operator == FilterOperatorEnum.ISNOTNULL || operator == FilterOperatorEnum.ISNULL) //
                 && secondColumn == null;
     }
@@ -294,6 +297,8 @@ public class CompareTupleFilter extends TupleFilter implements IOptimizeableTupl
             result = new ConstantTupleFilter("true");
         } else if (result == ConstantTupleFilter.FALSE) {
             result = new ConstantTupleFilter("false");
+        } else {
+            this.isNormal = false;
         }
         return result;
     }
diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java
index a6a43b9..9def697 100755
--- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java
+++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java
@@ -278,7 +278,7 @@ public class OLAPAggregateRel extends Aggregate implements OLAPRel {
             TblColRef groupOutCol = inputColumnRowType.getColumnByIndex(i);
             if (tupleExpression instanceof ColumnTupleExpression) {
                 this.groups.add(((ColumnTupleExpression) tupleExpression).getColumn());
-            } else if (this.context.isDynamicColumnEnabled()) {
+            } else if (this.context.isDynamicColumnEnabled() && tupleExpression.ifForDynamicColumn()) {
                 Pair<Set<TblColRef>, Set<TblColRef>> cols = ExpressionColCollector.collectColumnsPair(tupleExpression);
 
                 // push down only available for the innermost aggregation