slick源碼閱讀筆記一 slick.ast

如今開始養成讀源碼寫筆記的習慣。
轉載請註明出處: http://www.javashuo.com/article/p-xdpqwfmt-bt.htmlhtml

目錄

slick源碼閱讀筆記 目錄&總覽

slick源碼閱讀筆記一 slick.ast

slick源碼閱讀筆記二 slick.lifted.Rep

slick源碼閱讀筆記三 ShapedValue 在Table和Query上的應用

slick源碼閱讀筆記四 隱式轉換--column與Query查詢功能實現

slick源碼閱讀筆記五 Query查詢條件生成與OptionMapper

1. sql抽象語法樹

slick.ast 定義了整個抽象語法樹, 抽象語法樹能夠和sql互相轉換。 slick也是經過抽象語法樹和scala的macro來生成最終用來執行的sql。幾乎全部的orm框架都有相似的實現, spark的LogicalPlan也是相似的結構。
node

1.1 Node分類

Node主要分爲 NullaryNode, BinaryNode, UnaryNode 和 PathElement。sql

1.1.1 NullNode

NullaryNode是沒有子節點的Node,主要用來表示數據源。(相似spark的LeafNode)數據庫

好比 :數據庫表Table, 字面量 LiteralNode

對應sql: select 1;    select * from  t1;  中的 」1「 和 "t1"表

1.1.2. BinaryNode

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。

1.1.3 UnaryNode

UnaryNode是隻有一個子節點的Node, 主要用來表示sql function, select之類的概念。( 相似spark的UnaryNode)app

1.1.4 PathElement

PathElemnt是用來溯源的,會摻雜到不一樣的Node中,通常不會獨立存在。 (spark沒有相似父類,不過在對邏輯計劃進行優化的時候會作相似的判斷,而且具體Node的實現會帶有相似的功能, 好比MultiInstanceRelation)框架

例如:sum(a) 須要溯源這個a字段是從哪來的。 
例如:select 既是 pathElement 又是

1.2 Node 類型

大部分Node是沒有類型,少數有類型的節點是爲了和數據庫字段類型之間作類型映射而存在的。
所以直接用ast包來進行編程很複雜,並且沒有類型檢查很容易出錯。
因此爲了能夠使用相似scala.collection的語法以及編譯時/運行時的類型檢查,slick使用slick.lifted包來實現。優化

相關文章
相關標籤/搜索