Skip to content

Commit

Permalink
[opt](optimizer) Remove unused code to unify code
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
liutang123 committed Aug 13, 2024
1 parent ef2f469 commit e5ef77e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,9 @@
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;
Expand Down Expand Up @@ -107,21 +105,7 @@ public ImmutableSet<Expression> visitLogicalAggregate(LogicalAggregate<? extends
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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ protected void runBeforeAll() throws Exception {
+ "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");
}
Expand Down Expand Up @@ -645,4 +651,42 @@ void inferPredicateByConstValue() {
))
);
}

@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)
);

}
}

0 comments on commit e5ef77e

Please sign in to comment.