Catalyst揭秘 Day4

analyzer解析

今天继续解析catalyst,主要讲一下analyzer,在sql语句的处理流程中,analyzer是在sqlparse的基础上,把unresolved logical plan生成logcal plan。

Analyzer定义

在analyzer构造的时候,会传入catalog和functionRegistry,其中catelog用来存放用户指定的表名等信息,functionRegistry存放自定义函数,主要用来将未解析的属性和关系进行转换。

Catalyst揭秘 Day4 analyzer解析-LMLPHP

在构造方法中,除了catalog和functionRegistry,还有一个迭代次数,因为在分析时需要不断进行遍历。
Catalyst揭秘 Day4 analyzer解析-LMLPHP

通过迭代次数这个参数,我们可以定义一些策略,包括Once和FixedPoint,FixedPoint会根据参数控制迭代次数的上限。

Catalyst揭秘 Day4 analyzer解析-LMLPHP

batchs是整个analyzer的核心,里面会定义一系列的rules,这些rules会采取的特定的策略。通过这些规则,会把unresovled变成resovled。
Catalyst揭秘 Day4 analyzer解析-LMLPHP

Analyzer指定

RuleExecutor中的execute是执行的入口。
在执行时,我们发现,各个规则之间是串行运行的,首先是对batchs进行循环,再对每个batch中rule进行处理。

Catalyst揭秘 Day4 analyzer解析-LMLPHP

标红的这句代码是整个过程的关键,是实际的执行过程,对调用各个Rule中的apply方法。
以一个具体的Rule来看的话,这里会使用到模式匹配,调用resolveOperators方法对plan中的内容进行解析。

Catalyst揭秘 Day4 analyzer解析-LMLPHP

resolveOperators会循环遍历各个节点,应用解析规则。
Catalyst揭秘 Day4 analyzer解析-LMLPHP

相比于SqlParser,analyzer整个流程更简洁一些,主要就是用rules,采用模式匹配进行处理,在这里还是想再感叹下Scala强大的语法能力。

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

04-15 11:33