zoukankan      html  css  js  c++  java
  • slick源码阅读笔记一 slick.ast

    现在开始养成读源码写笔记的习惯。
    转载请注明出处: https://www.cnblogs.com/elyw/p/10282424.html

    目录

    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也是类似的结构。

    1.1 Node分类

    Node主要分为 NullaryNode, BinaryNode, UnaryNode 和 PathElement。

    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)

    1.1.4 PathElement

    PathElemnt是用来溯源的,会掺杂到不同的Node中,一般不会独立存在。 (spark没有类似父类,不过在对逻辑计划进行优化的时候会做类似的判断,并且具体Node的实现会带有类似的功能, 比如MultiInstanceRelation)

    例如:sum(a) 需要溯源这个a字段是从哪来的。 
    例如:select 既是 pathElement 又是 
    

    1.2 Node 类型

    大部分Node是没有类型,少数有类型的节点是为了和数据库字段类型之间做类型映射而存在的。
    因此直接用ast包来进行编程很复杂,而且没有类型检查很容易出错。
    所以为了可以使用类似scala.collection的语法以及编译时/运行时的类型检查,slick使用slick.lifted包来实现。

  • 相关阅读:
    课程总结1
    网站概要设计说明书
    数据库设计说明书
    团队项目之7天工作计划
    NABC
    敏捷开发综述
    二维数组最大子数组
    电梯调度
    输出整数数组中 最大的子数组的结果
    【自习任我行】第二阶段个人总结10
  • 原文地址:https://www.cnblogs.com/elyw/p/10282424.html
Copyright © 2011-2022 走看看