[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:
@ -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);
|
||||
});
|
||||
|
||||
@ -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)
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user