@ahmadmoussawi/webdb 0.0.0-stage → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +386 -2
- package/dist/constants.d.ts +18 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/js/buffer_pool.c.d.ts +142 -0
- package/dist/core/js/buffer_pool.c.d.ts.map +1 -0
- package/dist/core/js/catalog.c.d.ts +186 -0
- package/dist/core/js/catalog.c.d.ts.map +1 -0
- package/dist/core/js/codecs.c.d.ts +32 -0
- package/dist/core/js/codecs.c.d.ts.map +1 -0
- package/dist/core/js/index.d.ts +7 -0
- package/dist/core/js/index.d.ts.map +1 -0
- package/dist/core/js/page.c.d.ts +225 -0
- package/dist/core/js/page.c.d.ts.map +1 -0
- package/dist/core/js/page_table.c.d.ts +48 -0
- package/dist/core/js/page_table.c.d.ts.map +1 -0
- package/dist/core/js/vm.c.d.ts +11 -0
- package/dist/core/js/vm.c.d.ts.map +1 -0
- package/dist/core/js/vm.helpers.c.d.ts +124 -0
- package/dist/core/js/vm.helpers.c.d.ts.map +1 -0
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/wasm/embedded_wasm.d.ts +7 -0
- package/dist/core/wasm/embedded_wasm.d.ts.map +1 -0
- package/dist/core/wasm/wasm_core.d.ts +75 -0
- package/dist/core/wasm/wasm_core.d.ts.map +1 -0
- package/dist/host/api/index.d.ts +3 -0
- package/dist/host/api/index.d.ts.map +1 -0
- package/dist/host/api/query_builder.d.ts +212 -0
- package/dist/host/api/query_builder.d.ts.map +1 -0
- package/dist/host/api/webdb.d.ts +102 -0
- package/dist/host/api/webdb.d.ts.map +1 -0
- package/dist/host/compiler/compiler.d.ts +151 -0
- package/dist/host/compiler/compiler.d.ts.map +1 -0
- package/dist/host/compiler/expr_parser.d.ts +87 -0
- package/dist/host/compiler/expr_parser.d.ts.map +1 -0
- package/dist/host/compiler/index.d.ts +4 -0
- package/dist/host/compiler/index.d.ts.map +1 -0
- package/dist/host/compiler/planner/cost.d.ts +23 -0
- package/dist/host/compiler/planner/cost.d.ts.map +1 -0
- package/dist/host/compiler/planner/custom_order.d.ts +16 -0
- package/dist/host/compiler/planner/custom_order.d.ts.map +1 -0
- package/dist/host/compiler/planner/heuristic.d.ts +11 -0
- package/dist/host/compiler/planner/heuristic.d.ts.map +1 -0
- package/dist/host/compiler/planner/index.d.ts +34 -0
- package/dist/host/compiler/planner/index.d.ts.map +1 -0
- package/dist/host/compiler/planner/noop.d.ts +11 -0
- package/dist/host/compiler/planner/noop.d.ts.map +1 -0
- package/dist/host/compiler/planner/types.d.ts +100 -0
- package/dist/host/compiler/planner/types.d.ts.map +1 -0
- package/dist/host/compiler/planner/where_optimizer.d.ts +30 -0
- package/dist/host/compiler/planner/where_optimizer.d.ts.map +1 -0
- package/dist/host/compiler/planner.d.ts +2 -0
- package/dist/host/compiler/planner.d.ts.map +1 -0
- package/dist/host/driver/buffer_pool_driver.d.ts +94 -0
- package/dist/host/driver/buffer_pool_driver.d.ts.map +1 -0
- package/dist/host/driver/crash_recovery.d.ts +24 -0
- package/dist/host/driver/crash_recovery.d.ts.map +1 -0
- package/dist/host/driver/index.d.ts +4 -0
- package/dist/host/driver/index.d.ts.map +1 -0
- package/dist/host/driver/transaction_coordinator.d.ts +163 -0
- package/dist/host/driver/transaction_coordinator.d.ts.map +1 -0
- package/dist/host/storage/crc32.d.ts +24 -0
- package/dist/host/storage/crc32.d.ts.map +1 -0
- package/dist/host/storage/idb.d.ts +27 -0
- package/dist/host/storage/idb.d.ts.map +1 -0
- package/dist/host/storage/index.d.ts +8 -0
- package/dist/host/storage/index.d.ts.map +1 -0
- package/dist/host/storage/io.d.ts +60 -0
- package/dist/host/storage/io.d.ts.map +1 -0
- package/dist/host/storage/memory.d.ts +28 -0
- package/dist/host/storage/memory.d.ts.map +1 -0
- package/dist/host/storage/opfs.d.ts +31 -0
- package/dist/host/storage/opfs.d.ts.map +1 -0
- package/dist/host/storage/vfs.d.ts +36 -0
- package/dist/host/storage/vfs.d.ts.map +1 -0
- package/dist/host/storage/wal_codec.d.ts +56 -0
- package/dist/host/storage/wal_codec.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/layouts/index.d.ts +5 -0
- package/dist/layouts/index.d.ts.map +1 -0
- package/dist/layouts/page_format.d.ts +163 -0
- package/dist/layouts/page_format.d.ts.map +1 -0
- package/dist/layouts/pool_format.d.ts +126 -0
- package/dist/layouts/pool_format.d.ts.map +1 -0
- package/dist/layouts/syspage_format.d.ts +499 -0
- package/dist/layouts/syspage_format.d.ts.map +1 -0
- package/dist/layouts/wal_format.d.ts +197 -0
- package/dist/layouts/wal_format.d.ts.map +1 -0
- package/dist/shared/c_runtime.d.ts +47 -0
- package/dist/shared/c_runtime.d.ts.map +1 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/page_provider.d.ts +12 -0
- package/dist/shared/page_provider.d.ts.map +1 -0
- package/dist/shared/vm_context.d.ts +73 -0
- package/dist/shared/vm_context.d.ts.map +1 -0
- package/dist/types/index.d.ts +269 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/webdb.js +11768 -0
- package/dist/webdb.js.map +1 -0
- package/dist/webdb.umd.cjs +5 -0
- package/dist/webdb.umd.cjs.map +1 -0
- package/package.json +82 -4
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ColumnDefinition, TableMeta, DbRow, DataType, IndexOptions, IndexDescriptor } from '../../types/index.ts';
|
|
2
|
+
import { IVfsAdapter } from '../storage/vfs.ts';
|
|
3
|
+
import { Io } from '../storage/io.ts';
|
|
4
|
+
import { BufferPoolDriver, TransactionCoordinator } from '../driver/index.js';
|
|
5
|
+
import { QueryFilter, SortKey, GroupKey, AggExpr } from '../compiler/compiler.ts';
|
|
6
|
+
import { ParsedSelectExpr } from '../compiler/expr_parser.ts';
|
|
7
|
+
import { QueryPlanner } from '../compiler/planner/index.ts';
|
|
8
|
+
import { QueryBuilder, ExplainOutput, IDatabaseQueryExecutor, QueryExecutionOptions, JoinClause } from './query_builder.ts';
|
|
9
|
+
import { WasmCoreExports } from '../../core/index.ts';
|
|
10
|
+
export interface UdfDefinition {
|
|
11
|
+
deterministic?: boolean;
|
|
12
|
+
returnType?: DataType;
|
|
13
|
+
call: (...args: any[]) => any;
|
|
14
|
+
}
|
|
15
|
+
export { QueryBuilder, type ExplainOutput, type IDatabaseQueryExecutor, type QueryExecutionOptions, };
|
|
16
|
+
export interface WebDbOptions {
|
|
17
|
+
name: string;
|
|
18
|
+
storage?: "memory" | "idb" | "opfs";
|
|
19
|
+
vfs?: IVfsAdapter;
|
|
20
|
+
slotCount?: number;
|
|
21
|
+
maxQueryMemory?: number;
|
|
22
|
+
core?: "js" | "wasm";
|
|
23
|
+
wasmBinary?: ArrayBuffer | Uint8Array;
|
|
24
|
+
planner?: QueryPlanner;
|
|
25
|
+
}
|
|
26
|
+
export declare class WebDB implements IDatabaseQueryExecutor {
|
|
27
|
+
readonly vfs: IVfsAdapter;
|
|
28
|
+
readonly io: Io;
|
|
29
|
+
readonly driver: BufferPoolDriver;
|
|
30
|
+
readonly coreMode: "js" | "wasm";
|
|
31
|
+
readonly wasmCore?: WasmCoreExports;
|
|
32
|
+
private planner?;
|
|
33
|
+
/**
|
|
34
|
+
* Alias to driver for callers/tests that inspect the buffer pool.
|
|
35
|
+
*/
|
|
36
|
+
get pool(): BufferPoolDriver;
|
|
37
|
+
readonly coordinator: TransactionCoordinator;
|
|
38
|
+
currentLeaseId: number | null;
|
|
39
|
+
private vmCtx;
|
|
40
|
+
private udfs;
|
|
41
|
+
private nextUdfId;
|
|
42
|
+
private tableMetaCache;
|
|
43
|
+
private tableTailPages;
|
|
44
|
+
private indexTailPages;
|
|
45
|
+
private constructor();
|
|
46
|
+
static open(options: WebDbOptions): Promise<WebDB>;
|
|
47
|
+
getPlanner(): QueryPlanner | undefined;
|
|
48
|
+
setPlanner(planner?: QueryPlanner): this;
|
|
49
|
+
createTable(name: string, columns: ColumnDefinition[]): Promise<TableMeta>;
|
|
50
|
+
private _createTableInternal;
|
|
51
|
+
getTable(tableName: string): Promise<TableMeta>;
|
|
52
|
+
private _getTableInternal;
|
|
53
|
+
listTables(): Promise<TableMeta[]>;
|
|
54
|
+
private freeTableTreePages;
|
|
55
|
+
dropTable(tableName: string): Promise<void>;
|
|
56
|
+
private _dropTableInternal;
|
|
57
|
+
createIndex(tableName: string, columns: string | string[], options?: IndexOptions): Promise<void>;
|
|
58
|
+
private _createIndexInternal;
|
|
59
|
+
dropIndex(indexName: string): Promise<void>;
|
|
60
|
+
private _dropIndexInternal;
|
|
61
|
+
listIndexes(tableName?: string): Promise<IndexDescriptor[]>;
|
|
62
|
+
private extractIndexKey;
|
|
63
|
+
private probeIndexUnique;
|
|
64
|
+
private insertIntoIndex;
|
|
65
|
+
insert(tableName: string, row: DbRow): Promise<void>;
|
|
66
|
+
insertMany(tableName: string, rows: DbRow[]): Promise<void>;
|
|
67
|
+
private _insertManyInternal;
|
|
68
|
+
transaction<T>(callback: (tx: WebDB) => Promise<T>): Promise<T>;
|
|
69
|
+
registerFunction(name: string, def: UdfDefinition | ((...args: any[]) => any)): this;
|
|
70
|
+
getUdf(name: string): {
|
|
71
|
+
id: number;
|
|
72
|
+
def: UdfDefinition;
|
|
73
|
+
} | undefined;
|
|
74
|
+
getUdfMap(): Map<string, number>;
|
|
75
|
+
getUdfDefs(): Map<string, UdfDefinition>;
|
|
76
|
+
from(tableName: string): QueryBuilder;
|
|
77
|
+
explainQuery(tableName: string, filters: QueryFilter[], options?: {
|
|
78
|
+
orderBy?: SortKey[];
|
|
79
|
+
groupBy?: (string | GroupKey)[];
|
|
80
|
+
aggregates?: AggExpr[];
|
|
81
|
+
having?: QueryFilter[];
|
|
82
|
+
select?: any;
|
|
83
|
+
selectExprs?: ParsedSelectExpr[];
|
|
84
|
+
joins?: JoinClause[];
|
|
85
|
+
limit?: number;
|
|
86
|
+
offset?: number;
|
|
87
|
+
planner?: QueryPlanner;
|
|
88
|
+
}): Promise<ExplainOutput>;
|
|
89
|
+
private _explainQueryInternal;
|
|
90
|
+
executeQuery(tableName: string, filters: QueryFilter[], options: QueryExecutionOptions): Promise<DbRow[]>;
|
|
91
|
+
private _executeQueryInternal;
|
|
92
|
+
/**
|
|
93
|
+
* Deduplicated Monotonic Checkpointing (Section 4.3):
|
|
94
|
+
* Replays committed WAL frames and resident memory slots to main storage,
|
|
95
|
+
* flushes main storage, and truncates WAL to 0.
|
|
96
|
+
*/
|
|
97
|
+
checkpoint(): Promise<{
|
|
98
|
+
pagesWritten: number;
|
|
99
|
+
}>;
|
|
100
|
+
close(): Promise<void>;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=webdb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webdb.d.ts","sourceRoot":"","sources":["../../../src/host/api/webdb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { OpCode, DataType, TableMeta, ColumnMeta, IndexDescriptor, JoinType } from '../../types/index.js';
|
|
2
|
+
import { VmKeyInfo } from '../../shared/vm_context.js';
|
|
3
|
+
import { ExprNode, ParsedSelectExpr } from './expr_parser.js';
|
|
4
|
+
import { QueryPlanner } from './planner.js';
|
|
5
|
+
export type ComparisonOp = "=" | "!=" | ">" | ">=" | "<" | "<=" | "like" | "not like" | "contains" | "starts_with" | "ends_with" | "in" | "not in";
|
|
6
|
+
export declare function getCmpOpcode(op: string | undefined): OpCode;
|
|
7
|
+
export type QueryFilterType = "null" | "cmp" | "expr" | "and" | "or" | "not" | "in";
|
|
8
|
+
export interface QueryFilter {
|
|
9
|
+
type: QueryFilterType;
|
|
10
|
+
colName?: string;
|
|
11
|
+
isNull?: boolean;
|
|
12
|
+
op?: ComparisonOp;
|
|
13
|
+
value?: any;
|
|
14
|
+
values?: any[];
|
|
15
|
+
notIn?: boolean;
|
|
16
|
+
expr?: ExprNode;
|
|
17
|
+
children?: QueryFilter[];
|
|
18
|
+
child?: QueryFilter;
|
|
19
|
+
}
|
|
20
|
+
export interface SortKey {
|
|
21
|
+
colName?: string;
|
|
22
|
+
expr?: ExprNode;
|
|
23
|
+
direction?: "asc" | "desc";
|
|
24
|
+
nullOrder?: "nulls_first" | "nulls_last";
|
|
25
|
+
}
|
|
26
|
+
export interface GroupKey {
|
|
27
|
+
colName?: string;
|
|
28
|
+
expr?: ExprNode;
|
|
29
|
+
}
|
|
30
|
+
export type AggFunc = "count" | "sum" | "avg" | "min" | "max";
|
|
31
|
+
export interface AggExpr {
|
|
32
|
+
func: AggFunc;
|
|
33
|
+
colName?: string;
|
|
34
|
+
alias?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface JoinPlan {
|
|
37
|
+
type: JoinType;
|
|
38
|
+
table: TableMeta;
|
|
39
|
+
cursor: number;
|
|
40
|
+
leftCol: string;
|
|
41
|
+
op: ComparisonOp;
|
|
42
|
+
rightCol: string;
|
|
43
|
+
}
|
|
44
|
+
export interface QueryPlan {
|
|
45
|
+
table: TableMeta;
|
|
46
|
+
joinedTables?: JoinPlan[];
|
|
47
|
+
filters: QueryFilter[];
|
|
48
|
+
orderBy?: SortKey[];
|
|
49
|
+
groupBy?: (string | GroupKey)[];
|
|
50
|
+
aggregates?: AggExpr[];
|
|
51
|
+
having?: QueryFilter[];
|
|
52
|
+
selectExprs?: ParsedSelectExpr[];
|
|
53
|
+
udfNameMap?: Map<string, number>;
|
|
54
|
+
udfDefs?: Map<string, {
|
|
55
|
+
returnType?: DataType;
|
|
56
|
+
}>;
|
|
57
|
+
keyInfos?: VmKeyInfo[];
|
|
58
|
+
outputColumns?: ColumnMeta[];
|
|
59
|
+
limit?: number;
|
|
60
|
+
offset?: number;
|
|
61
|
+
planner?: QueryPlanner;
|
|
62
|
+
isOrderSatisfied?: boolean;
|
|
63
|
+
sortCostAvoided?: number;
|
|
64
|
+
}
|
|
65
|
+
export declare class BytecodeEmitter {
|
|
66
|
+
private buffer;
|
|
67
|
+
private textEncoder;
|
|
68
|
+
emitUint8(val: number): number;
|
|
69
|
+
emitUint16(val: number): number;
|
|
70
|
+
emitUint32(val: number): number;
|
|
71
|
+
emitInt32(val: number): number;
|
|
72
|
+
emitFloat64(val: number): number;
|
|
73
|
+
emitString(str: string): number;
|
|
74
|
+
emitBytes(bytes: Uint8Array): number;
|
|
75
|
+
patchUint16(pos: number, val: number): void;
|
|
76
|
+
currentOffset(): number;
|
|
77
|
+
toByteArray(): Uint8Array;
|
|
78
|
+
}
|
|
79
|
+
export declare function normalizeFilter(filter: QueryFilter): QueryFilter;
|
|
80
|
+
export declare function buildRootFilter(filters: QueryFilter[]): QueryFilter | null;
|
|
81
|
+
export declare function collectLeafFilters(filter: QueryFilter): QueryFilter[];
|
|
82
|
+
export declare function getTopLevelConjunctionFilters(rootFilter: QueryFilter | null): QueryFilter[];
|
|
83
|
+
export interface ResolvedColumn {
|
|
84
|
+
tableIdx: number;
|
|
85
|
+
cursor: number;
|
|
86
|
+
colIdx: number;
|
|
87
|
+
col: ColumnMeta;
|
|
88
|
+
table: TableMeta;
|
|
89
|
+
}
|
|
90
|
+
export declare function resolveColumnAcrossTables(colName: string, tables: TableMeta[]): ResolvedColumn | null;
|
|
91
|
+
export declare function inferExprType(expr: ExprNode, table: TableMeta, udfDefs?: Map<string, {
|
|
92
|
+
returnType?: DataType;
|
|
93
|
+
}>, tables?: TableMeta[]): DataType;
|
|
94
|
+
export declare function emitExpression(expr: ExprNode, table: TableMeta, emitter: BytecodeEmitter, cursor: number, targetReg: number, allocReg: () => number, udfNameMap?: Map<string, number>, resolveReg?: (name?: string, expr?: ExprNode) => number | undefined, tables?: TableMeta[]): void;
|
|
95
|
+
export interface CandidateIndexScan {
|
|
96
|
+
index: IndexDescriptor;
|
|
97
|
+
scanType: "point" | "range" | "multi_point";
|
|
98
|
+
seekFilter?: QueryFilter;
|
|
99
|
+
filterIndex: number;
|
|
100
|
+
keyType: DataType;
|
|
101
|
+
compositeValue?: Uint8Array;
|
|
102
|
+
inValues?: any[];
|
|
103
|
+
satisfiesOrderBy?: boolean;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns minimum scalar key value for DataType when seeking the start of an index.
|
|
107
|
+
*/
|
|
108
|
+
export declare function getMinKeyValueForType(type: DataType): any;
|
|
109
|
+
/**
|
|
110
|
+
* Tests whether a secondary index satisfies the query's ORDER BY keys directly.
|
|
111
|
+
* Forward B-Tree scans naturally stream in ASC order.
|
|
112
|
+
*/
|
|
113
|
+
export declare function isIndexAlignedWithOrderBy(index: IndexDescriptor, table: TableMeta, orderBy?: SortKey[], equalityColumns?: Set<string>): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Tests whether a join plan preserves the requested ORDER BY.
|
|
116
|
+
* In a nested loop join, if all ORDER BY keys belong to the driving table (Table 0)
|
|
117
|
+
* and are sorted in ASC order, the outer loop determines the output order.
|
|
118
|
+
*/
|
|
119
|
+
export declare function canJoinPreserveOrder(drivingTable: TableMeta, joinedTables: JoinPlan[], orderBy?: SortKey[], allTables?: TableMeta[], selectExprs?: ParsedSelectExpr[]): boolean;
|
|
120
|
+
export declare function chooseIndexScan(table: TableMeta, candidateFilters: QueryFilter[], leafFilters?: QueryFilter[], orderBy?: SortKey[]): CandidateIndexScan | null;
|
|
121
|
+
export interface JoinIndexCandidate {
|
|
122
|
+
index: IndexDescriptor;
|
|
123
|
+
isUnique: boolean;
|
|
124
|
+
innerCol: ResolvedColumn;
|
|
125
|
+
outerCol: ResolvedColumn;
|
|
126
|
+
indexCursor: number;
|
|
127
|
+
}
|
|
128
|
+
export declare function chooseJoinIndex(joinPlan: JoinPlan, innerTable: TableMeta, innerTableIdx: number, allTables: TableMeta[], indexCursor: number): JoinIndexCandidate | null;
|
|
129
|
+
/**
|
|
130
|
+
* Compiles a QueryPlan into an executable bytecode array.
|
|
131
|
+
*/
|
|
132
|
+
export declare function compileQuery(plan: QueryPlan, options?: {
|
|
133
|
+
planner?: QueryPlanner;
|
|
134
|
+
}): Uint8Array;
|
|
135
|
+
export interface DisassembledInstruction {
|
|
136
|
+
addr: number;
|
|
137
|
+
opcode: string;
|
|
138
|
+
p1: string;
|
|
139
|
+
p2: string;
|
|
140
|
+
p3: string;
|
|
141
|
+
comment: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Disassembles binary bytecode into human-readable instructions.
|
|
145
|
+
*/
|
|
146
|
+
export declare function disassembleBytecode(bytecode: Uint8Array, table?: TableMeta): DisassembledInstruction[];
|
|
147
|
+
/**
|
|
148
|
+
* Formats a list of disassembled instructions into an ASCII table string.
|
|
149
|
+
*/
|
|
150
|
+
export declare function formatDisassembly(instructions: DisassembledInstruction[]): string;
|
|
151
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/host/compiler/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { DbRow } from '../../types/index.js';
|
|
2
|
+
export type BinaryOp = '+' | '-' | '*' | '/' | '%' | '=' | '!=' | '<' | '<=' | '>' | '>=';
|
|
3
|
+
export type ExprNode = {
|
|
4
|
+
type: 'col';
|
|
5
|
+
name: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: 'literal';
|
|
8
|
+
value: number | string | boolean | null;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'binary';
|
|
11
|
+
op: BinaryOp;
|
|
12
|
+
left: ExprNode;
|
|
13
|
+
right: ExprNode;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'fn';
|
|
16
|
+
name: string;
|
|
17
|
+
args: ExprNode[];
|
|
18
|
+
};
|
|
19
|
+
export interface ParsedSelectExpr {
|
|
20
|
+
expr: ExprNode;
|
|
21
|
+
alias: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const BUILTIN_AGGREGATES: Set<string>;
|
|
24
|
+
export declare const BUILTIN_SCALARS: Set<string>;
|
|
25
|
+
export declare function isAggregateFunction(name: string): boolean;
|
|
26
|
+
export declare function isBuiltinScalarFunction(name: string): boolean;
|
|
27
|
+
export declare function isBuiltinFunction(name: string): boolean;
|
|
28
|
+
export declare function validateClause(expr: ExprNode, clause: 'select' | 'where' | 'having' | 'orderBy'): void;
|
|
29
|
+
/**
|
|
30
|
+
* Parses a raw SQL expression string into an AST ExprNode.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseExpression(sql: string): ExprNode;
|
|
33
|
+
/**
|
|
34
|
+
* Derives a human-friendly default alias if no explicit `AS alias` is provided.
|
|
35
|
+
*/
|
|
36
|
+
export declare function deriveDefaultAlias(expr: ExprNode): string;
|
|
37
|
+
/**
|
|
38
|
+
* Parses a select clause item string (e.g. "abs(salary) as abs_salary" or "name").
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseSelectExpr(raw: string): ParsedSelectExpr;
|
|
41
|
+
export declare class ExpressionBuilder {
|
|
42
|
+
readonly node: ExprNode;
|
|
43
|
+
constructor(node: ExprNode);
|
|
44
|
+
add(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
45
|
+
sub(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
46
|
+
mul(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
47
|
+
div(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
48
|
+
mod(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
49
|
+
eq(other: ExprNode | ExpressionBuilder | number | string | boolean | null): ExpressionBuilder;
|
|
50
|
+
ne(other: ExprNode | ExpressionBuilder | number | string | boolean | null): ExpressionBuilder;
|
|
51
|
+
lt(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
52
|
+
lte(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
53
|
+
gt(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
54
|
+
gte(other: ExprNode | ExpressionBuilder | number | string): ExpressionBuilder;
|
|
55
|
+
as(alias: string): ParsedSelectExpr;
|
|
56
|
+
}
|
|
57
|
+
export declare function col(name: string): ExpressionBuilder;
|
|
58
|
+
export declare function exp(sqlStr: string): ExpressionBuilder;
|
|
59
|
+
export declare const sql: typeof exp;
|
|
60
|
+
export interface FnNamespace {
|
|
61
|
+
(name: string, ...args: (ExprNode | ExpressionBuilder | number | string)[]): ExpressionBuilder;
|
|
62
|
+
upper(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
63
|
+
lower(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
64
|
+
length(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
65
|
+
substr(expr: ExprNode | ExpressionBuilder | string, start: number | ExprNode | ExpressionBuilder, len?: number | ExprNode | ExpressionBuilder): ExpressionBuilder;
|
|
66
|
+
trim(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
67
|
+
abs(expr: ExprNode | ExpressionBuilder | number): ExpressionBuilder;
|
|
68
|
+
round(expr: ExprNode | ExpressionBuilder | number): ExpressionBuilder;
|
|
69
|
+
floor(expr: ExprNode | ExpressionBuilder | number): ExpressionBuilder;
|
|
70
|
+
ceil(expr: ExprNode | ExpressionBuilder | number): ExpressionBuilder;
|
|
71
|
+
count(expr?: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
72
|
+
sum(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
73
|
+
avg(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
74
|
+
min(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
75
|
+
max(expr: ExprNode | ExpressionBuilder | string): ExpressionBuilder;
|
|
76
|
+
concat(...exprs: (ExprNode | ExpressionBuilder | string)[]): ExpressionBuilder;
|
|
77
|
+
coalesce(...exprs: (ExprNode | ExpressionBuilder | string | null)[]): ExpressionBuilder;
|
|
78
|
+
}
|
|
79
|
+
export declare const fn: FnNamespace;
|
|
80
|
+
/**
|
|
81
|
+
* Evaluates an ExprNode AST against a database row.
|
|
82
|
+
* Used for fallback projection and post-processing.
|
|
83
|
+
*/
|
|
84
|
+
export declare function evalExprNode(expr: ExprNode, row: DbRow, udfs?: Map<string, {
|
|
85
|
+
call: (...args: any[]) => any;
|
|
86
|
+
}> | Record<string, (...args: any[]) => any> | ((name: string) => ((...args: any[]) => any) | undefined)): any;
|
|
87
|
+
//# sourceMappingURL=expr_parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expr_parser.d.ts","sourceRoot":"","sources":["../../../src/host/compiler/expr_parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,EACN,MAAM,sBAAsB,CAAC;AAG9B,MAAM,MAAM,QAAQ,GAChB,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,CAAC;AAET,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,kBAAkB,aAAiD,CAAC;AAEjF,eAAO,MAAM,eAAe,aAY1B,CAAC;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAChD,IAAI,CAeN;AAyTD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAQrD;AAkDD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAmBzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAK7D;AAMD,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAEZ,IAAI,EAAE,QAAQ;IAI1B,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,iBAAiB;IAS7F,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,iBAAiB;IAS7F,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS5E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS5E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB;IAS7E,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB;CAMpC;AAqBD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAEnD;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAErD;AAED,eAAO,MAAM,GAAG,YAAM,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,iBAAiB,CAAC;IAC/F,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACtE,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACvE,MAAM,CACJ,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,EAC3C,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,iBAAiB,EAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,iBAAiB,GAC1C,iBAAiB,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACrE,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACtE,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACtE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACrE,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACvE,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpE,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpE,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpE,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,GAAG,iBAAiB,GAAG,MAAM,CAAC,EAAE,GAAG,iBAAiB,CAAC;IAC/E,QAAQ,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,iBAAiB,CAAC;CACzF;AAiDD,eAAO,MAAM,EAAE,EAAE,WAA2B,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,KAAK,EACV,IAAI,CAAC,EACD,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;CAAE,CAAC,GAC9C,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GACvC,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,GAC5D,GAAG,CA4IL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/host/compiler/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { QueryPlan } from '../compiler.js';
|
|
2
|
+
import { QueryPlanner, OptimizedPlanResult } from './types.js';
|
|
3
|
+
export interface CostBasedPlannerOptions {
|
|
4
|
+
indexSeekCost?: number;
|
|
5
|
+
indexNextCost?: number;
|
|
6
|
+
rowEvalCost?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* CostBasedPlanner unifies WHERE filter optimization and JOIN planning:
|
|
10
|
+
* - Detects contradictions and prunes redundant/subsumed WHERE conditions.
|
|
11
|
+
* - Infers transitive filters across join boundaries.
|
|
12
|
+
* - Evaluates join permutations with Dynamic Programming to minimize total cost.
|
|
13
|
+
*/
|
|
14
|
+
export declare class CostBasedPlanner implements QueryPlanner {
|
|
15
|
+
readonly name = "cost";
|
|
16
|
+
private indexSeekCost;
|
|
17
|
+
private indexNextCost;
|
|
18
|
+
private rowEvalCost;
|
|
19
|
+
constructor(options?: CostBasedPlannerOptions);
|
|
20
|
+
optimize(plan: QueryPlan): OptimizedPlanResult;
|
|
21
|
+
private evaluateJoinStep;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../../../src/host/compiler/planner/cost.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EAIV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EAapB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,CAAC,EAAE,uBAAuB;IAM7C,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB;IAuX9C,OAAO,CAAC,gBAAgB;CAyHzB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TableMeta } from '../../../types/index.js';
|
|
2
|
+
import { QueryPlan } from '../compiler.js';
|
|
3
|
+
import { QueryPlanner, OptimizedPlanResult } from './types.js';
|
|
4
|
+
export type TableOrderComparator = (a: TableMeta, b: TableMeta) => number;
|
|
5
|
+
export type CustomOrderSpec = string[] | TableOrderComparator;
|
|
6
|
+
/**
|
|
7
|
+
* CustomOrderPlanner executes joins according to an explicit table order or custom comparator.
|
|
8
|
+
* Join conditions and projections are automatically reconstructed to match the custom table order.
|
|
9
|
+
*/
|
|
10
|
+
export declare class CustomOrderPlanner implements QueryPlanner {
|
|
11
|
+
readonly name = "custom-order";
|
|
12
|
+
private orderSpec?;
|
|
13
|
+
constructor(orderSpec?: CustomOrderSpec);
|
|
14
|
+
optimize(plan: QueryPlan): OptimizedPlanResult;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=custom_order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom_order.d.ts","sourceRoot":"","sources":["../../../../src/host/compiler/planner/custom_order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,SAAS,EAKV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EAMpB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,MAAM,EAAE,GAAG,oBAAoB,CAAC;AAE9D;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAkB;gBAExB,SAAS,CAAC,EAAE,eAAe;IAIvC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB;CAkJ/C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { QueryPlan } from '../compiler.js';
|
|
2
|
+
import { QueryPlanner, OptimizedPlanResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* HeuristicPlanner performs greedy nearest-neighbor join ordering.
|
|
5
|
+
* It is fast (O(N^2)), lightweight, and handles common join patterns without full DP enumeration.
|
|
6
|
+
*/
|
|
7
|
+
export declare class HeuristicPlanner implements QueryPlanner {
|
|
8
|
+
readonly name = "heuristic";
|
|
9
|
+
optimize(plan: QueryPlan): OptimizedPlanResult;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=heuristic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heuristic.d.ts","sourceRoot":"","sources":["../../../../src/host/compiler/planner/heuristic.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EAIV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EAWpB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,IAAI,eAAe;IAE5B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB;CAyQ/C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { QueryPlan } from '../compiler.js';
|
|
2
|
+
import { QueryPlanner, OptimizedPlanResult } from './types.js';
|
|
3
|
+
import { CostBasedPlanner } from './cost.js';
|
|
4
|
+
import { HeuristicPlanner } from './heuristic.js';
|
|
5
|
+
import { NoOpPlanner } from './noop.js';
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export * from './cost.js';
|
|
8
|
+
export * from './heuristic.js';
|
|
9
|
+
export * from './noop.js';
|
|
10
|
+
export * from './custom_order.js';
|
|
11
|
+
export * from './where_optimizer.js';
|
|
12
|
+
/**
|
|
13
|
+
* CustomPlanner allows supplying a custom optimization function.
|
|
14
|
+
*/
|
|
15
|
+
export declare class CustomPlanner implements QueryPlanner {
|
|
16
|
+
private fn;
|
|
17
|
+
readonly name = "custom";
|
|
18
|
+
constructor(fn: (plan: QueryPlan) => OptimizedPlanResult);
|
|
19
|
+
optimize(plan: QueryPlan): OptimizedPlanResult;
|
|
20
|
+
}
|
|
21
|
+
export declare const CustomQueryPlanner: typeof CustomPlanner;
|
|
22
|
+
export declare const DefaultQueryPlanner: typeof CostBasedPlanner;
|
|
23
|
+
export declare const CostBasedQueryPlanner: typeof CostBasedPlanner;
|
|
24
|
+
export declare const HeuristicQueryPlanner: typeof HeuristicPlanner;
|
|
25
|
+
export declare const NoOpQueryPlanner: typeof NoOpPlanner;
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a QueryPlanner instance, defaulting to CostBasedPlanner.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveQueryPlanner(planner?: QueryPlanner | null): QueryPlanner;
|
|
30
|
+
/**
|
|
31
|
+
* Optimizes a complete QueryPlan using the resolved QueryPlanner.
|
|
32
|
+
*/
|
|
33
|
+
export declare function optimizeQueryPlan(plan: QueryPlan, planner?: QueryPlanner | null): OptimizedPlanResult;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/host/compiler/planner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC;;GAEG;AACH,qBAAa,aAAc,YAAW,YAAY;IAEpC,OAAO,CAAC,EAAE;IADtB,QAAQ,CAAC,IAAI,YAAY;gBACL,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,mBAAmB;IAChE,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB;CAG/C;AAED,eAAO,MAAM,kBAAkB,sBAAgB,CAAC;AAChD,eAAO,MAAM,mBAAmB,yBAAmB,CAAC;AACpD,eAAO,MAAM,qBAAqB,yBAAmB,CAAC;AACtD,eAAO,MAAM,qBAAqB,yBAAmB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC;AAI5C;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,GAC5B,YAAY,CAEd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,EACf,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,GAC5B,mBAAmB,CAGrB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { QueryPlan } from '../compiler.js';
|
|
2
|
+
import { QueryPlanner, OptimizedPlanResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* NoOpPlanner preserves the exact declared query join order (straight join).
|
|
5
|
+
* It still partitions single-table filters for early pushdown without reordering tables.
|
|
6
|
+
*/
|
|
7
|
+
export declare class NoOpPlanner implements QueryPlanner {
|
|
8
|
+
readonly name = "noop";
|
|
9
|
+
optimize(plan: QueryPlan): OptimizedPlanResult;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=noop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../../../src/host/compiler/planner/noop.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EAKV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,UAAU;IAEvB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB;CA0E/C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { TableMeta, IndexDescriptor, JoinType } from '../../../types/index.js';
|
|
2
|
+
import { QueryPlan, JoinPlan, QueryFilter, ComparisonOp, SortKey } from '../compiler.js';
|
|
3
|
+
import { ParsedSelectExpr } from '../expr_parser.js';
|
|
4
|
+
export interface WhereMetrics {
|
|
5
|
+
originalCount: number;
|
|
6
|
+
optimizedCount: number;
|
|
7
|
+
isAlwaysFalse: boolean;
|
|
8
|
+
isAlwaysTrue: boolean;
|
|
9
|
+
contradictionReason?: string;
|
|
10
|
+
eliminatedFiltersCount: number;
|
|
11
|
+
reordered: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface PlanCostMetrics {
|
|
14
|
+
totalCost: number;
|
|
15
|
+
estimatedRows: number;
|
|
16
|
+
joinOrder: string[];
|
|
17
|
+
singleTableFilters: Map<number, QueryFilter[]>;
|
|
18
|
+
crossFilters: QueryFilter[];
|
|
19
|
+
tableScanTypes: ('TableScan' | 'IndexScan')[];
|
|
20
|
+
tableIndexNames: (string | undefined)[];
|
|
21
|
+
isOrderSatisfied?: boolean;
|
|
22
|
+
sortCostAvoided?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface OptimizedPlanResult {
|
|
25
|
+
plan: QueryPlan;
|
|
26
|
+
orderedTables: TableMeta[];
|
|
27
|
+
metrics: PlanCostMetrics | null;
|
|
28
|
+
isAlwaysFalse?: boolean;
|
|
29
|
+
isAlwaysTrue?: boolean;
|
|
30
|
+
whereMetrics?: WhereMetrics;
|
|
31
|
+
isOrderSatisfied?: boolean;
|
|
32
|
+
sortCostAvoided?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface QueryPlanner {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
optimize(plan: QueryPlan): OptimizedPlanResult;
|
|
37
|
+
}
|
|
38
|
+
export interface JoinEdge {
|
|
39
|
+
tableA: number;
|
|
40
|
+
tableB: number;
|
|
41
|
+
colA: string;
|
|
42
|
+
colB: string;
|
|
43
|
+
op: ComparisonOp;
|
|
44
|
+
type: JoinType;
|
|
45
|
+
declaredRightTable: number;
|
|
46
|
+
}
|
|
47
|
+
export declare const COST_INDEX_SEEK = 0.5;
|
|
48
|
+
export declare const COST_INDEX_NEXT = 0.05;
|
|
49
|
+
export declare const COST_ROW_EVAL = 0.02;
|
|
50
|
+
/**
|
|
51
|
+
* Extracts all column names referenced in a filter (both direct colName and expr).
|
|
52
|
+
*/
|
|
53
|
+
export declare function extractFilterColumnNames(filter: QueryFilter): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Determines which table indices (in `tables`) are referenced by a filter.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getFilterReferencedTables(filter: QueryFilter, tables: TableMeta[]): Set<number>;
|
|
58
|
+
/**
|
|
59
|
+
* Estimates filter selectivity based on operation, column index presence, and table row count.
|
|
60
|
+
*/
|
|
61
|
+
export declare function estimateFilterSelectivity(filter: QueryFilter, table: TableMeta): number;
|
|
62
|
+
/**
|
|
63
|
+
* Computes single-table base cardinality and scan cost for a table when used as driving table.
|
|
64
|
+
*/
|
|
65
|
+
export declare function getSingleTableBaseCost(table: TableMeta, filters: QueryFilter[], orderBy?: SortKey[], limit?: number): {
|
|
66
|
+
cost: number;
|
|
67
|
+
rows: number;
|
|
68
|
+
scanType: 'TableScan' | 'IndexScan';
|
|
69
|
+
indexName?: string;
|
|
70
|
+
isOrderSatisfied?: boolean;
|
|
71
|
+
sortCostAvoided?: number;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Checks if targetTable has an index on the given column.
|
|
75
|
+
*/
|
|
76
|
+
export declare function findIndexOnColumn(table: TableMeta, colName: string): {
|
|
77
|
+
index: IndexDescriptor;
|
|
78
|
+
isUnique: boolean;
|
|
79
|
+
} | null;
|
|
80
|
+
/**
|
|
81
|
+
* Builds join edges and left-join dependency constraints from query join clauses.
|
|
82
|
+
*/
|
|
83
|
+
export declare function buildJoinEdges(plan: QueryPlan, originalTables: TableMeta[]): {
|
|
84
|
+
edges: JoinEdge[];
|
|
85
|
+
dependencies: Set<number>[];
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Preserves output column projection order in case of table reordering.
|
|
89
|
+
*/
|
|
90
|
+
export declare function materializeOutputSelectExprs(plan: QueryPlan, originalTables: TableMeta[]): ParsedSelectExpr[] | undefined;
|
|
91
|
+
/**
|
|
92
|
+
* Reconstructs JoinPlan[] for the ordered tables based on resolved join edges.
|
|
93
|
+
*/
|
|
94
|
+
export declare function reconstructJoinPlans(winningOrder: number[], originalTables: TableMeta[], edges: JoinEdge[], originalJoinedPlans?: JoinPlan[]): JoinPlan[];
|
|
95
|
+
/**
|
|
96
|
+
* Checks whether all ORDER BY keys belong to candidateTable and are ASC,
|
|
97
|
+
* which enables nested-loop join order preservation if candidateTable is the driving table.
|
|
98
|
+
*/
|
|
99
|
+
export declare function doesTableSatisfyJoinOrderKeys(candidateTable: TableMeta, candidateTableIdx: number, allTables: TableMeta[], orderBy?: SortKey[], selectExprs?: ParsedSelectExpr[]): boolean;
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/host/compiler/planner/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { TableMeta } from '../../../types/index.js';
|
|
2
|
+
import { QueryFilter } from '../compiler.js';
|
|
3
|
+
import { WhereMetrics } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Assigns an estimated relative CPU/evaluation cost to a filter for optimal short-circuit reordering.
|
|
6
|
+
* Lower numbers = cheaper to evaluate -> placed first in execution.
|
|
7
|
+
*/
|
|
8
|
+
export declare function estimateWhereCost(filter: QueryFilter, tables?: TableMeta[]): number;
|
|
9
|
+
/**
|
|
10
|
+
* Optimizes an array of query filters by:
|
|
11
|
+
* 1. Detecting contradictions (short-circuiting).
|
|
12
|
+
* 2. Pruning redundant duplicates and subsumed range bounds.
|
|
13
|
+
* 3. Reordering filters by evaluation cost.
|
|
14
|
+
*/
|
|
15
|
+
export declare function optimizeWherePredicates(filters: QueryFilter[], tables?: TableMeta[]): {
|
|
16
|
+
filters: QueryFilter[];
|
|
17
|
+
isAlwaysFalse: boolean;
|
|
18
|
+
isAlwaysTrue: boolean;
|
|
19
|
+
metrics: WhereMetrics;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Infers transitive equality predicates across inner/left joins.
|
|
23
|
+
*/
|
|
24
|
+
export declare function inferTransitivePredicates(filters: QueryFilter[], joinedPlans: {
|
|
25
|
+
leftCol: string;
|
|
26
|
+
op: string;
|
|
27
|
+
rightCol: string;
|
|
28
|
+
type: string;
|
|
29
|
+
}[]): QueryFilter[];
|
|
30
|
+
//# sourceMappingURL=where_optimizer.d.ts.map
|