如今开始养成读源码写笔记的习惯。
转载请注明出处: http://www.javashuo.com/article/p-xdpqwfmt-bt.htmlhtml
slick.ast 定义了整个抽象语法树, 抽象语法树能够和sql互相转换。 slick也是经过抽象语法树和scala的macro来生成最终用来执行的sql。几乎全部的orm框架都有相似的实现, spark的LogicalPlan也是相似的结构。
node
Node主要分为 NullaryNode, BinaryNode, UnaryNode 和 PathElement。sql
NullaryNode是没有子节点的Node,主要用来表示数据源。(相似spark的LeafNode)数据库
好比 :数据库表Table, 字面量 LiteralNode 对应sql: select 1; select * from t1; 中的 ”1“ 和 "t1"表
BinaryNode是有两个字节点的Node, 主要用来表示 group by, join 等概念。 (相似spark的BinaryNode)编程
好比: group by 会有key和对应的数据来源, join 有左右两个 Query节点。 对应sql: select a, sum(b) from t1 group by a ; 的 a 和 t1。 对应sql: select * from t1 join t2 on t1.a = t2.a ; 的 t1 和 t2。
UnaryNode是只有一个子节点的Node, 主要用来表示sql function, select之类的概念。( 相似spark的UnaryNode)app
PathElemnt是用来溯源的,会掺杂到不一样的Node中,通常不会独立存在。 (spark没有相似父类,不过在对逻辑计划进行优化的时候会作相似的判断,而且具体Node的实现会带有相似的功能, 好比MultiInstanceRelation)框架
例如:sum(a) 须要溯源这个a字段是从哪来的。 例如:select 既是 pathElement 又是
大部分Node是没有类型,少数有类型的节点是为了和数据库字段类型之间作类型映射而存在的。
所以直接用ast包来进行编程很复杂,并且没有类型检查很容易出错。
因此为了能够使用相似scala.collection的语法以及编译时/运行时的类型检查,slick使用slick.lifted包来实现。优化