[fix](nereids) mark two phase partition topn global to notice be passthrough logic (#24886)

mark partition topn phase to notice be to handle passthrough logic well, this pr is fe part code.
be side logic: the the phase equals to PTopNPhase.TWO_PAHSE_GLOBAL, it should skip the bypass logic and do the second phase ptopn operation anyway.
This commit is contained in:
xzj7019
2023-09-27 14:08:59 +08:00
committed by GitHub
parent 1b0e3246ea
commit a1ab8f96a1
3 changed files with 29 additions and 2 deletions

View File

@ -2005,7 +2005,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
SortInfo sortInfo = new SortInfo(orderingExprs, ascOrders, nullsFirstParams, sortTuple);
PartitionSortNode partitionSortNode = new PartitionSortNode(context.nextPlanNodeId(), childNode,
partitionTopN.getFunction(), partitionExprs, sortInfo, partitionTopN.hasGlobalLimit(),
partitionTopN.getPartitionLimit());
partitionTopN.getPartitionLimit(), partitionTopN.getPhase());
if (partitionTopN.getStats() != null) {
partitionSortNode.setCardinality((long) partitionTopN.getStats().getRowCount());
}

View File

@ -19,9 +19,11 @@ package org.apache.doris.planner;
import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.SortInfo;
import org.apache.doris.nereids.trees.plans.PartitionTopnPhase;
import org.apache.doris.nereids.trees.plans.WindowFuncType;
import org.apache.doris.statistics.StatisticalType;
import org.apache.doris.thrift.TExplainLevel;
import org.apache.doris.thrift.TPartTopNPhase;
import org.apache.doris.thrift.TPartitionSortNode;
import org.apache.doris.thrift.TPlanNode;
import org.apache.doris.thrift.TPlanNodeType;
@ -45,12 +47,13 @@ public class PartitionSortNode extends PlanNode {
private final SortInfo info;
private final boolean hasGlobalLimit;
private final long partitionLimit;
private final PartitionTopnPhase phase;
/**
* Constructor.
*/
public PartitionSortNode(PlanNodeId id, PlanNode input, WindowFuncType function, List<Expr> partitionExprs,
SortInfo info, boolean hasGlobalLimit, long partitionLimit) {
SortInfo info, boolean hasGlobalLimit, long partitionLimit, PartitionTopnPhase phase) {
super(id, "PartitionTopN", StatisticalType.PARTITION_TOPN_NODE);
Preconditions.checkArgument(info.getOrderingExprs().size() == info.getIsAscOrder().size());
this.function = function;
@ -58,6 +61,7 @@ public class PartitionSortNode extends PlanNode {
this.info = info;
this.hasGlobalLimit = hasGlobalLimit;
this.partitionLimit = partitionLimit;
this.phase = phase;
this.tupleIds.addAll(Lists.newArrayList(info.getSortTupleDescriptor().getId()));
this.tblRefIds.addAll(Lists.newArrayList(info.getSortTupleDescriptor().getId()));
this.nullableTupleIds.addAll(input.getNullableTupleIds());
@ -120,6 +124,9 @@ public class PartitionSortNode extends PlanNode {
output.append(prefix).append("has global limit: ").append(hasGlobalLimit).append("\n");
output.append(prefix).append("partition limit: ").append(partitionLimit).append("\n");
// mark partition topn phase
output.append(prefix).append("partition topn phase: ").append(phase).append("\n");
return output.toString();
}
@ -139,12 +146,24 @@ public class PartitionSortNode extends PlanNode {
topNAlgorithm = TopNAlgorithm.DENSE_RANK;
}
TPartTopNPhase pTopNPhase;
if (phase == PartitionTopnPhase.ONE_PHASE_GLOBAL_PTOPN) {
pTopNPhase = TPartTopNPhase.ONE_PAHSE_GLOBAL;
} else if (phase == PartitionTopnPhase.TWO_PHASE_LOCAL_PTOPN) {
pTopNPhase = TPartTopNPhase.TWO_PAHSE_LOCAL;
} else if (phase == PartitionTopnPhase.TWO_PHASE_GLOBAL_PTOPN) {
pTopNPhase = TPartTopNPhase.TWO_PAHSE_GLOBAL;
} else {
pTopNPhase = TPartTopNPhase.UNKNOWN;
}
TPartitionSortNode partitionSortNode = new TPartitionSortNode();
partitionSortNode.setTopNAlgorithm(topNAlgorithm);
partitionSortNode.setPartitionExprs(Expr.treesToThrift(partitionExprs));
partitionSortNode.setSortInfo(sortInfo);
partitionSortNode.setHasGlobalLimit(hasGlobalLimit);
partitionSortNode.setPartitionInnerLimit(partitionLimit);
partitionSortNode.setPtopnPhase(pTopNPhase);
msg.partition_sort_node = partitionSortNode;
}
}