imay commented on a change in pull request #1471: Planner support push down 
predicates past agg, win and sort
URL: https://github.com/apache/incubator-doris/pull/1471#discussion_r317559883
 
 

 ##########
 File path: fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
 ##########
 @@ -1545,5 +1625,191 @@ private void 
materializeInlineViewResultExprForCrossJoinOrCountStar(InlineViewRe
         }
     }
 
+    /**
+     
------------------------------------------------------------------------------
+     */
+    /**
+     * Push down predicates rules
+     */
+
+    /**
+     * Entrance for push-down rules, it will execute possible push-down rules 
from top to down
+     * and the planner will be responsible for assigning all predicates to 
PlanNode.
+     */
+    private void pushDownPredicates(Analyzer analyzer, SelectStmt stmt) throws 
AnalysisException {
+        pushDownPredicatesPastSort(analyzer, stmt);
+        pushDownPredicatesPastWindows(analyzer, stmt);
+        pushDownPredicatesPastAggregation(analyzer, stmt);
+    }
+
+    private void pushDownPredicatesPastSort(Analyzer analyzer, SelectStmt 
stmt) throws AnalysisException {
+        // TODO chenhao, remove isEvaluateOrderBy when SubQuery's default 
limit is removed.
+        if (stmt.evaluateOrderBy() || stmt.getLimit() >= 0 || stmt.getOffset() 
> 0 || stmt.getSortInfo() == null) {
+            return;
+        } 
+
+        final List<Expr> predicates = getBoundPredicates(analyzer, 
stmt.getSortInfo().getSortTupleDescriptor());
+        if (predicates.size() <= 0) {
+            return;
+        }
+
+        final List<Expr> pushDownPredicates = 
getPredicatesReplacedSlotWithSourceExpr(predicates, analyzer);
+        if (pushDownPredicates.size() <= 0) {
+            return;
+        }
+        
+        if (putPredicatesOnWindows(stmt, analyzer, pushDownPredicates)) {
+            return;
+        }
+        if (putPredicatesOnAggregation(stmt, analyzer, pushDownPredicates)) {
+            return;
+        }
+
+        putPredicatesOnFrom(stmt, analyzer, pushDownPredicates);
+    }
+
+    private void pushDownPredicatesPastWindows(Analyzer analyzer, SelectStmt 
stmt) throws AnalysisException {
+        final AnalyticInfo analyticInfo = stmt.getAnalyticInfo();
+        if (analyticInfo == null || 
analyticInfo.getCommonPartitionExprs().size() == 0) {
+            return;
+        }
+
+        final List<Expr> predicates = getBoundPredicates(analyzer, 
analyticInfo.getOutputTupleDesc());
+        if (predicates.size() <= 0) {
+            return;
+        }
+
+        final List<Expr> pushDownPredicates = 
getPredicatesBoundedByGroupbysAndReplaceSlotWithSourceExpr(predicates, 
analyzer);
+        if (pushDownPredicates.size() <= 0) {
+            return;
+        }
+
+        if (putPredicatesOnAggregation(stmt, analyzer, pushDownPredicates)) {
+            return;
+        }
+
+        putPredicatesOnFrom(stmt, analyzer, pushDownPredicates);
+    }
+
+    private void pushDownPredicatesPastAggregation(Analyzer analyzer, 
SelectStmt stmt) throws AnalysisException {
+        final AggregateInfo aggregateInfo = stmt.getAggInfo();
+        if (aggregateInfo == null || aggregateInfo.getGroupingExprs().size() 
<= 0) {
+            return;
+        }
+
+        final List<Expr> predicates = getBoundPredicates(analyzer, 
aggregateInfo.getOutputTupleDesc());
+        if (predicates.size() <= 0) {
+            return;
+        }
+
+        final List<Expr> pushDownPredicates = 
getPredicatesBoundedByGroupbysAndReplaceSlotWithSourceExpr(predicates, 
analyzer);
+        if (pushDownPredicates.size() <= 0) {
+            return;
+        }
+
+        putPredicatesOnFrom(stmt, analyzer, pushDownPredicates);
+    }
+
+    private List<Expr> 
getPredicatesBoundedByGroupbysAndReplaceSlotWithSourceExpr(List<Expr> 
predicates, Analyzer analyzer) {
 
 Review comment:
   can you make this function name short

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to