xzj7019 commented on code in PR #23935:
URL: https://github.com/apache/doris/pull/23935#discussion_r1316877390
##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindow.java:
##########
@@ -81,88 +55,36 @@ public Rule build() {
return logicalFilter(logicalWindow()).thenApply(ctx -> {
LogicalFilter<LogicalWindow<Plan>> filter = ctx.root;
LogicalWindow<Plan> window = filter.child();
-
- // We have already done such optimization rule, so just ignore it.
- if (window.child(0) instanceof LogicalPartitionTopN) {
- return filter;
- }
-
- List<NamedExpression> windowExprs = window.getWindowExpressions();
- if (windowExprs.size() != 1) {
- return filter;
- }
- NamedExpression windowExpr = windowExprs.get(0);
- if (windowExpr.children().size() != 1 || !(windowExpr.child(0)
instanceof WindowExpression)) {
- return filter;
- }
-
- // Check the filter conditions. Now, we currently only support
simple conditions of the form
- // 'column </ <=/ = constant'. We will extract some related
conjuncts and do some check.
- Set<Expression> conjuncts = filter.getConjuncts();
- Set<Expression> relatedConjuncts =
extractRelatedConjuncts(conjuncts, windowExpr.getExprId());
-
- boolean hasPartitionLimit = false;
- long partitionLimit = Long.MAX_VALUE;
-
- for (Expression conjunct : relatedConjuncts) {
- Preconditions.checkArgument(conjunct instanceof
BinaryOperator);
- BinaryOperator op = (BinaryOperator) conjunct;
- Expression leftChild = op.children().get(0);
- Expression rightChild = op.children().get(1);
-
- Preconditions.checkArgument(leftChild instanceof SlotReference
- && rightChild instanceof IntegerLikeLiteral);
-
- long limitVal = ((IntegerLikeLiteral)
rightChild).getLongValue();
- // Adjust the value for 'limitVal' based on the comparison
operators.
- if (conjunct instanceof LessThan) {
- limitVal--;
- }
- if (limitVal < 0) {
- return new
LogicalEmptyRelation(ctx.statementContext.getNextRelationId(),
filter.getOutput());
+ Set<Expression> commonPartitionKeys =
window.getCommonPartitionKeyFromWindowExpressions();
+ Set<Expression> bottomConjuncts = Sets.newHashSet();
+ Set<Expression> upperConjuncts = Sets.newHashSet();
+ for (Expression expr : filter.getConjuncts()) {
+ boolean pushed = false;
+ for (Expression partitionKey : commonPartitionKeys) {
+ if
(partitionKey.getInputSlots().containsAll(expr.getInputSlots())) {
Review Comment:
select * from (select c.*, rank() over(partition by c2+c3 order by c4) rn
from c) abc where c2=1;
Seems that c2=1 can't be pushed down. We can just support column currently.
--
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.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]