[fix](Nereids): fix StatsCalculator compute project and correct commute join type. (#12539)

This commit is contained in:
jakevin
2022-09-14 10:32:05 +08:00
committed by GitHub
parent ead016e0d2
commit fd0cf78aa7
5 changed files with 23 additions and 12 deletions

View File

@ -34,6 +34,7 @@ import org.apache.doris.nereids.rules.implementation.LogicalSortToPhysicalQuickS
import org.apache.doris.nereids.rules.implementation.LogicalTopNToPhysicalTopN;
import org.apache.doris.nereids.rules.rewrite.AggregateDisassemble;
import org.apache.doris.nereids.rules.rewrite.logical.MergeConsecutiveProjects;
import org.apache.doris.nereids.rules.rewrite.logical.PushdownFilterThroughProject;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
@ -48,6 +49,7 @@ public class RuleSet {
.add(JoinCommute.OUTER_LEFT_DEEP)
.add(JoinLAsscom.INNER)
.add(JoinLAsscomProject.INNER)
.add(new PushdownFilterThroughProject())
.add(new MergeConsecutiveProjects())
.build();

View File

@ -99,7 +99,6 @@ public enum RuleType {
// Eliminate plan
ELIMINATE_LIMIT(RuleTypeClass.REWRITE),
ELIMINATE_FILTER(RuleTypeClass.REWRITE),
FIND_HASH_CONDITION_FOR_JOIN(RuleTypeClass.REWRITE),
ROLLUP_AGG_SCAN(RuleTypeClass.REWRITE),
ROLLUP_AGG_FILTER_SCAN(RuleTypeClass.REWRITE),
@ -107,8 +106,9 @@ public enum RuleType {
ROLLUP_AGG_PROJECT_FILTER_SCAN(RuleTypeClass.REWRITE),
ROLLUP_AGG_FILTER_PROJECT_SCAN(RuleTypeClass.REWRITE),
OLAP_SCAN_PARTITION_PRUNE(RuleTypeClass.REWRITE),
// Swap plan
SWAP_FILTER_AND_PROJECT(RuleTypeClass.REWRITE),
// Pushdown filter
PUSHDOWN_FILTER_THROUGH_PROJET(RuleTypeClass.REWRITE),
LOGICAL_LIMIT_TO_LOGICAL_EMPTY_RELATION_RULE(RuleTypeClass.REWRITE),
SWAP_LIMIT_PROJECT(RuleTypeClass.REWRITE),
REWRITE_SENTINEL(RuleTypeClass.REWRITE),
@ -152,8 +152,8 @@ public enum RuleType {
return ruleTypeClass;
}
public <INPUT_TYPE extends Plan, OUTPUT_TYPE extends Plan> Rule build(
PatternMatcher<INPUT_TYPE, OUTPUT_TYPE> patternMatcher) {
public <INPUT_TYPE extends Plan, OUTPUT_TYPE extends Plan>
Rule build(PatternMatcher<INPUT_TYPE, OUTPUT_TYPE> patternMatcher) {
return patternMatcher.toRule(this);
}

View File

@ -50,11 +50,11 @@ public class JoinCommute extends OneExplorationRuleFactory {
@Override
public Rule build() {
return innerLogicalJoin()
return logicalJoin()
.when(this::check)
.then(join -> {
LogicalJoin<GroupPlan, GroupPlan> newJoin = new LogicalJoin<>(
join.getJoinType(),
join.getJoinType().swap(),
join.getHashJoinConjuncts(),
join.getOtherJoinCondition(),
join.right(), join.left(),

View File

@ -44,6 +44,6 @@ public class PushdownFilterThroughProject extends OneRewriteRuleFactory {
project.child()
)
);
}).toRule(RuleType.SWAP_FILTER_AND_PROJECT);
}).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_PROJET);
}
}

View File

@ -70,7 +70,7 @@ import org.apache.doris.statistics.TableStats;
import com.google.common.collect.Maps;
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -341,14 +341,23 @@ public class StatsCalculator extends DefaultPlanVisitor<StatsDeriveResult, Void>
StatsDeriveResult statsDeriveResult = groupExpression.getCopyOfChildStats(0);
Map<Slot, ColumnStats> childColumnStats = statsDeriveResult.getSlotToColumnStats();
Map<Slot, ColumnStats> columnsStats = projections.stream().map(projection -> {
ColumnStats value = null;
Set<Slot> slots = projection.getInputSlots();
if (slots.isEmpty()) {
return new AbstractMap.SimpleEntry<>(projection.toSlot(), ColumnStats.createDefaultColumnStats());
value = ColumnStats.createDefaultColumnStats();
} else {
// TODO: just a trick here, need to do real project on column stats
return new AbstractMap.SimpleEntry<>(projection.toSlot(),
childColumnStats.get(slots.iterator().next()));
for (Slot slot : slots) {
if (childColumnStats.containsKey(slot)) {
value = childColumnStats.get(slot);
break;
}
}
if (value == null) {
value = ColumnStats.createDefaultColumnStats();
}
}
return new SimpleEntry<>(projection.toSlot(), value);
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (item1, item2) -> item1));
statsDeriveResult.setSlotToColumnStats(columnsStats);
return statsDeriveResult;