@quereus/quereus 0.6.2 → 0.6.4
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 +1 -1
- package/dist/src/index.d.ts +4 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +1 -1
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/schema/schema-hasher.d.ts +3 -3
- package/dist/src/schema/schema-hasher.d.ts.map +1 -1
- package/dist/src/schema/schema-hasher.js +9 -27
- package/dist/src/schema/schema-hasher.js.map +1 -1
- package/dist/src/util/hash.d.ts +19 -0
- package/dist/src/util/hash.d.ts.map +1 -0
- package/dist/src/util/hash.js +76 -0
- package/dist/src/util/hash.js.map +1 -0
- package/dist/src/util/plugin-helper.d.ts +45 -0
- package/dist/src/util/plugin-helper.d.ts.map +1 -0
- package/dist/src/util/plugin-helper.js +85 -0
- package/dist/src/util/plugin-helper.js.map +1 -0
- package/package.json +4 -2
- package/src/index.ts +10 -16
- package/src/planner/building/delete.ts +214 -214
- package/src/planner/building/insert.ts +428 -428
- package/src/planner/building/update.ts +319 -319
- package/src/runtime/emit/schema-declarative.ts +1 -1
- package/src/schema/schema-hasher.ts +9 -27
- package/src/util/ast-stringify.ts +864 -864
- package/src/util/hash.ts +90 -0
- package/src/util/plugin-helper.ts +110 -0
- package/src/vtab/memory/table.ts +256 -256
- package/src/vtab/table.ts +162 -162
- package/dist/src/config/loader.d.ts +0 -41
- package/dist/src/config/loader.d.ts.map +0 -1
- package/dist/src/config/loader.js +0 -102
- package/dist/src/config/loader.js.map +0 -1
- package/dist/src/planner/nodes/physical-access-nodes.d.ts +0 -83
- package/dist/src/planner/nodes/physical-access-nodes.d.ts.map +0 -1
- package/dist/src/planner/nodes/physical-access-nodes.js +0 -226
- package/dist/src/planner/nodes/physical-access-nodes.js.map +0 -1
- package/dist/src/planner/nodes/scan.d.ts +0 -27
- package/dist/src/planner/nodes/scan.d.ts.map +0 -1
- package/dist/src/planner/nodes/scan.js +0 -78
- package/dist/src/planner/nodes/scan.js.map +0 -1
- package/dist/src/planner/nodes/update-executor-node.d.ts +0 -24
- package/dist/src/planner/nodes/update-executor-node.d.ts.map +0 -1
- package/dist/src/planner/nodes/update-executor-node.js +0 -57
- package/dist/src/planner/nodes/update-executor-node.js.map +0 -1
- package/dist/src/planner/physical-utils.d.ts +0 -36
- package/dist/src/planner/physical-utils.d.ts.map +0 -1
- package/dist/src/planner/physical-utils.js +0 -122
- package/dist/src/planner/physical-utils.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-filter-optimization.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-filter-optimization.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-filter-optimization.js +0 -49
- package/dist/src/planner/rules/physical/rule-filter-optimization.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-mark-physical.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-mark-physical.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-mark-physical.js +0 -29
- package/dist/src/planner/rules/physical/rule-mark-physical.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-project-optimization.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-project-optimization.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-project-optimization.js +0 -44
- package/dist/src/planner/rules/physical/rule-project-optimization.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-sort-optimization.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-sort-optimization.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-sort-optimization.js +0 -53
- package/dist/src/planner/rules/physical/rule-sort-optimization.js.map +0 -1
- package/dist/src/planner/rules/rewrite/rule-constant-folding.d.ts +0 -11
- package/dist/src/planner/rules/rewrite/rule-constant-folding.d.ts.map +0 -1
- package/dist/src/planner/rules/rewrite/rule-constant-folding.js +0 -59
- package/dist/src/planner/rules/rewrite/rule-constant-folding.js.map +0 -1
- package/dist/src/planner/util/deferred-constraint.d.ts +0 -14
- package/dist/src/planner/util/deferred-constraint.d.ts.map +0 -1
- package/dist/src/planner/util/deferred-constraint.js +0 -85
- package/dist/src/planner/util/deferred-constraint.js.map +0 -1
- package/dist/src/runtime/emit/table-reference.d.ts +0 -5
- package/dist/src/runtime/emit/table-reference.d.ts.map +0 -1
- package/dist/src/runtime/emit/table-reference.js +0 -67
- package/dist/src/runtime/emit/table-reference.js.map +0 -1
- package/dist/src/runtime/emit/update-executor.d.ts +0 -5
- package/dist/src/runtime/emit/update-executor.d.ts.map +0 -1
- package/dist/src/runtime/emit/update-executor.js +0 -54
- package/dist/src/runtime/emit/update-executor.js.map +0 -1
- package/dist/src/util/plugin-loader.d.ts +0 -52
- package/dist/src/util/plugin-loader.d.ts.map +0 -1
- package/dist/src/util/plugin-loader.js +0 -307
- package/dist/src/util/plugin-loader.js.map +0 -1
- package/src/config/loader.ts +0 -140
- package/src/util/plugin-loader.ts +0 -387
package/src/vtab/table.ts
CHANGED
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
import type { AnyVirtualTableModule, SchemaChangeInfo } from './module.js';
|
|
2
|
-
import type { Database } from '../core/database.js';
|
|
3
|
-
import type { TableSchema } from '../schema/table.js';
|
|
4
|
-
import type { MaybePromise, Row } from '../common/types.js';
|
|
5
|
-
import type { IndexSchema } from '../schema/table.js';
|
|
6
|
-
import type { FilterInfo } from './filter-info.js';
|
|
7
|
-
import type { RowOp } from '../common/types.js';
|
|
8
|
-
import type { ConflictResolution } from '../common/constants.js';
|
|
9
|
-
import type { VirtualTableConnection } from './connection.js';
|
|
10
|
-
import type { PlanNode } from '../planner/nodes/plan-node.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Base class representing a virtual table instance.
|
|
14
|
-
* Module implementations should subclass this to provide specific table behavior.
|
|
15
|
-
*/
|
|
16
|
-
export abstract class VirtualTable {
|
|
17
|
-
public readonly module: AnyVirtualTableModule;
|
|
18
|
-
public readonly db: Database;
|
|
19
|
-
public readonly tableName: string;
|
|
20
|
-
public readonly schemaName: string;
|
|
21
|
-
public errorMessage?: string;
|
|
22
|
-
public tableSchema?: TableSchema;
|
|
23
|
-
|
|
24
|
-
constructor(db: Database, module: AnyVirtualTableModule, schemaName: string, tableName: string) {
|
|
25
|
-
this.db = db;
|
|
26
|
-
this.module = module;
|
|
27
|
-
this.schemaName = schemaName;
|
|
28
|
-
this.tableName = tableName;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Sets an error message for the VTable
|
|
33
|
-
* @param message The error message string
|
|
34
|
-
*/
|
|
35
|
-
protected setErrorMessage(message: string | undefined): void {
|
|
36
|
-
this.errorMessage = message;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Disconnects from this virtual table connection instance
|
|
41
|
-
* Called when the database connection closes or the statement is finalized
|
|
42
|
-
* @throws QuereusError on failure
|
|
43
|
-
*/
|
|
44
|
-
abstract disconnect(): Promise<void>;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* (Optional) Opens a direct data stream for this virtual table based on filter criteria.
|
|
48
|
-
* This is an alternative to the cursor-based open/filter/next model.
|
|
49
|
-
* @param filterInfo Information from getBestAccessPlan and query parameters.
|
|
50
|
-
* @returns An AsyncIterable yielding Row tuples.
|
|
51
|
-
* @throws QuereusError on failure
|
|
52
|
-
*/
|
|
53
|
-
query?(filterInfo: FilterInfo): AsyncIterable<Row>;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Executes a pushed-down plan subtree.
|
|
57
|
-
* Called when the module indicated support via supports() method.
|
|
58
|
-
*
|
|
59
|
-
* @param db The database connection
|
|
60
|
-
* @param plan The plan node to execute
|
|
61
|
-
* @param ctx Optional context from supports() assessment
|
|
62
|
-
* @returns Async iterable of rows resulting from the plan execution
|
|
63
|
-
*/
|
|
64
|
-
executePlan?(
|
|
65
|
-
db: Database,
|
|
66
|
-
plan: PlanNode,
|
|
67
|
-
ctx?: unknown
|
|
68
|
-
): AsyncIterable<Row>;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Performs an INSERT, UPDATE, or DELETE operation
|
|
72
|
-
* @param operation The operation to perform (insert, update, delete)
|
|
73
|
-
* @param values For INSERT/UPDATE, the values to insert/update. For DELETE, undefined
|
|
74
|
-
* @param oldKeyValues For UPDATE/DELETE, the old key values of the row to modify. Undefined for INSERT
|
|
75
|
-
* @param onConflict Conflict resolution mode (defaults to ABORT if unspecified)
|
|
76
|
-
* @returns new row for INSERT/UPDATE, undefined for DELETE
|
|
77
|
-
* @throws QuereusError or ConstraintError on failure
|
|
78
|
-
*/
|
|
79
|
-
abstract update(
|
|
80
|
-
operation: RowOp,
|
|
81
|
-
values: Row | undefined,
|
|
82
|
-
oldKeyValues?: Row,
|
|
83
|
-
onConflict?: ConflictResolution
|
|
84
|
-
): Promise<Row | undefined>;
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* (Optional) Creates a new connection for transaction support.
|
|
88
|
-
* If implemented, this enables proper transaction isolation for this table.
|
|
89
|
-
* @returns A new VirtualTableConnection instance
|
|
90
|
-
*/
|
|
91
|
-
createConnection?(): MaybePromise<VirtualTableConnection>;
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* (Optional) Gets the current connection for this table instance.
|
|
95
|
-
* Used when the table maintains a single connection internally.
|
|
96
|
-
* @returns The current VirtualTableConnection instance, if any
|
|
97
|
-
*/
|
|
98
|
-
getConnection?(): VirtualTableConnection | undefined;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Begins a transaction on this virtual table
|
|
102
|
-
*/
|
|
103
|
-
begin?(): Promise<void>;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Syncs changes within the virtual table transaction
|
|
107
|
-
*/
|
|
108
|
-
sync?(): Promise<void>;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Commits the virtual table transaction
|
|
112
|
-
*/
|
|
113
|
-
commit?(): Promise<void>;
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Rolls back the virtual table transaction
|
|
117
|
-
*/
|
|
118
|
-
rollback?(): Promise<void>;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Renames the virtual table
|
|
122
|
-
* @param newName The new name for the table
|
|
123
|
-
*/
|
|
124
|
-
rename?(newName: string): Promise<void>;
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Begins a savepoint
|
|
128
|
-
* @param savepointIndex The savepoint identifier
|
|
129
|
-
*/
|
|
130
|
-
savepoint?(savepointIndex: number): Promise<void>;
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Releases a savepoint
|
|
134
|
-
* @param savepointIndex The savepoint identifier
|
|
135
|
-
*/
|
|
136
|
-
release?(savepointIndex: number): Promise<void>;
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Rolls back to a savepoint
|
|
140
|
-
* @param savepointIndex The savepoint identifier
|
|
141
|
-
*/
|
|
142
|
-
rollbackTo?(savepointIndex: number): Promise<void>;
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Modifies the schema of this virtual table
|
|
146
|
-
* @param changeInfo Object describing the schema modification
|
|
147
|
-
* @throws QuereusError or ConstraintError on failure
|
|
148
|
-
*/
|
|
149
|
-
alterSchema?(changeInfo: SchemaChangeInfo): Promise<void>;
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Creates a secondary index on the virtual table
|
|
153
|
-
* @param indexInfo The index definition
|
|
154
|
-
*/
|
|
155
|
-
createIndex?(indexInfo: IndexSchema): Promise<void>;
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Drops a secondary index from the virtual table
|
|
159
|
-
* @param indexName The name of the index to drop
|
|
160
|
-
*/
|
|
161
|
-
dropIndex?(indexName: string): Promise<void>;
|
|
162
|
-
}
|
|
1
|
+
import type { AnyVirtualTableModule, SchemaChangeInfo } from './module.js';
|
|
2
|
+
import type { Database } from '../core/database.js';
|
|
3
|
+
import type { TableSchema } from '../schema/table.js';
|
|
4
|
+
import type { MaybePromise, Row } from '../common/types.js';
|
|
5
|
+
import type { IndexSchema } from '../schema/table.js';
|
|
6
|
+
import type { FilterInfo } from './filter-info.js';
|
|
7
|
+
import type { RowOp } from '../common/types.js';
|
|
8
|
+
import type { ConflictResolution } from '../common/constants.js';
|
|
9
|
+
import type { VirtualTableConnection } from './connection.js';
|
|
10
|
+
import type { PlanNode } from '../planner/nodes/plan-node.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Base class representing a virtual table instance.
|
|
14
|
+
* Module implementations should subclass this to provide specific table behavior.
|
|
15
|
+
*/
|
|
16
|
+
export abstract class VirtualTable {
|
|
17
|
+
public readonly module: AnyVirtualTableModule;
|
|
18
|
+
public readonly db: Database;
|
|
19
|
+
public readonly tableName: string;
|
|
20
|
+
public readonly schemaName: string;
|
|
21
|
+
public errorMessage?: string;
|
|
22
|
+
public tableSchema?: TableSchema;
|
|
23
|
+
|
|
24
|
+
constructor(db: Database, module: AnyVirtualTableModule, schemaName: string, tableName: string) {
|
|
25
|
+
this.db = db;
|
|
26
|
+
this.module = module;
|
|
27
|
+
this.schemaName = schemaName;
|
|
28
|
+
this.tableName = tableName;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Sets an error message for the VTable
|
|
33
|
+
* @param message The error message string
|
|
34
|
+
*/
|
|
35
|
+
protected setErrorMessage(message: string | undefined): void {
|
|
36
|
+
this.errorMessage = message;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Disconnects from this virtual table connection instance
|
|
41
|
+
* Called when the database connection closes or the statement is finalized
|
|
42
|
+
* @throws QuereusError on failure
|
|
43
|
+
*/
|
|
44
|
+
abstract disconnect(): Promise<void>;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* (Optional) Opens a direct data stream for this virtual table based on filter criteria.
|
|
48
|
+
* This is an alternative to the cursor-based open/filter/next model.
|
|
49
|
+
* @param filterInfo Information from getBestAccessPlan and query parameters.
|
|
50
|
+
* @returns An AsyncIterable yielding Row tuples.
|
|
51
|
+
* @throws QuereusError on failure
|
|
52
|
+
*/
|
|
53
|
+
query?(filterInfo: FilterInfo): AsyncIterable<Row>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Executes a pushed-down plan subtree.
|
|
57
|
+
* Called when the module indicated support via supports() method.
|
|
58
|
+
*
|
|
59
|
+
* @param db The database connection
|
|
60
|
+
* @param plan The plan node to execute
|
|
61
|
+
* @param ctx Optional context from supports() assessment
|
|
62
|
+
* @returns Async iterable of rows resulting from the plan execution
|
|
63
|
+
*/
|
|
64
|
+
executePlan?(
|
|
65
|
+
db: Database,
|
|
66
|
+
plan: PlanNode,
|
|
67
|
+
ctx?: unknown
|
|
68
|
+
): AsyncIterable<Row>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Performs an INSERT, UPDATE, or DELETE operation
|
|
72
|
+
* @param operation The operation to perform (insert, update, delete)
|
|
73
|
+
* @param values For INSERT/UPDATE, the values to insert/update. For DELETE, undefined
|
|
74
|
+
* @param oldKeyValues For UPDATE/DELETE, the old key values of the row to modify. Undefined for INSERT
|
|
75
|
+
* @param onConflict Conflict resolution mode (defaults to ABORT if unspecified)
|
|
76
|
+
* @returns new row for INSERT/UPDATE, undefined for DELETE
|
|
77
|
+
* @throws QuereusError or ConstraintError on failure
|
|
78
|
+
*/
|
|
79
|
+
abstract update(
|
|
80
|
+
operation: RowOp,
|
|
81
|
+
values: Row | undefined,
|
|
82
|
+
oldKeyValues?: Row,
|
|
83
|
+
onConflict?: ConflictResolution
|
|
84
|
+
): Promise<Row | undefined>;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* (Optional) Creates a new connection for transaction support.
|
|
88
|
+
* If implemented, this enables proper transaction isolation for this table.
|
|
89
|
+
* @returns A new VirtualTableConnection instance
|
|
90
|
+
*/
|
|
91
|
+
createConnection?(): MaybePromise<VirtualTableConnection>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* (Optional) Gets the current connection for this table instance.
|
|
95
|
+
* Used when the table maintains a single connection internally.
|
|
96
|
+
* @returns The current VirtualTableConnection instance, if any
|
|
97
|
+
*/
|
|
98
|
+
getConnection?(): VirtualTableConnection | undefined;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Begins a transaction on this virtual table
|
|
102
|
+
*/
|
|
103
|
+
begin?(): Promise<void>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Syncs changes within the virtual table transaction
|
|
107
|
+
*/
|
|
108
|
+
sync?(): Promise<void>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Commits the virtual table transaction
|
|
112
|
+
*/
|
|
113
|
+
commit?(): Promise<void>;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Rolls back the virtual table transaction
|
|
117
|
+
*/
|
|
118
|
+
rollback?(): Promise<void>;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Renames the virtual table
|
|
122
|
+
* @param newName The new name for the table
|
|
123
|
+
*/
|
|
124
|
+
rename?(newName: string): Promise<void>;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Begins a savepoint
|
|
128
|
+
* @param savepointIndex The savepoint identifier
|
|
129
|
+
*/
|
|
130
|
+
savepoint?(savepointIndex: number): Promise<void>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Releases a savepoint
|
|
134
|
+
* @param savepointIndex The savepoint identifier
|
|
135
|
+
*/
|
|
136
|
+
release?(savepointIndex: number): Promise<void>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Rolls back to a savepoint
|
|
140
|
+
* @param savepointIndex The savepoint identifier
|
|
141
|
+
*/
|
|
142
|
+
rollbackTo?(savepointIndex: number): Promise<void>;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Modifies the schema of this virtual table
|
|
146
|
+
* @param changeInfo Object describing the schema modification
|
|
147
|
+
* @throws QuereusError or ConstraintError on failure
|
|
148
|
+
*/
|
|
149
|
+
alterSchema?(changeInfo: SchemaChangeInfo): Promise<void>;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Creates a secondary index on the virtual table
|
|
153
|
+
* @param indexInfo The index definition
|
|
154
|
+
*/
|
|
155
|
+
createIndex?(indexInfo: IndexSchema): Promise<void>;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Drops a secondary index from the virtual table
|
|
159
|
+
* @param indexName The name of the index to drop
|
|
160
|
+
*/
|
|
161
|
+
dropIndex?(indexName: string): Promise<void>;
|
|
162
|
+
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration loader for Quoomb
|
|
3
|
-
* Handles loading, parsing, and interpolating quoomb.config.json files
|
|
4
|
-
*/
|
|
5
|
-
import type { Database } from '../core/database.js';
|
|
6
|
-
/**
|
|
7
|
-
* Plugin configuration from config file
|
|
8
|
-
*/
|
|
9
|
-
export interface PluginConfig {
|
|
10
|
-
source: string;
|
|
11
|
-
config?: Record<string, any>;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Quoomb configuration file format
|
|
15
|
-
*/
|
|
16
|
-
export interface QuoombConfig {
|
|
17
|
-
$schema?: string;
|
|
18
|
-
plugins?: PluginConfig[];
|
|
19
|
-
autoload?: boolean;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Interpolate environment variables in a value
|
|
23
|
-
* Supports ${VAR_NAME} and ${VAR_NAME:-default} syntax
|
|
24
|
-
*/
|
|
25
|
-
export declare function interpolateEnvVars(value: any, env?: Record<string, string>): any;
|
|
26
|
-
/**
|
|
27
|
-
* Interpolate environment variables in a config object
|
|
28
|
-
*/
|
|
29
|
-
export declare function interpolateConfigEnvVars(config: QuoombConfig, env?: Record<string, string>): QuoombConfig;
|
|
30
|
-
/**
|
|
31
|
-
* Load plugins from a config object
|
|
32
|
-
*/
|
|
33
|
-
export declare function loadPluginsFromConfig(db: Database, config: QuoombConfig, options?: {
|
|
34
|
-
allowCdn?: boolean;
|
|
35
|
-
env?: 'auto' | 'browser' | 'node';
|
|
36
|
-
}): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Validate a config object
|
|
39
|
-
*/
|
|
40
|
-
export declare function validateConfig(config: any): config is QuoombConfig;
|
|
41
|
-
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,GAAG,CAkBpF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAazG;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,YAAY,CA2BlE"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration loader for Quoomb
|
|
3
|
-
* Handles loading, parsing, and interpolating quoomb.config.json files
|
|
4
|
-
*/
|
|
5
|
-
import { loadPlugin } from '../util/plugin-loader.js';
|
|
6
|
-
/**
|
|
7
|
-
* Interpolate environment variables in a value
|
|
8
|
-
* Supports ${VAR_NAME} and ${VAR_NAME:-default} syntax
|
|
9
|
-
*/
|
|
10
|
-
export function interpolateEnvVars(value, env = {}) {
|
|
11
|
-
if (typeof value === 'string') {
|
|
12
|
-
return value.replace(/\$\{([^}]+)\}/g, (match, varSpec) => {
|
|
13
|
-
const [varName, defaultValue] = varSpec.split(':-');
|
|
14
|
-
return env[varName.trim()] ?? defaultValue ?? match;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
if (typeof value === 'object' && value !== null) {
|
|
18
|
-
if (Array.isArray(value)) {
|
|
19
|
-
return value.map(v => interpolateEnvVars(v, env));
|
|
20
|
-
}
|
|
21
|
-
const result = {};
|
|
22
|
-
for (const [key, val] of Object.entries(value)) {
|
|
23
|
-
result[key] = interpolateEnvVars(val, env);
|
|
24
|
-
}
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Interpolate environment variables in a config object
|
|
31
|
-
*/
|
|
32
|
-
export function interpolateConfigEnvVars(config, env) {
|
|
33
|
-
let envVars = {};
|
|
34
|
-
if (env) {
|
|
35
|
-
envVars = env;
|
|
36
|
-
}
|
|
37
|
-
else if (typeof process !== 'undefined' && process.env) {
|
|
38
|
-
// Filter out undefined values from process.env
|
|
39
|
-
envVars = Object.fromEntries(Object.entries(process.env).filter(([, v]) => v !== undefined));
|
|
40
|
-
}
|
|
41
|
-
return interpolateEnvVars(config, envVars);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Load plugins from a config object
|
|
45
|
-
*/
|
|
46
|
-
export async function loadPluginsFromConfig(db, config, options) {
|
|
47
|
-
if (!config.plugins || config.plugins.length === 0) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
for (const pluginConfig of config.plugins) {
|
|
51
|
-
try {
|
|
52
|
-
const configObj = pluginConfig.config ?? {};
|
|
53
|
-
// Convert config values to SqlValue type
|
|
54
|
-
const sqlConfig = {};
|
|
55
|
-
for (const [key, value] of Object.entries(configObj)) {
|
|
56
|
-
if (value === null || value === undefined) {
|
|
57
|
-
sqlConfig[key] = null;
|
|
58
|
-
}
|
|
59
|
-
else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
60
|
-
sqlConfig[key] = value;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
// For complex types, convert to JSON string
|
|
64
|
-
sqlConfig[key] = JSON.stringify(value);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
await loadPlugin(pluginConfig.source, db, sqlConfig, options);
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
console.warn(`Warning: Failed to load plugin from ${pluginConfig.source}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Validate a config object
|
|
76
|
-
*/
|
|
77
|
-
export function validateConfig(config) {
|
|
78
|
-
if (typeof config !== 'object' || config === null) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
if (config.plugins !== undefined) {
|
|
82
|
-
if (!Array.isArray(config.plugins)) {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
for (const plugin of config.plugins) {
|
|
86
|
-
if (typeof plugin !== 'object' || plugin === null) {
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
if (typeof plugin.source !== 'string') {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
if (plugin.config !== undefined && typeof plugin.config !== 'object') {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (config.autoload !== undefined && typeof config.autoload !== 'boolean') {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Physical table access nodes for seek and range scan operations
|
|
3
|
-
* These replace logical TableScanNode during optimization
|
|
4
|
-
*/
|
|
5
|
-
import { PlanNodeType } from './plan-node-type.js';
|
|
6
|
-
import { PlanNode, type UnaryRelationalNode, type PhysicalProperties, type Attribute } from './plan-node.js';
|
|
7
|
-
import { TableReferenceNode } from './reference.js';
|
|
8
|
-
import type { RelationType } from '../../common/datatype.js';
|
|
9
|
-
import type { Scope } from '../scopes/scope.js';
|
|
10
|
-
import type { FilterInfo } from '../../vtab/filter-info.js';
|
|
11
|
-
import type { ScalarPlanNode } from './plan-node.js';
|
|
12
|
-
/**
|
|
13
|
-
* Base class for physical table access operations
|
|
14
|
-
* Provides common functionality for sequential scan, index scan, and index seek
|
|
15
|
-
*/
|
|
16
|
-
export declare abstract class PhysicalTableAccessNode extends PlanNode implements UnaryRelationalNode {
|
|
17
|
-
readonly source: TableReferenceNode;
|
|
18
|
-
readonly filterInfo: FilterInfo;
|
|
19
|
-
private attributesCache;
|
|
20
|
-
private outputType;
|
|
21
|
-
constructor(scope: Scope, source: TableReferenceNode, filterInfo: FilterInfo, estimatedCostOverride?: number);
|
|
22
|
-
getAttributes(): Attribute[];
|
|
23
|
-
getType(): RelationType;
|
|
24
|
-
getChildren(): readonly PlanNode[];
|
|
25
|
-
getRelations(): readonly [TableReferenceNode];
|
|
26
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode;
|
|
27
|
-
getLogicalAttributes(): Record<string, unknown>;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Sequential scan - reads entire table without using indexes
|
|
31
|
-
* Used when no suitable index exists or for small tables
|
|
32
|
-
*/
|
|
33
|
-
export declare class SeqScanNode extends PhysicalTableAccessNode {
|
|
34
|
-
readonly nodeType = PlanNodeType.SeqScan;
|
|
35
|
-
computePhysical(): Partial<PhysicalProperties>;
|
|
36
|
-
toString(): string;
|
|
37
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Index scan - uses an index to read table data in order
|
|
41
|
-
* Provides ordering and can handle range queries efficiently
|
|
42
|
-
*/
|
|
43
|
-
export declare class IndexScanNode extends PhysicalTableAccessNode {
|
|
44
|
-
readonly indexName: string;
|
|
45
|
-
readonly providesOrdering?: {
|
|
46
|
-
column: number;
|
|
47
|
-
desc: boolean;
|
|
48
|
-
}[] | undefined;
|
|
49
|
-
readonly nodeType = PlanNodeType.IndexScan;
|
|
50
|
-
constructor(scope: Scope, source: TableReferenceNode, filterInfo: FilterInfo, indexName: string, providesOrdering?: {
|
|
51
|
-
column: number;
|
|
52
|
-
desc: boolean;
|
|
53
|
-
}[] | undefined, estimatedCostOverride?: number);
|
|
54
|
-
computePhysical(): Partial<PhysicalProperties>;
|
|
55
|
-
toString(): string;
|
|
56
|
-
getLogicalAttributes(): Record<string, unknown>;
|
|
57
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Index seek - point lookup or tight range using an index
|
|
61
|
-
* Very efficient for equality constraints and small ranges
|
|
62
|
-
*/
|
|
63
|
-
export declare class IndexSeekNode extends PhysicalTableAccessNode {
|
|
64
|
-
readonly indexName: string;
|
|
65
|
-
readonly seekKeys: ScalarPlanNode[];
|
|
66
|
-
readonly isRange: boolean;
|
|
67
|
-
readonly providesOrdering?: {
|
|
68
|
-
column: number;
|
|
69
|
-
desc: boolean;
|
|
70
|
-
}[] | undefined;
|
|
71
|
-
readonly nodeType = PlanNodeType.IndexSeek;
|
|
72
|
-
constructor(scope: Scope, source: TableReferenceNode, filterInfo: FilterInfo, indexName: string, seekKeys: ScalarPlanNode[], isRange?: boolean, providesOrdering?: {
|
|
73
|
-
column: number;
|
|
74
|
-
desc: boolean;
|
|
75
|
-
}[] | undefined, estimatedCostOverride?: number);
|
|
76
|
-
computePhysical(): Partial<PhysicalProperties>;
|
|
77
|
-
toString(): string;
|
|
78
|
-
getLogicalAttributes(): Record<string, unknown>;
|
|
79
|
-
getSeekKeys(): readonly ScalarPlanNode[];
|
|
80
|
-
getChildren(): readonly PlanNode[];
|
|
81
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode;
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=physical-access-nodes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"physical-access-nodes.d.ts","sourceRoot":"","sources":["../../../../src/planner/nodes/physical-access-nodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;GAGG;AACH,8BAAsB,uBAAwB,SAAQ,QAAS,YAAW,mBAAmB;aAM3E,MAAM,EAAE,kBAAkB;aAC1B,UAAU,EAAE,UAAU;IANvC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAuB;gBAGxC,KAAK,EAAE,KAAK,EACI,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,EACtC,qBAAqB,CAAC,EAAE,MAAM;IAQ/B,aAAa,IAAI,SAAS,EAAE;IAI5B,OAAO,IAAI,YAAY;IAIvB,WAAW,IAAI,SAAS,QAAQ,EAAE;IAIlC,YAAY,IAAI,SAAS,CAAC,kBAAkB,CAAC;IAI7C,YAAY,CAAC,WAAW,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ;IAqB/C,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAaxD;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,uBAAuB;IACvD,SAAkB,QAAQ,wBAAwB;IAElD,eAAe,IAAI,OAAO,CAAC,kBAAkB,CAAC;IASrC,QAAQ,IAAI,MAAM;IAIlB,YAAY,CAAC,WAAW,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ;CAwBjE;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,uBAAuB;aAOxC,SAAS,EAAE,MAAM;aACjB,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE;IAPvE,SAAkB,QAAQ,0BAA0B;gBAGnD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,EACN,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,YAAA,EACtE,qBAAqB,CAAC,EAAE,MAAM;IAK/B,eAAe,IAAI,OAAO,CAAC,kBAAkB,CAAC;IASrC,QAAQ,IAAI,MAAM;IAOlB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ/C,YAAY,CAAC,WAAW,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ;CA0BjE;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,uBAAuB;aAOxC,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,cAAc,EAAE;aAC1B,OAAO,EAAE,OAAO;aAChB,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE;IATvE,SAAkB,QAAQ,0BAA0B;gBAGnD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,EACN,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,GAAE,OAAe,EACxB,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,YAAA,EACtE,qBAAqB,CAAC,EAAE,MAAM;IAK/B,eAAe,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAUrC,QAAQ,IAAI,MAAM;IAQlB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUxD,WAAW,IAAI,SAAS,cAAc,EAAE;IAI/B,WAAW,IAAI,SAAS,QAAQ,EAAE;IAIlC,YAAY,CAAC,WAAW,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ;CAuCjE"}
|