本文转载自http://zqhxuyuan.github.io/
如需转帖,请征得原作者同意
StreamCQL的算子组成了Application
前戏: buildApplication
上篇在解析Schema的时候分析了CQL中一些常用的Statement syntax和对应的语法/语义解析器结果,
现在继续ApplicationBuilder.buildApplication中parseSchemas的下一步splitOperators.
1 2 3 4 5 6 7 8 9 10 | private void buildApplication() { app = new Application(applicationName); parseSchemas(); List<SplitContext> splitContexts = splitOperators(); //拆分算子 ⬅️ SplitContext splitContext = combineOperators(splitContexts); //组合算子, 将拆分算子列表转换为只有一个SplitContext ⬅️ changeUnionOperators(splitContext); changeSchemaAfterAggregate(splitContext); app.setOperators(splitContext.getOperators()); //拆分结果包含了operatots和transitions app.setOpTransition(splitContext.getTransitions()); } |
combineOperators会创建OperatorCombiner, 并调用combine方法将splitContexts合并起来,终于打印了日志中看到的:combine all split contexts
(解析submit之后).
构建Application的主要工作就是Split和Combine,最后将SplitContext的operators和transitions设置到Application对象中,完成应用程序的构建,在这基础上再进行物理优化.
为什么要先拆分, 后面又要再组合?