在 C上實現型係統一個 引擎 查詢 類
var seniorTitles = QueryEngine.Compile<Person,型系 (string Name, string City, string Level)>( """ SELECT Name, City, Level FROM $ WHERE Level = 'Senior' AND City = 'Seattle' """);foreach (var (name, city, level) in seniorTitles.Execute(allPeople.AsSpan())){ Console.WriteLine($"{ name} in { city} [{ level}]");}所有重活——解析 SQL
、Float 、统上它實現 IQueryNode<TRow,实现 TRuntimeResult, TRoot>;
TRuntimeResult;TPublicResult
。全是查询靜態方法 。包含:ParsedQuery:整體查詢Selection:SelectAll或者列名列表WhereExpression:篩選表達式ComparisonExpression:比較AndExpression:與OrExpression:或NotExpression:非
LiteralValue:字麵量LiteralKind.Integer+IntValueLiteralKind.Float+FloatValueLiteralKind.Boolean+BoolValueLiteralKind.String+StringValue(string?引擎)LiteralKind.Null
在這個階段,float 、型系GreaterOrEqualFilter、统上
在 JIT 看來,实现這裏的查询 10就是字符串字麵量 'Seattle'的長度,
每一列會實現這樣一個接口 :
internal interface IColumn<TRow,引擎 TValue>{ static abstract string Identifier { get; } static abstract TValue Get(in TRow row);}舉個簡單的例子:
internal readonly struct PersonNameColumn : IColumn<Person, string>{ public static string Identifier => "Name"; public static string Get(in Person row) => row.Name;}而投影(SELECT後麵那部分)則實現:
internal interface IProjection<TRow, TResult>{ static abstract TResult Project(in TRow row);}將選出某一列本身做成一個投影,它會把內部的型系 ValueString[]包裝一下
,而不需要在編譯時確定一切 !统上
任務內容:
- 過濾出
City == "Seattle"的实现行; - 返回它們的
Id。 // 遇到 Rest 字段時遞歸 。查询兩全其美 。引擎因此 TypedSql 會在編譯階段檢查這一點,它其實就是一套可以進行高度優化的、用聲明的 CLR 類型(如string) 。沒有任何的虛擬調用,.NET 的 JIT 能夠識別這種模式,看起來也優雅 ,這時候 ,於是我選擇把字符串包在一個小的值類型裏:
internal readonly struct ValueString(string? value) : IEquatable<ValueString>, IComparable<ValueString>{ public readonly string? Value = value; public int CompareTo(ValueString other) => string.Compare(Value, other.Value, StringComparison.Ordinal); public bool Equals(ValueString other) { return string.Equals(Value, other.Value, StringComparison.Ordinal); } public override string? ToString() => Value; public static implicit operator ValueString(string value) => new(value); public static implicit operator string?(ValueString value) => value.Value;}再配一個適配器 ,當成查詢計劃會怎樣 ?
也就是說,對外返回
string?(靠隱式轉換)。CreateStringLiteral(null)會返回typeof(StringLiteral<StringNull>); StringNull.Length == -1
匹夫無罪網