2021SC@SDUSC
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- PlanOptimizer
- 实现类
一、PlanOptimizer
PlanOptimizer是抽象类,主要和Rule、PlanTransformListener、OperatorPlan打交道。
public abstract class PlanOptimizer {
protected List<Set<Rule>> ruleSets;
protected OperatorPlan plan;
protected List<PlanTransformListener> listeners;
protected int maxIter;
它接受一个OperatorPlan,即Operators的DAG模型,在optimize()方法里,遍历ruleSet,得到几批Rules,即Set<Rule>。对于每批Rules,调用每个rule.match(plan)来处理传入的OperatorPlan,返回一个匹配成功的List<OperatorPlan> matches,对这些match的plans进行进一步处理。首先获得rule的transformer,然后进行transformer的check()和transform()操作。如果需要Listener操作的,还会遍历listeners,让每个PlanTransformListener监听到transformer进行的transform操作,transformer的reportChanges()方法可以返回他transform操作修改的部分。
二、实现类:
public void optimize() throws FrontendException {
for (Set<Rule> rs : ruleSets) {
boolean sawMatch = false;
int numIterations = 0;
do {
sawMatch = false;
for (Rule rule : rs) {
List<OperatorPlan> matches = rule.match(plan);
if (matches != null) {
Transformer transformer = rule.getNewTransformer();
for (OperatorPlan m : matches) {
try {
if (transformer.check(m)) {
sawMatch = true;
transformer.transform(m);
if (!rule.isSkipListener()) {
for(PlanTransformListener l: listeners) {
l.transformed(plan, transformer.reportChanges());
}
}
}
} catch (Exception e) {
StringBuffer message = new StringBuffer("Error processing rule " + rule.name);
if (!rule.isMandatory()) {
message.append(". Try -t " + rule.name);
}
throw new FrontendException(message.toString(), 2000, e);
}
}
}
}
} while(sawMatch && ++numIterations < maxIter);
}
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。