zoukankan      html  css  js  c++  java
  • Calcite分析 -- LinQ4j

    Calcite Version:1.26.0

    Linq是一种对Query的抽象,任意Query都可以抽象成ExpressionTree,那么只要bind不同的implementor,就可以转化成不同的查询语言,

    比如LINQ to Objects、LINQ to SQL、LINQ to Datasets、LINQ to Entities、LINQ to Data Source、LINQ to XML/XSD (https://zh.wikipedia.org/wiki/%E8%AF%AD%E8%A8%80%E9%9B%86%E6%88%90%E6%9F%A5%E8%AF%A2)

    ExpressionTree的主要构成是expression和statement,statement可以认为就是一种特殊的expression,用于组织expression

    Expression,Query中的任何一个identity,比如Constant,Function

    先看个简单的,ConstantExpression

    代码生成的接口是,accept,

    test,

    再看下BinaryExpression的实现,本身就不是一个原子表达式,由0,1两个表达式和ExpressionType组成,

    它的实现在evaluate中,之所以是evaluate接口,返回的直接是结果,不是生成的代码

     

    test,带括号的,

    org.apache.calcite.linq4j.test.ExpressionTest,可以找到各种Expression的例子

    我们可以用这种简单的函数调用的方式构建ExpressionTree

    Statement,可以看到都是一些和代码组织相关的,block,for,while,switch

    比如看下conditionalStatement,不难理解,代码生成就是string拼接

    test,

    LinQ,是类function programming的编程方式,通过连续的function调用,

    所以定义一系列的内置函数,这些函数可以在代码段中对特定的类型直接使用,

    可以看这个例子,调用是通过Expressions.call

    结果就是生成一个,MethodCallExpression

    可以看到在BuiltInMethod中,定义一堆method接口,

    包含,适用的类,method名,和参数类型

    这里列出类SQL的相关接口,可以看到他们的适用类型都是Enumerable,就是迭代器,是LINQ的核心类

    其中,

    EnumerableDefaults,直接有这些函数的default实现

    ExtendedEnumerable,包含了扩展接口,在DefaultEnumerable中也给出default实现

  • 相关阅读:
    SpringBoot Shiro 配置自定义密码加密器
    SpringBoot Druid 配置详解
    UOJ #164. 【清华集训2015】V | 线段树
    BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树
    51nod 1462 树据结构 | 树链剖分 矩阵乘法
    BZOJ 3503 [CQOI2014]和谐矩阵
    BZOJ 4004 [JLOI2015]装备购买 | 线性基
    BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
    LOJ #2145. 「SHOI2017」分手是祝愿
    LOJ #2141. 「SHOI2017」期末考试
  • 原文地址:https://www.cnblogs.com/fxjwind/p/15379068.html
Copyright © 2011-2022 走看看