[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:
@ -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());
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user