@docstack/client 0.0.1
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 +214 -0
- package/lib/core/attribute.d.ts +174 -0
- package/lib/core/attribute.js +296 -0
- package/lib/core/attribute.js.map +1 -0
- package/lib/core/class.d.ts +340 -0
- package/lib/core/class.js +540 -0
- package/lib/core/class.js.map +1 -0
- package/lib/core/crypto-engine/index.d.ts +121 -0
- package/lib/core/crypto-engine/index.js +130 -0
- package/lib/core/crypto-engine/index.js.map +1 -0
- package/lib/core/crypto-engine/utils.d.ts +20 -0
- package/lib/core/crypto-engine/utils.js +76 -0
- package/lib/core/crypto-engine/utils.js.map +1 -0
- package/lib/core/datamodel/index.d.ts +3 -0
- package/lib/core/datamodel/index.js +1186 -0
- package/lib/core/datamodel/index.js.map +1 -0
- package/lib/core/domain.d.ts +200 -0
- package/lib/core/domain.js +285 -0
- package/lib/core/domain.js.map +1 -0
- package/lib/core/index.d.ts +176 -0
- package/lib/core/index.js +379 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/job-engine/index.d.ts +110 -0
- package/lib/core/job-engine/index.js +116 -0
- package/lib/core/job-engine/index.js.map +1 -0
- package/lib/core/policy-engine/index.d.ts +97 -0
- package/lib/core/policy-engine/index.js +150 -0
- package/lib/core/policy-engine/index.js.map +1 -0
- package/lib/core/query-engine/accumulators.d.ts +9 -0
- package/lib/core/query-engine/accumulators.js +258 -0
- package/lib/core/query-engine/accumulators.js.map +1 -0
- package/lib/core/query-engine/evaluator.d.ts +37 -0
- package/lib/core/query-engine/evaluator.js +179 -0
- package/lib/core/query-engine/evaluator.js.map +1 -0
- package/lib/core/query-engine/executor.d.ts +14 -0
- package/lib/core/query-engine/executor.js +405 -0
- package/lib/core/query-engine/executor.js.map +1 -0
- package/lib/core/query-engine/index.d.ts +4 -0
- package/lib/core/query-engine/index.js +4 -0
- package/lib/core/query-engine/index.js.map +1 -0
- package/lib/core/query-engine/parser.d.ts +10 -0
- package/lib/core/query-engine/parser.js +515 -0
- package/lib/core/query-engine/parser.js.map +1 -0
- package/lib/core/query-engine/planner.d.ts +27 -0
- package/lib/core/query-engine/planner.js +330 -0
- package/lib/core/query-engine/planner.js.map +1 -0
- package/lib/core/stack.d.ts +497 -0
- package/lib/core/stack.js +1507 -0
- package/lib/core/stack.js.map +1 -0
- package/lib/core/test-utils/docstack.d.ts +29 -0
- package/lib/core/test-utils/docstack.js +222 -0
- package/lib/core/test-utils/docstack.js.map +1 -0
- package/lib/core/trigger/index.d.ts +31 -0
- package/lib/core/trigger/index.js +81 -0
- package/lib/core/trigger/index.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +8237 -0
- package/lib/index.js.map +1 -0
- package/lib/plugins/pouchdb.d.ts +9 -0
- package/lib/plugins/pouchdb.js +403 -0
- package/lib/plugins/pouchdb.js.map +1 -0
- package/lib/utils/crypto/index.d.ts +3 -0
- package/lib/utils/crypto/index.js +34 -0
- package/lib/utils/crypto/index.js.map +1 -0
- package/lib/utils/index.d.ts +4 -0
- package/lib/utils/index.js +58 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/logger/index.d.ts +4 -0
- package/lib/utils/logger/index.js +20 -0
- package/lib/utils/logger/index.js.map +1 -0
- package/lib/utils/logger/transport.d.ts +11 -0
- package/lib/utils/logger/transport.js +28 -0
- package/lib/utils/logger/transport.js.map +1 -0
- package/lib/workers/dataModel.d.ts +1 -0
- package/lib/workers/dataModel.js +48 -0
- package/lib/workers/dataModel.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Traverses an expression AST to find all referenced table aliases.
|
|
4
|
+
* @param {object} expr The expression AST node.
|
|
5
|
+
* @param {Set<string>} refs A set to accumulate the found table aliases.
|
|
6
|
+
*/
|
|
7
|
+
function findExpressionRefs(expr, refs) {
|
|
8
|
+
if (!expr)
|
|
9
|
+
return;
|
|
10
|
+
if (expr.type === 'column_ref' && expr.table) {
|
|
11
|
+
refs.add(expr.table);
|
|
12
|
+
}
|
|
13
|
+
if (expr.left)
|
|
14
|
+
findExpressionRefs(expr.left, refs);
|
|
15
|
+
if (expr.right)
|
|
16
|
+
findExpressionRefs(expr.right, refs);
|
|
17
|
+
if (expr.expr)
|
|
18
|
+
findExpressionRefs(expr.expr, refs);
|
|
19
|
+
if (expr.args && expr.args.expr)
|
|
20
|
+
findExpressionRefs(expr.args.expr, refs);
|
|
21
|
+
if (Array.isArray(expr.exprs))
|
|
22
|
+
expr.exprs.forEach(e => findExpressionRefs(e, refs));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Analyzes a subquery to find its correlation with the outer query.
|
|
26
|
+
* @param {object} subqueryAst The AST of the subquery.
|
|
27
|
+
* @param {Set<string>} outerTableAliases A set of table aliases available in the outer query scope.
|
|
28
|
+
* @returns {object|null} Correlation details if found, otherwise null.
|
|
29
|
+
*/
|
|
30
|
+
function findCorrelation(subqueryAst, outerTableAliases) {
|
|
31
|
+
const correlations = [];
|
|
32
|
+
const subqueryTableAliases = new Set([
|
|
33
|
+
...subqueryAst.from.map(f => f.as),
|
|
34
|
+
...subqueryAst.joins.map(j => j.as)
|
|
35
|
+
]);
|
|
36
|
+
// Traverse the subquery's WHERE clause to find predicates linking inner and outer tables.
|
|
37
|
+
function traverse(predicate) {
|
|
38
|
+
if (!predicate)
|
|
39
|
+
return;
|
|
40
|
+
if (predicate.type === 'binary_expr') {
|
|
41
|
+
const leftRefs = new Set();
|
|
42
|
+
findExpressionRefs(predicate.left, leftRefs);
|
|
43
|
+
const rightRefs = new Set();
|
|
44
|
+
findExpressionRefs(predicate.right, rightRefs);
|
|
45
|
+
const leftIsOuter = [...leftRefs].some(r => outerTableAliases.has(r));
|
|
46
|
+
const leftIsInner = [...leftRefs].some(r => subqueryTableAliases.has(r));
|
|
47
|
+
const rightIsOuter = [...rightRefs].some(r => outerTableAliases.has(r));
|
|
48
|
+
const rightIsInner = [...rightRefs].some(r => subqueryTableAliases.has(r));
|
|
49
|
+
// A correlation predicate connects one inner and one outer table.
|
|
50
|
+
if ((leftIsInner && rightIsOuter) || (leftIsOuter && rightIsInner)) {
|
|
51
|
+
correlations.push(predicate);
|
|
52
|
+
return; // This predicate is a correlation, don't look deeper
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (predicate.left)
|
|
56
|
+
traverse(predicate.left);
|
|
57
|
+
if (predicate.right)
|
|
58
|
+
traverse(predicate.right);
|
|
59
|
+
}
|
|
60
|
+
traverse(subqueryAst.where);
|
|
61
|
+
if (correlations.length > 0) {
|
|
62
|
+
// Remove correlation predicates from the subquery's own WHERE clause.
|
|
63
|
+
const originalWhere = subqueryAst.where;
|
|
64
|
+
const correlationSet = new Set(correlations);
|
|
65
|
+
function filterWhere(predicate) {
|
|
66
|
+
if (!predicate || correlationSet.has(predicate))
|
|
67
|
+
return null;
|
|
68
|
+
if (predicate.type === 'and') {
|
|
69
|
+
const newLeft = filterWhere(predicate.left);
|
|
70
|
+
const newRight = filterWhere(predicate.right);
|
|
71
|
+
if (newLeft && newRight)
|
|
72
|
+
return Object.assign(Object.assign({}, predicate), { left: newLeft, right: newRight });
|
|
73
|
+
return newLeft || newRight;
|
|
74
|
+
}
|
|
75
|
+
return predicate;
|
|
76
|
+
}
|
|
77
|
+
subqueryAst.where = filterWhere(originalWhere);
|
|
78
|
+
return { predicates: correlations };
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pre-processes an AST to find and rewrite correlated subqueries into joins.
|
|
84
|
+
* @param {object} ast The main query AST.
|
|
85
|
+
* @returns {object} The transformed AST.
|
|
86
|
+
*/
|
|
87
|
+
function decorrelateSubqueries(ast) {
|
|
88
|
+
if (!ast.where)
|
|
89
|
+
return ast;
|
|
90
|
+
const outerTableAliases = new Set([
|
|
91
|
+
...ast.from.map(f => f.as),
|
|
92
|
+
...ast.joins.map(j => j.as)
|
|
93
|
+
]);
|
|
94
|
+
// This function will be called recursively to traverse the WHERE clause tree.
|
|
95
|
+
function transformPredicate(predicate) {
|
|
96
|
+
if (!predicate)
|
|
97
|
+
return null;
|
|
98
|
+
if (predicate.type === 'exists_expr') {
|
|
99
|
+
const correlation = findCorrelation(predicate.subquery, outerTableAliases);
|
|
100
|
+
if (correlation) {
|
|
101
|
+
// De-correlate! Rewrite the EXISTS subquery into a SEMI or ANTI join.
|
|
102
|
+
if (correlation.predicates.length === 0) {
|
|
103
|
+
throw new Error('Found correlated subquery but could not extract correlation predicate.');
|
|
104
|
+
}
|
|
105
|
+
// For simplicity, we assume the first correlation predicate is the join condition.
|
|
106
|
+
// A real engine would handle multiple predicates.
|
|
107
|
+
const joinCondition = correlation.predicates[0];
|
|
108
|
+
ast.joins.push({
|
|
109
|
+
type: predicate.not ? 'ANTI' : 'SEMI',
|
|
110
|
+
// The "table" is the subquery itself. We'll flatten its FROM/JOINs.
|
|
111
|
+
// This is a simplification; a real planner would create a sub-plan.
|
|
112
|
+
table: predicate.subquery.from[0].table,
|
|
113
|
+
as: predicate.subquery.from[0].as,
|
|
114
|
+
on: joinCondition,
|
|
115
|
+
// The subquery's own filters become part of the join operation.
|
|
116
|
+
filters: predicate.subquery.where ? [predicate.subquery.where] : [],
|
|
117
|
+
});
|
|
118
|
+
// Since we've transformed this predicate into a join, we remove it from the WHERE clause.
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// If not correlated, it can be executed once. For now, we leave it as is.
|
|
122
|
+
return predicate;
|
|
123
|
+
}
|
|
124
|
+
// Recurse for AND/OR conditions
|
|
125
|
+
if (predicate.left)
|
|
126
|
+
predicate.left = transformPredicate(predicate.left);
|
|
127
|
+
if (predicate.right)
|
|
128
|
+
predicate.right = transformPredicate(predicate.right);
|
|
129
|
+
// Filter out parts that were transformed (returned null)
|
|
130
|
+
if (predicate.type === 'and') {
|
|
131
|
+
if (!predicate.left)
|
|
132
|
+
return predicate.right;
|
|
133
|
+
if (!predicate.right)
|
|
134
|
+
return predicate.left;
|
|
135
|
+
}
|
|
136
|
+
return predicate;
|
|
137
|
+
}
|
|
138
|
+
ast.where = transformPredicate(ast.where);
|
|
139
|
+
return ast;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Analyzes an expression from the AST to determine which tables it references.
|
|
143
|
+
* @param {object} expr The AST expression node.
|
|
144
|
+
* @param {Array<object>} from The list of tables in the FROM clause.
|
|
145
|
+
* @param {Array<object>} joins The list of tables in JOIN clauses.
|
|
146
|
+
* @returns {Array<string>} A list of table names referenced in the expression.
|
|
147
|
+
*/
|
|
148
|
+
function getReferencedTables(expr, from, joins) {
|
|
149
|
+
const tables = new Set();
|
|
150
|
+
if (!expr)
|
|
151
|
+
return [];
|
|
152
|
+
const allTables = [...from, ...joins.map(j => ({ table: j.table, as: j.as }))];
|
|
153
|
+
function traverse(node) {
|
|
154
|
+
if (!node)
|
|
155
|
+
return;
|
|
156
|
+
if (node.type === 'column_ref' && node.table) {
|
|
157
|
+
const tableInfo = allTables.find(t => t.as === node.table);
|
|
158
|
+
if (tableInfo) {
|
|
159
|
+
tables.add(tableInfo.table);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (node.left)
|
|
163
|
+
traverse(node.left);
|
|
164
|
+
if (node.right)
|
|
165
|
+
traverse(node.right);
|
|
166
|
+
if (node.expr)
|
|
167
|
+
traverse(node.expr);
|
|
168
|
+
}
|
|
169
|
+
traverse(expr);
|
|
170
|
+
return Array.from(tables);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Checks if a predicate is a simple binary expression that can be converted
|
|
174
|
+
* directly into a Mango selector by `buildSelector`.
|
|
175
|
+
* @param {object} predicate The predicate AST node.
|
|
176
|
+
* @returns {boolean} True if the predicate is simple enough for pushdown.
|
|
177
|
+
*/
|
|
178
|
+
function isSimplePredicate(predicate) {
|
|
179
|
+
if (predicate && predicate.type === 'binary_expr' &&
|
|
180
|
+
predicate.left && predicate.left.type === 'column_ref' &&
|
|
181
|
+
predicate.right && predicate.right.type === 'param') {
|
|
182
|
+
// Check for operators supported by buildSelector
|
|
183
|
+
const supportedOps = ['=', '>', '<', '>=', '<='];
|
|
184
|
+
return supportedOps.includes(predicate.operator);
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
function createSingleSelectPlan(ast) {
|
|
189
|
+
// Before creating the plan, run the de-correlation pass.
|
|
190
|
+
ast = decorrelateSubqueries(ast);
|
|
191
|
+
const plan = {
|
|
192
|
+
type: 'select',
|
|
193
|
+
distinct: ast.distinct,
|
|
194
|
+
distinctOn: ast.distinctOn,
|
|
195
|
+
fromTable: ast.from[0],
|
|
196
|
+
joins: [],
|
|
197
|
+
filters: {
|
|
198
|
+
left: [],
|
|
199
|
+
right: {},
|
|
200
|
+
residual: []
|
|
201
|
+
},
|
|
202
|
+
projections: ast.columns,
|
|
203
|
+
aggregation: null,
|
|
204
|
+
orderBy: ast.orderBy,
|
|
205
|
+
limit: ast.limit,
|
|
206
|
+
};
|
|
207
|
+
const fromTableName = ast.from[0].table;
|
|
208
|
+
// Classify join predicates
|
|
209
|
+
for (const join of ast.joins) {
|
|
210
|
+
plan.joins.push(Object.assign(Object.assign({}, join), { filters: join.filters || [] }));
|
|
211
|
+
}
|
|
212
|
+
// Unpack AND clauses into a flat list of predicates.
|
|
213
|
+
const wherePredicates = [];
|
|
214
|
+
function collectPredicates(p) {
|
|
215
|
+
if (!p)
|
|
216
|
+
return;
|
|
217
|
+
if (p.type === 'and') {
|
|
218
|
+
collectPredicates(p.left);
|
|
219
|
+
collectPredicates(p.right);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
wherePredicates.push(p);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
collectPredicates(ast.where);
|
|
226
|
+
// Classify WHERE predicates
|
|
227
|
+
for (const predicate of wherePredicates) {
|
|
228
|
+
// Only simple predicates (e.g., col > literal) can be pushed down.
|
|
229
|
+
// Complex predicates involving subqueries or functions become residual.
|
|
230
|
+
const isSimple = isSimplePredicate(predicate);
|
|
231
|
+
const referenced = getReferencedTables(predicate, ast.from, ast.joins);
|
|
232
|
+
if (isSimple && referenced.length === 1 && referenced[0] === fromTableName) {
|
|
233
|
+
plan.filters.left.push(predicate);
|
|
234
|
+
}
|
|
235
|
+
else if (isSimple && referenced.length === 1 && plan.joins.some(j => j.table === referenced[0])) {
|
|
236
|
+
const join = plan.joins.find(j => j.table === referenced[0]);
|
|
237
|
+
if (!plan.filters.right[join.table])
|
|
238
|
+
plan.filters.right[join.table] = [];
|
|
239
|
+
plan.filters.right[join.table].push(predicate);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
plan.filters.residual.push(predicate);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Setup aggregation
|
|
246
|
+
const hasAggregates = ast.columns.some(c => c.expr.type === 'aggr_func');
|
|
247
|
+
if (hasAggregates || ast.groupBy || ast.having) {
|
|
248
|
+
// Semantic Validation for GROUP BY and aggregate functions
|
|
249
|
+
if (ast.groupBy || hasAggregates) {
|
|
250
|
+
const groupByCols = new Set(ast.groupBy ? ast.groupBy.columns.map(c => c.column) : []);
|
|
251
|
+
for (const p of ast.columns) {
|
|
252
|
+
if (p.expr.type !== 'aggr_func') {
|
|
253
|
+
// This is a regular column projection
|
|
254
|
+
const colName = p.as || p.expr.column;
|
|
255
|
+
if (!ast.groupBy) {
|
|
256
|
+
throw new Error(`Column '${colName}' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.`);
|
|
257
|
+
}
|
|
258
|
+
if (!groupByCols.has(p.expr.column)) {
|
|
259
|
+
throw new Error(`Column '${colName}' must appear in the GROUP BY clause or be used in an aggregate function.`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
plan.aggregation = {
|
|
265
|
+
groupBy: ast.groupBy ? ast.groupBy.columns : [], // Empty array for scalar aggregation
|
|
266
|
+
aggregates: ast.columns.filter(c => c.expr.type === 'aggr_func'),
|
|
267
|
+
having: ast.having
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
return plan;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Creates a logical query plan from a list of Abstract Syntax Trees (ASTs) for a UNION query.
|
|
274
|
+
* @param {Array<object>} astList The list of ASTs generated by the parser.
|
|
275
|
+
* @returns {object} A query plan object for the executor.
|
|
276
|
+
*/
|
|
277
|
+
export function createPlan(astList) {
|
|
278
|
+
if (!astList || astList.length === 0)
|
|
279
|
+
return null;
|
|
280
|
+
// Handle a single SELECT query (backwards compatibility)
|
|
281
|
+
if (astList.length === 1 && astList[0].type === 'select') {
|
|
282
|
+
const ast = astList[0];
|
|
283
|
+
return createSingleSelectPlan(ast);
|
|
284
|
+
}
|
|
285
|
+
// It's a UNION query
|
|
286
|
+
const plan = {
|
|
287
|
+
type: 'union',
|
|
288
|
+
selectPlans: [],
|
|
289
|
+
unionOps: [],
|
|
290
|
+
orderBy: null,
|
|
291
|
+
limit: null,
|
|
292
|
+
};
|
|
293
|
+
// Create a map from the SelectAST object to its future index in selectPlans
|
|
294
|
+
const selectAsts = astList.filter(ast => ast.type === 'select');
|
|
295
|
+
const selectAstIndexMap = new Map();
|
|
296
|
+
selectAsts.forEach((ast, index) => {
|
|
297
|
+
selectAstIndexMap.set(ast, index);
|
|
298
|
+
});
|
|
299
|
+
plan.selectPlans = selectAsts.map(ast => createSingleSelectPlan(ast));
|
|
300
|
+
const unionAsts = astList.filter(ast => ast.type === 'union');
|
|
301
|
+
plan.unionOps = unionAsts.map(ast => {
|
|
302
|
+
const topSelectAst = astList[ast.top];
|
|
303
|
+
const bottomSelectAst = astList[ast.bottom];
|
|
304
|
+
const topPlanIndex = selectAstIndexMap.get(topSelectAst);
|
|
305
|
+
const bottomPlanIndex = selectAstIndexMap.get(bottomSelectAst);
|
|
306
|
+
if (topPlanIndex === undefined || bottomPlanIndex === undefined) {
|
|
307
|
+
throw new Error('Internal Planner Error: Could not map UNION AST to SELECT plans.');
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
distinct: ast.distinct,
|
|
311
|
+
topPlanIndex,
|
|
312
|
+
bottomPlanIndex,
|
|
313
|
+
};
|
|
314
|
+
});
|
|
315
|
+
// According to SQL standard, ORDER BY and LIMIT in a UNION query apply to the entire result set
|
|
316
|
+
// and can only appear at the very end.
|
|
317
|
+
const lastSelectAst = astList[astList.length - 1];
|
|
318
|
+
if (lastSelectAst.type === 'select') {
|
|
319
|
+
plan.orderBy = lastSelectAst.orderBy;
|
|
320
|
+
plan.limit = lastSelectAst.limit;
|
|
321
|
+
// Remove from individual plan to avoid applying it early
|
|
322
|
+
const lastSelectPlan = plan.selectPlans[plan.selectPlans.length - 1];
|
|
323
|
+
if (lastSelectPlan) {
|
|
324
|
+
lastSelectPlan.orderBy = null;
|
|
325
|
+
lastSelectPlan.limit = null;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return plan;
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/core/query-engine/planner.ts"],"names":[],"mappings":"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"}
|