1. 程式人生 > >slick源碼閱讀筆記二 slick.list.Rep

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

互轉 repo 源碼閱讀 ase 以及 去掉 node 基礎上 樹節點

轉載請註明出處
https://www.cnblogs.com/elyw/p/10282476.html

2. slick.lifted.Rep

Rep是在使用slick最常碰到的類,也是slick的靈魂所在。 利用Rep實現了類似scala.collection的api以及編譯時/運行時的類型檢查。
使用slick的過程中,最常用的Table, TableQuery, Column都是Rep的子類。

2.1 Rep的繼承結構

技術分享圖片

2.2 Rep的核心方法和功能

Rep的功能是成為scala語言和slick.ast包下節點的橋梁, 使得可以使用scala的類型系統和方法來生成slick抽象語法樹。

2.2.1 Rep頂層父類

頂層父類有兩個方法, encodeRef(path:Node):Rep[T] 和 toNode:Node。

  1. encodeRef方法
    encodeRef方法從直覺上看,就是將抽象語法樹的Node轉化為Rep[T]。
    encodeRef方法的作用是將Node附帶上類型,路徑等上下文信息, 通過這些上下文信息,使得Node可以使用scala類型進行約束,映射,或者可以標記節點的父節點繼承父節點的上下文等等。

  2. toNode方法
    toNode方法就是將Rep的類型上下文信息去掉 , 將Rep還原回Node。

2.2.2 TypedRep 和 UntypedRep

  1. 區別
    TypedRep 和 UntypedRep 唯一的區別是TypedRep在encodeRef的時候會通過隱式參數保存Type信息,使得Rep在運行時也可以拿到Rep附帶的類型信息。而UntypedRep的類型信息只能作為編譯時的泛型約束。

  2. TypedRep 附帶的類型信息
    這裏的Type是slick.ast抽象的Type,在scala的classTag的基礎上增加描述,對Tuple,Option等做了進一步的支持,可以和數據庫的數據類型進行映射,以後會詳細說明這一部分。

  3. 作用
    TypedRep 主要是作為表字段column的Rep, 附帶了可以和數據庫進行映射的類型信息。
    UnTypedRep 目前沒什麽用。

2.2.3 MappedProjection

  1. 功能
    MappedProjection的作用是將查詢回來的數據映射為scala對象。

  2. 主要成員
    child:Node 相關聯的抽象語法樹節點
    Mapper:slick.ast.Type 和 scala類型之間相互轉化
    classTag: scala類型信息

2.3.4 ShapedValue, AbstractTable, QueryBase

這裏簡單介紹一下相關的功能, 後面會詳細分析這3個類。

  1. ShapedValue是將基礎類型組合起來以後的包含路徑信息的Rep

  2. AbstractTable用來表示數據庫表, 包含所有的表字段Rep

  3. QueryBase是查詢的Rep,可以進行map, filter等操作將Query映射為另一個Query。其中shaped字段是·將AbstractTable轉為ShapedValue後的對象·

2.3.5 RepOption

scala的Option類對應的Rep

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