[opt](optimizer) Remove unused code to unify code (#38918)

## Proposed changes
Now, Agg's child predicates will  not spread to agg.
    For example:
    select a, sum(b)
    from (
     select a,b from t where a = 1 and b = 2
    ) t
    group by a
    `a = 1` in scan can be propagated to `a` of agg.
    But `b = 2` in scan can not be propagated to `sum(b)` of agg.

Issue Number: #38905
<!--Describe your changes.-->

Co-authored-by: liutang123 <liulijia@gmail.com>
This commit is contained in:
Lijia Liu
2024-08-06 19:09:25 +08:00
committed by GitHub
parent 3abb222064
commit 07ea511141
2 changed files with 45 additions and 17 deletions

View File

@ -35,11 +35,9 @@ import org.apache.doris.nereids.util.ExpressionUtils;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@ -107,21 +105,7 @@ public class PullUpPredicates extends PlanVisitor<ImmutableSet<Expression>, Void
return cacheOrElse(aggregate, () -> {
ImmutableSet<Expression> childPredicates = aggregate.child().accept(this, context);
// TODO
List<NamedExpression> outputExpressions = aggregate.getOutputExpressions();
Map<Expression, Slot> expressionSlotMap
= Maps.newLinkedHashMapWithExpectedSize(outputExpressions.size());
for (NamedExpression output : outputExpressions) {
if (hasAgg(output)) {
expressionSlotMap.putIfAbsent(
output instanceof Alias ? output.child(0) : output, output.toSlot()
);
}
}
Expression expression = ExpressionUtils.replace(
ExpressionUtils.and(Lists.newArrayList(childPredicates)),
expressionSlotMap
);
Expression expression = ExpressionUtils.and(Lists.newArrayList(childPredicates));
Set<Expression> predicates = Sets.newLinkedHashSet(ExpressionUtils.extractConjunction(expression));
return getAvailableExpressions(predicates, aggregate);
});

View File

@ -73,6 +73,12 @@ class InferPredicatesTest extends TestWithFeService implements MemoPatternMatchS
+ "distributed by hash(k2) buckets 1\n"
+ "properties('replication_num' = '1');");
createTables("CREATE TABLE `test`.`test_tt` (\n"
+ "`key` varchar(*) NOT NULL,\n"
+ " `value` varchar(*) NULL\n"
+ ") ENGINE=OLAP\n"
+ "DISTRIBUTED BY HASH(`key`) BUCKETS 1\n"
+ "PROPERTIES ('replication_allocation' = 'tag.location.default: 1');");
connectContext.setDatabase("test");
connectContext.getSessionVariable().setDisableNereidsRules("PRUNE_EMPTY_PARTITION");
}
@ -645,4 +651,42 @@ class InferPredicatesTest extends TestWithFeService implements MemoPatternMatchS
))
);
}
@Test
void testAggMultiAliasWithSameChild() {
String sql = "SELECT t.*\n"
+ "FROM (\n"
+ " SELECT `key`, a , b \n"
+ " FROM (\n"
+ " SELECT `key`,\n"
+ " any_value(value) AS a,\n"
+ " any_value(CAST(value AS double)) AS b\n"
+ " FROM (\n"
+ " SELECT `key`, CAST(value AS double) AS value\n"
+ " FROM test_tt\n"
+ " WHERE `key` = '1'\n"
+ " ) agg\n"
+ " GROUP BY `key`\n"
+ " ) proj\n"
+ ") t\n"
+ "LEFT JOIN\n"
+ "( SELECT id, name FROM student) t2\n"
+ "ON t.`key`=t2.`name`";
PlanChecker.from(connectContext).analyze(sql).rewrite().printlnTree();
PlanChecker.from(connectContext)
.analyze(sql)
.rewrite()
.matches(
logicalJoin(
any(),
logicalProject(
logicalFilter(
logicalOlapScan()
).when(filter -> filter.getConjuncts().size() == 1
&& filter.getPredicate().toSql().contains("name = '1'"))
)
).when(join -> join.getJoinType() == JoinType.LEFT_OUTER_JOIN)
);
}
}