Spark-源码学习-SparkSQL-架构设计-SQL 引擎-Parser 模块-AstBuilder-QueryContext
一、概述
QueryContext 可以视为 query 语句的根结点~
二、源码
1 | override def visitQuery(ctx: QueryContext): LogicalPlan = withOrigin(ctx) { |
2.1. Query
1 | val query = plan(ctx.queryTerm).optionalMap(ctx.queryOrganization)(withQueryResultClauses) |
2.1.1. ctx.queryTerm
在 QueryContext 的子节点中查找第一个是 QueryTermContext 类型的节点。AstBuilder 的 $plan$ 方法继续调用 QueryTermContext 的 $accept$ 方法,这个方法调用的还是 $AstBuilder.visitChildren$ 方法,
1 | public QueryTermContext queryTerm() { |
引用本站文章
Spark-源码学习-SparkSQL-架构设计-编译器体系-AstBuilder-RegularQuerySpecificationContext
Joker
2.1.2. ctx.queryOrganization
一般来讲,QueryOrganizationContext 为根节点所代表的子树中包含了各种对数据组织的操作,例如 Sort、Limit 和 Window 算子等
在 QueryContext 的子节点中查找第一个是 QueryOrganizationContext 类型的节点。
1 | public QueryOrganizationContext queryOrganization() { |
2.1.3. withQueryResultClauses()
添加 QueryOrganizationContext 子句到逻辑计划中。
2.2. Apply CTEs
1 | query.optionalMap(ctx.ctes)(withCTE) |
2.2.1. ctx.ctes
在 QueryContext 的子节点中查找第一个是 CtesContext 类型的节点。
2.2.2. withCTE
添加 CtesContext 子句到逻辑计划中。
1 | private def withCTE(ctx: CtesContext, plan: LogicalPlan): LogicalPlan = { |
三、总结
AstBuilder.visitQuery 方法就是结合 QueryContext 的 3 个子节点 QueryTermContext,QueryOrganizationContext,CtesContext 的信息进行包括 ORDER BY/SORT BY/CLUSTER BY/DISTRIBUTE BY/LIMIT/WINDOWS 子句 和 CTE 的处理,其中 QueryTermContext 是信息的主要承载方,默认是其子类 QueryTermDefaultContext 来实例化。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker!
评论
ValineTwikoo