2021SC@SDUSC
今天接着上文细说walk()方法子类遍历能力的体现
目录
ReverseDependencyOrderWalkerWOSeenChk
ReverseDependencyOrderWalkerWOSeenChk
ReverseDependencyOrderWalkerWOSeenChk是逆向的依赖顺序遍历,同前文提到的ReserveDependencyOrderWalker一样。
public PlanWalker spawnChildWalker(OperatorPlan plan) {
return new ReverseDependencyOrderWalker(plan);
}
其中,子Walker是ReserveDependencyOrderWalker
walk()方法和ReserveDependencyOrderWalker的区别在于,每次遍历的时候不记录一个seen的Set<Operator>集
递归:
protected void doAllSuccessors(Operator node,
Set<Operator> seen,
Collection<Operator> fifo) throws FrontendException {
if (!seen.contains(node)) {
// We haven't seen this one before.
Collection<Operator> succs = Utils.mergeCollection(plan.getSuccessors(node), plan.getSoftLinkSuccessors(node));
if (succs != null && succs.size() > 0) {
// Do all our successors before ourself
for (Operator op : succs) {
doAllSuccessors(op, seen, fifo);
}
}
// Now do ourself
seen.add(node);
fifo.add(node);
}
}