[opt](Nereids) derive physical properties of Project and Filter (#29171)
This commit is contained in:
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user