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實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM