[opt](Nereids) derive physical properties of Project and Filter (#29171)

This commit is contained in:
morrySnow
2023-12-29 07:08:12 +08:00
committed by GitHub
parent 7d44c5a1f1
commit c3679a2750
40 changed files with 722 additions and 688 deletions

View File

@ -22,6 +22,7 @@ import org.apache.doris.nereids.PlanContext;
import org.apache.doris.nereids.jobs.JobContext;
import org.apache.doris.nereids.memo.GroupExpression;
import org.apache.doris.nereids.properties.DistributionSpecHash.ShuffleType;
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.SlotReference;
@ -33,11 +34,13 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalAssertNumRows;
import org.apache.doris.nereids.trees.plans.physical.PhysicalCTEAnchor;
import org.apache.doris.nereids.trees.plans.physical.PhysicalDeferMaterializeResultSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFileSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter;
import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin;
import org.apache.doris.nereids.trees.plans.physical.PhysicalLimit;
import org.apache.doris.nereids.trees.plans.physical.PhysicalNestedLoopJoin;
import org.apache.doris.nereids.trees.plans.physical.PhysicalOlapTableSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalPartitionTopN;
import org.apache.doris.nereids.trees.plans.physical.PhysicalProject;
import org.apache.doris.nereids.trees.plans.physical.PhysicalResultSink;
import org.apache.doris.nereids.trees.plans.physical.PhysicalSetOperation;
import org.apache.doris.nereids.trees.plans.physical.PhysicalUnion;
@ -47,9 +50,12 @@ import org.apache.doris.qe.ConnectContext;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -275,6 +281,50 @@ public class RequestPropertyDeriver extends PlanVisitor<Void, PlanContext> {
return null;
}
@Override
public Void visitPhysicalProject(PhysicalProject<? extends Plan> project, PlanContext context) {
DistributionSpec parentDist = requestPropertyFromParent.getDistributionSpec();
if (!(parentDist instanceof DistributionSpecHash)) {
return super.visitPhysicalProject(project, context);
}
DistributionSpecHash hashDist = (DistributionSpecHash) parentDist;
Map<ExprId, NamedExpression> exprIdToProjection = project.getProjects().stream()
.collect(Collectors.toMap(NamedExpression::getExprId, n -> n, (n1, n2) -> n1));
Map<ExprId, ExprId> exprIdMap = Maps.newHashMap();
for (ExprId exprId : hashDist.getExprIdToEquivalenceSet().keySet()) {
if (!exprIdToProjection.containsKey(exprId)) {
return super.visitPhysicalProject(project, context);
}
NamedExpression projection = exprIdToProjection.get(exprId);
if (projection instanceof Alias) {
if (((Alias) projection).child() instanceof SlotReference) {
exprIdMap.put(exprId, ((SlotReference) ((Alias) projection).child()).getExprId());
} else {
return super.visitPhysicalProject(project, context);
}
} else if (projection instanceof SlotReference) {
exprIdMap.put(exprId, exprId);
} else {
return super.visitPhysicalProject(project, context);
}
}
addRequestPropertyToChildren(PhysicalProperties.ANY);
addRequestPropertyToChildren(new PhysicalProperties(
hashDist.project(exprIdMap, ImmutableSet.of(), DistributionSpecAny.INSTANCE)));
return null;
}
@Override
public Void visitPhysicalFilter(PhysicalFilter<? extends Plan> filter, PlanContext context) {
DistributionSpec parentDist = requestPropertyFromParent.getDistributionSpec();
if (!(parentDist instanceof DistributionSpecHash)) {
return super.visitPhysicalFilter(filter, context);
}
addRequestPropertyToChildren(PhysicalProperties.ANY);
addRequestPropertyToChildren(new PhysicalProperties(parentDist));
return null;
}
@Override
public Void visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink, PlanContext context) {
addRequestPropertyToChildren(PhysicalProperties.GATHER);