2021SC@SDUSC
今天接着上文细说walk()方法子类遍历能力的体现
目录
DepthFirstWalk
DepthFirstWalker是深度优先遍历(由上而下的深度优先)
public PlanWalker spawnChildWalker(OperatorPlan plan) {
return new DepthFirstWalker(plan);
}
walk()方法通过plan.getSources()得到所有的root节点,然后遍历他们,遍历的时候获取他们的所有后辈,递归遍历。
递归过程
private void depthFirst(Operator node,
Collection<Operator> successors,
Set<Operator> seen,
PlanVisitor visitor) throws FrontendException {
if (successors == null) return;
for (Operator suc : successors) {
if (seen.add(suc)) {
suc.accept(visitor);
Collection<Operator> newSuccessors = Utils.mergeCollection(plan.getSuccessors(suc), plan.getSoftLinkSuccessors(suc));
depthFirst(suc, newSuccessors, seen, visitor);
}
}
}