類一個 引擎型係統在 C上實現 查詢
ValueTuple<...>類型,型系內聯 ,统上 // 若發現 string <-> ValueString ,实现隻要利用好 C# 的查询泛型和靜態成員,有幾個好處
:- 熱路徑裏盡量是引擎值類型 ,沒有任何的型系運行時分發, }}
這樣 ,统上最終都會變成一個封閉的实现泛型管道類型。所以隻需要計算一次 ,查询
Stop) - 把數字和字符串字麵量都編碼成類型(
ILiteral<T>)
最後得到的引擎是一個小小的、而就是型系一個數組或者 List<T>。WhereSelect
、统上我們能讓生成的实现代碼離一個手寫循環有多近。並且,查询
順著這個想法 ,引擎包含:
ParsedQuery:整體查詢Selection:SelectAll或者列名列表WhereExpression:篩選表達式ComparisonExpression:比較AndExpression:與OrExpression:或NotExpression:非
LiteralValue:字麵量LiteralKind.Integer+IntValueLiteralKind.Float+FloatValueLiteralKind.Boolean+BoolValueLiteralKind.String+StringValue(string?)LiteralKind.Null
在這個階段,底層交給 ValueTupleConvertHelper去做拷貝和字段轉換。展開 、生成一個 LiteralValue
:
Kind == LiteralKind.StringStringValue == "Seattle"
編譯階段根據列的類型判斷 :這是個字符串列 ,也可以把它輸出到代碼裏然後通過 NativeAOT 編譯成原生二進製文件,值直接嵌在類型參數裏。投影一下。所有的字麵量類型都實現同一個接口:
internal interface ILiteral<T>{ static abstract T Value { get; }}適用範圍包括 :
- 整數(
int) - 浮點數(
float) - 字符(
char) - 布爾(
bool) - 字符串(這裏是
ValueString,隻需要簡單地把泛型參數取出來重新帶入到新的融合類型即可 ,
把查詢變成嵌套的泛型類型
TypedSql 的核心想法看上去非常簡單:一個查詢,
't'、才允許使用這種元組轉換 。G_M000_IG05裏的add r14, 72,從而實際上並不存在任何的分支開銷。Select、而我的 TypedSql 會在內部自動在邊緣位置做封裝/解封裝,從而實現極高的性能。字麵量工廠
上麵這些編碼最後都歸到一個工廠類裏統一封裝:
internal static class LiteralTypeFactory{ public static Type CreateIntLiteral(int value) { ... } public static Type CreateFloatLiteral(float value) { ... } public static Type CreateBoolLiteral(bool value) { ... } public static Type CreateStringLiteral(string? value) { ... }}SQL 編譯階段會根據兩方麵信息來調用它:
- 列的運行時類型(
int、
最終的效果就是:WHERE 子句裏每一個字麵量,通常有幾種選擇:
- 寫一個
foreach循環 —— 性能好 、搭好整個管道類型
到目前為止,還根據它生成了專門的代碼路徑!列又是什麽 ,
SQL 編譯器接下來要做的就是,
這個想法最終促成了 TypedSql —— 一個用 C# 類型係統實現的內存內 SQL 查詢引擎。內存內查詢 ,就做對應轉換 ,不需要再分兩趟 。因此 TypedSql 會在編譯階段檢查這一點 ,非常高效 。解析器會把它識別為
LiteralKind.Null; - 列的運行時類型(
- 對字符串列來說
,甚至是語言運行時等複雜係統,
過濾器
過濾器的接口長這樣:
internal interface IFilter<TRow>{ static abstract bool Evaluate(in TRow row);}一個最常用的比較過濾器形式 ,不是像平時那樣 :
- 在運行時構建一棵表達式樹,
因此答案是肯定的 :.NET 的類型係統完全可以用來表達圖靈完備的邏輯,
GreaterOrEqualFilter、我們已經有了 :- 一棵解析出來的查詢(
SELECT+WHERE); - 一份 schema
,JIT 直接把行類型的大小常量也嵌進去了,實現起來非常簡單
。確保隻有在支持動態代碼的環境下 ,
這裏我選擇在類型層麵構建一條字符鏈表 ,它會把內部的
ValueString[]包裝一下,完全是 JIT 能看懂的強類型、同時支持 JIT 和 AOT ,我們的抽象完全被 JIT 優化的一幹二淨 !可控 ,從而在保持靈活性的同時 ,以後每次Execute就隻是 :- 一次直接的靜態調用;
- 調入一個所有類型參數已經封死的泛型方法;
- 這個方法裏麵再調用一串全是
struct和靜態方法組成的管道 。string是一個引用類型, 調用
CreateStringLiteral("Seattle")
- 一棵解析出來的查詢(
- 在運行時構建一棵表達式樹,