@omgbase/oqx 0.15.0 → 0.20.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/CHANGELOG.md +60 -0
- package/README.md +308 -70
- package/dist/ast.d.ts +97 -27
- package/dist/ast.d.ts.map +1 -1
- package/dist/ast.js +21 -6
- package/dist/ast.js.map +1 -1
- package/dist/build.d.ts +43 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +58 -0
- package/dist/build.js.map +1 -0
- package/dist/context.d.ts +30 -6
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +11 -10
- package/dist/context.js.map +1 -1
- package/dist/engine.d.ts +13 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +281 -100
- package/dist/engine.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +19 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -13
- package/dist/index.js.map +1 -1
- package/dist/lexer.d.ts +15 -1
- package/dist/lexer.d.ts.map +1 -1
- package/dist/lexer.js +104 -51
- package/dist/lexer.js.map +1 -1
- package/dist/optimize/analysis.d.ts +3 -2
- package/dist/optimize/analysis.d.ts.map +1 -1
- package/dist/optimize/analysis.js +19 -18
- package/dist/optimize/analysis.js.map +1 -1
- package/dist/optimize/ir.d.ts +2 -2
- package/dist/optimize/ir.d.ts.map +1 -1
- package/dist/optimize/ir.js +3 -3
- package/dist/optimize/ir.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +782 -335
- package/dist/parser.js.map +1 -1
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +4 -2
- package/dist/plan.js.map +1 -1
- package/dist/print.d.ts +17 -0
- package/dist/print.d.ts.map +1 -0
- package/dist/print.js +266 -0
- package/dist/print.js.map +1 -0
- package/dist/resolve.d.ts +23 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +333 -0
- package/dist/resolve.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/walk.d.ts +56 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +157 -0
- package/dist/walk.js.map +1 -0
- package/package.json +1 -1
- package/src/ast.ts +126 -40
- package/src/build.ts +73 -0
- package/src/context.ts +36 -12
- package/src/engine.ts +285 -110
- package/src/errors.ts +3 -2
- package/src/index.ts +40 -14
- package/src/lexer.ts +102 -51
- package/src/optimize/analysis.ts +17 -15
- package/src/optimize/ir.ts +4 -4
- package/src/parser.ts +721 -289
- package/src/plan.ts +3 -2
- package/src/print.ts +276 -0
- package/src/resolve.ts +309 -0
- package/src/version.ts +4 -0
- package/src/walk.ts +201 -0
package/dist/resolve.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
// Select-alias resolution (SEMANTICS §14). `where` may reference the same body's
|
|
2
|
+
// `select` aliases, and since 0.17 a `select` item may reference the items to
|
|
3
|
+
// its left; the parser keeps the surface form (so the tree can be printed back
|
|
4
|
+
// and reflected on) and only VALIDATES the references, and this module performs
|
|
5
|
+
// the substitution — a pure rewrite the entry points (`run`, `execute`, `oqx`,
|
|
6
|
+
// `runQuery`) apply once before evaluation, so the engine and any pushdown
|
|
7
|
+
// planner see an ordinary `where` and `select` over row fields. Rules:
|
|
8
|
+
// • an alias shadows a same-named row field inside `where` and in the items
|
|
9
|
+
// after it;
|
|
10
|
+
// • an alias's own name inside its own expression is the row field
|
|
11
|
+
// (`name: name.upper()` is not recursive), but a chain of aliases that
|
|
12
|
+
// comes back to one being resolved (`a: b, b: a`) is a cycle → error;
|
|
13
|
+
// • a `select` item may name only the items to its LEFT; a reference to an
|
|
14
|
+
// item to its right is an error (it is a cycle when that item refers back);
|
|
15
|
+
// • an alias whose value is a `collect`/`first`/`single { … }` block may
|
|
16
|
+
// stand alone as a where leaf (a collection in predicate position means
|
|
17
|
+
// non-empty) but not appear inside a `where` expression; in a later `select`
|
|
18
|
+
// item it inlines as a value-position directive (`boss.name`);
|
|
19
|
+
// • nested blocks (consumer bodies, follow blocks, bracket lookups) are their
|
|
20
|
+
// own scopes and are not rewritten against this body's select — each body
|
|
21
|
+
// rewrites against its own.
|
|
22
|
+
//
|
|
23
|
+
// Resolution is NOT idempotent (`name: name.upper() … where name` resolves to
|
|
24
|
+
// `name.upper()`, whose `name` would be substituted again), so it must run
|
|
25
|
+
// exactly once: the entry points do it, `Engine.run` evaluates the query as
|
|
26
|
+
// given. Untouched nodes are returned by reference, so a cached query keeps the
|
|
27
|
+
// identity of every block the rewrite did not reach.
|
|
28
|
+
import { OqxError } from "./errors.js";
|
|
29
|
+
const failPlain = (message) => {
|
|
30
|
+
throw new OqxError(message, "parse");
|
|
31
|
+
};
|
|
32
|
+
/** Resolve every `where` and `select` of a query (its own and every nested
|
|
33
|
+
* block's) against the `select` of the same body. Pure: returns a new tree
|
|
34
|
+
* sharing every node the rewrite did not touch. Throws an `OqxError` (stage
|
|
35
|
+
* `parse`) for an alias cycle, a forward reference, or a block alias used
|
|
36
|
+
* inside a `where` expression — the same conditions the parser rejects, so a
|
|
37
|
+
* parsed query never throws here. */
|
|
38
|
+
export function resolveAliases(node) {
|
|
39
|
+
return resolveBody(node, failPlain);
|
|
40
|
+
}
|
|
41
|
+
function resolveBody(node, fail) {
|
|
42
|
+
// `where` is validated and substituted against the raw select first: its
|
|
43
|
+
// cycle report follows the where's own path (`c → a → b → c`), as pinned.
|
|
44
|
+
const where = node.where === null ? null : resolveWhere(node.select, node.where, fail);
|
|
45
|
+
const where2 = where === null ? null : resolveNestedWhere(where, fail);
|
|
46
|
+
const select = resolveSelect(node.select, fail);
|
|
47
|
+
const follow = node.follow === null ? null : resolveFollow(node.follow, fail);
|
|
48
|
+
const from = mapSame(node.from, (e) => resolveExpr(e, fail));
|
|
49
|
+
const orderBy = node.orderBy === null ? null : mapSame(node.orderBy, (o) => {
|
|
50
|
+
const expr = resolveExpr(o.expr, fail);
|
|
51
|
+
return expr === o.expr ? o : { ...o, expr };
|
|
52
|
+
});
|
|
53
|
+
const limit = node.limit === null ? null : resolveExpr(node.limit, fail);
|
|
54
|
+
const offset = node.offset === null ? null : resolveExpr(node.offset, fail);
|
|
55
|
+
// `frontier` (0.20) is not rewritten against the select: a destination
|
|
56
|
+
// block's reads the occurrence, a body's reads the seed row — not a projected
|
|
57
|
+
// record (like `order by`).
|
|
58
|
+
const frontier = node.frontier === null ? null : resolveExpr(node.frontier, fail);
|
|
59
|
+
const source = node.kind === "query" ? resolveExpr(node.source, fail) : null;
|
|
60
|
+
const same = where2 === node.where && select === node.select && follow === node.follow && from === node.from
|
|
61
|
+
&& orderBy === node.orderBy && limit === node.limit && offset === node.offset && frontier === node.frontier
|
|
62
|
+
&& (node.kind !== "query" || source === node.source);
|
|
63
|
+
if (same)
|
|
64
|
+
return node;
|
|
65
|
+
const out = { ...node, where: where2, select, follow, frontier, from, orderBy, limit, offset };
|
|
66
|
+
if (node.kind === "query")
|
|
67
|
+
out.source = source;
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
function resolveOp(op, fail) {
|
|
71
|
+
const receiver = resolveExpr(op.receiver, fail);
|
|
72
|
+
const sub = resolveBody(op.sub, fail);
|
|
73
|
+
return sub === op.sub && receiver === op.receiver ? op : { ...op, receiver, sub };
|
|
74
|
+
}
|
|
75
|
+
function resolveFollow(f, fail) {
|
|
76
|
+
const destinations = mapSame(f.destinations, (d) => (d.kind === "op" ? resolveOp(d, fail) : resolveExpr(d, fail)));
|
|
77
|
+
return destinations === f.destinations ? f : { ...f, destinations };
|
|
78
|
+
}
|
|
79
|
+
// Nested blocks inside a where tree are their own scopes: resolve each against
|
|
80
|
+
// its own select (a scalar leaf may hold a value-position directive).
|
|
81
|
+
function resolveNestedWhere(w, fail) {
|
|
82
|
+
switch (w.kind) {
|
|
83
|
+
case "and":
|
|
84
|
+
case "or": {
|
|
85
|
+
const parts = mapSame(w.parts, (p) => resolveNestedWhere(p, fail));
|
|
86
|
+
return parts === w.parts ? w : { ...w, parts };
|
|
87
|
+
}
|
|
88
|
+
case "not": {
|
|
89
|
+
const expr = resolveNestedWhere(w.expr, fail);
|
|
90
|
+
return expr === w.expr ? w : { ...w, expr };
|
|
91
|
+
}
|
|
92
|
+
case "scalar": {
|
|
93
|
+
const expr = resolveExpr(w.expr, fail);
|
|
94
|
+
return expr === w.expr ? w : { ...w, expr };
|
|
95
|
+
}
|
|
96
|
+
case "op": return resolveOp(w, fail);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Resolve the nested blocks (value-position directives) inside an expression,
|
|
100
|
+
* each against its own select; the expression's own idents are left alone. */
|
|
101
|
+
function resolveExpr(e, fail) {
|
|
102
|
+
return mapExpr(e, (x) => (x.kind === "op" ? resolveOp(x, fail) : null));
|
|
103
|
+
}
|
|
104
|
+
/** Rebuild `e` bottom-up, letting `f` replace a node (return `null` to keep it;
|
|
105
|
+
* a replaced node's children are not visited — `f` owns them). Untouched nodes
|
|
106
|
+
* are returned by reference. */
|
|
107
|
+
function mapExpr(e, f) {
|
|
108
|
+
const hit = f(e);
|
|
109
|
+
if (hit !== null)
|
|
110
|
+
return hit;
|
|
111
|
+
const go = (x) => mapExpr(x, f);
|
|
112
|
+
switch (e.kind) {
|
|
113
|
+
case "member": {
|
|
114
|
+
const recv = go(e.recv);
|
|
115
|
+
return recv === e.recv ? e : { ...e, recv };
|
|
116
|
+
}
|
|
117
|
+
case "call": {
|
|
118
|
+
const recv = e.recv ? go(e.recv) : null;
|
|
119
|
+
const args = mapSame(e.args, go);
|
|
120
|
+
return recv === e.recv && args === e.args ? e : { ...e, recv, args };
|
|
121
|
+
}
|
|
122
|
+
case "unary":
|
|
123
|
+
case "required": {
|
|
124
|
+
const expr = go(e.expr);
|
|
125
|
+
return expr === e.expr ? e : { ...e, expr };
|
|
126
|
+
}
|
|
127
|
+
case "binary":
|
|
128
|
+
case "logical":
|
|
129
|
+
case "in": {
|
|
130
|
+
const left = go(e.left);
|
|
131
|
+
const right = go(e.right);
|
|
132
|
+
return left === e.left && right === e.right ? e : { ...e, left, right };
|
|
133
|
+
}
|
|
134
|
+
case "range": {
|
|
135
|
+
const lo = e.lo ? go(e.lo) : null;
|
|
136
|
+
const hi = e.hi ? go(e.hi) : null;
|
|
137
|
+
return lo === e.lo && hi === e.hi ? e : { ...e, lo, hi };
|
|
138
|
+
}
|
|
139
|
+
case "tuple": {
|
|
140
|
+
const items = mapSame(e.items, go);
|
|
141
|
+
return items === e.items ? e : { ...e, items };
|
|
142
|
+
}
|
|
143
|
+
case "op": { // the receiver is read in this scope; the block is its own scope
|
|
144
|
+
const receiver = go(e.receiver);
|
|
145
|
+
return receiver === e.receiver ? e : { ...e, receiver };
|
|
146
|
+
}
|
|
147
|
+
default: return e; // lit, ident, binding, outer
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// An item other items may name: a `collect` item, or a named non-lift field.
|
|
151
|
+
function aliasName(it) {
|
|
152
|
+
if (it.kind === "collect")
|
|
153
|
+
return it.name === "" ? null : it.name;
|
|
154
|
+
return it.lift === 0 && it.name !== "" ? it.name : null;
|
|
155
|
+
}
|
|
156
|
+
// The alias names an item's own expression (the receiver, for a block) mentions
|
|
157
|
+
// as bare identifiers, excluding its own name (the row field).
|
|
158
|
+
function aliasRefs(it, index) {
|
|
159
|
+
const own = aliasName(it);
|
|
160
|
+
const out = [];
|
|
161
|
+
const visit = (e) => {
|
|
162
|
+
mapExpr(e, (x) => {
|
|
163
|
+
if (x.kind === "ident" && x.name !== own && index.has(x.name) && !out.includes(x.name))
|
|
164
|
+
out.push(x.name);
|
|
165
|
+
return null;
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
visit(it.kind === "collect" ? it.op.receiver : it.expr);
|
|
169
|
+
return out;
|
|
170
|
+
}
|
|
171
|
+
/** Resolve one body's `select` items left to right (this body only; each item's
|
|
172
|
+
* nested blocks are resolved against their own select). An item's bare
|
|
173
|
+
* identifier that names an item to its left is replaced by that item's resolved
|
|
174
|
+
* value — a block alias inlines as a value-position directive — and the item's
|
|
175
|
+
* own name is the row field. A reference to an item to its right fails: as a
|
|
176
|
+
* cycle when that item refers back, else as a forward reference. Exported for
|
|
177
|
+
* the parser's validation pass. */
|
|
178
|
+
export function resolveSelect(select, fail = failPlain) {
|
|
179
|
+
const index = new Map();
|
|
180
|
+
select.forEach((it, i) => { const n = aliasName(it); if (n !== null)
|
|
181
|
+
index.set(n, i); });
|
|
182
|
+
if (index.size === 0) {
|
|
183
|
+
return mapSame(select, (it) => resolveItemBlocks(it, fail));
|
|
184
|
+
}
|
|
185
|
+
const resolved = new Map();
|
|
186
|
+
let out = null;
|
|
187
|
+
for (let i = 0; i < select.length; i++) {
|
|
188
|
+
const it = select[i];
|
|
189
|
+
const own = aliasName(it);
|
|
190
|
+
const subst = (e) => mapExpr(e, (x) => {
|
|
191
|
+
if (x.kind !== "ident")
|
|
192
|
+
return null;
|
|
193
|
+
if (x.name === own)
|
|
194
|
+
return x;
|
|
195
|
+
const r = resolved.get(x.name);
|
|
196
|
+
if (r)
|
|
197
|
+
return r;
|
|
198
|
+
const j = index.get(x.name);
|
|
199
|
+
if (j === undefined || j <= i)
|
|
200
|
+
return null;
|
|
201
|
+
const back = own === null ? null : cyclePath(select, index, j, own);
|
|
202
|
+
if (back)
|
|
203
|
+
fail(`select aliases form a cycle: ${[own, ...back].join(" → ")} — an alias cannot depend on itself`);
|
|
204
|
+
fail(`select alias '${x.name}' is used before it is defined — a select item may reference only the items to its left`);
|
|
205
|
+
});
|
|
206
|
+
let r;
|
|
207
|
+
if (it.kind === "collect") {
|
|
208
|
+
const receiver = subst(it.op.receiver);
|
|
209
|
+
const op = resolveOp(receiver === it.op.receiver ? it.op : { ...it.op, receiver }, fail);
|
|
210
|
+
r = op === it.op ? it : { ...it, op };
|
|
211
|
+
if (own !== null)
|
|
212
|
+
resolved.set(own, op);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
const expr = resolveExpr(subst(it.expr), fail);
|
|
216
|
+
r = expr === it.expr ? it : expr.kind === "op"
|
|
217
|
+
? { kind: "collect", span: it.span, name: it.name, op: expr }
|
|
218
|
+
: { ...it, expr };
|
|
219
|
+
if (own !== null)
|
|
220
|
+
resolved.set(own, expr);
|
|
221
|
+
}
|
|
222
|
+
if (r !== it) {
|
|
223
|
+
out ??= select.slice();
|
|
224
|
+
out[i] = r;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return out ?? select;
|
|
228
|
+
}
|
|
229
|
+
// The nested blocks of an item, resolved against their own select.
|
|
230
|
+
function resolveItemBlocks(it, fail) {
|
|
231
|
+
if (it.kind === "collect") {
|
|
232
|
+
const op = resolveOp(it.op, fail);
|
|
233
|
+
return op === it.op ? it : { ...it, op };
|
|
234
|
+
}
|
|
235
|
+
const expr = resolveExpr(it.expr, fail);
|
|
236
|
+
return expr === it.expr ? it : { ...it, expr };
|
|
237
|
+
}
|
|
238
|
+
// The alias path from item `from` back to the alias `to`, if the raw reference
|
|
239
|
+
// graph has one (`[b, a]` for `a: b, b: a` from `b` back to `a`).
|
|
240
|
+
function cyclePath(select, index, from, to) {
|
|
241
|
+
const seen = new Set();
|
|
242
|
+
const go = (i, path) => {
|
|
243
|
+
if (seen.has(i))
|
|
244
|
+
return null;
|
|
245
|
+
seen.add(i);
|
|
246
|
+
const it = select[i];
|
|
247
|
+
const name = aliasName(it);
|
|
248
|
+
for (const ref of aliasRefs(it, index)) {
|
|
249
|
+
if (ref === to)
|
|
250
|
+
return [...path, name, to];
|
|
251
|
+
const hit = go(index.get(ref), [...path, name]);
|
|
252
|
+
if (hit)
|
|
253
|
+
return hit;
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
};
|
|
257
|
+
return go(from, []);
|
|
258
|
+
}
|
|
259
|
+
/** Resolve one body's `where` against its `select` (this body only; nested
|
|
260
|
+
* blocks are left as they are). Exported for the parser's validation pass. */
|
|
261
|
+
export function resolveWhere(select, where, fail = failPlain) {
|
|
262
|
+
if (select.length === 0)
|
|
263
|
+
return where;
|
|
264
|
+
const aliases = new Map();
|
|
265
|
+
for (const it of select) {
|
|
266
|
+
const n = aliasName(it);
|
|
267
|
+
if (n !== null)
|
|
268
|
+
aliases.set(n, it);
|
|
269
|
+
}
|
|
270
|
+
if (aliases.size === 0)
|
|
271
|
+
return where;
|
|
272
|
+
const resolving = [];
|
|
273
|
+
const subst = (e) => mapExpr(e, (x) => {
|
|
274
|
+
if (x.kind !== "ident")
|
|
275
|
+
return null;
|
|
276
|
+
const a = aliases.get(x.name);
|
|
277
|
+
if (!a)
|
|
278
|
+
return null;
|
|
279
|
+
if (resolving[resolving.length - 1] === x.name)
|
|
280
|
+
return x; // its own name inside its own expression: the row field
|
|
281
|
+
if (resolving.includes(x.name)) {
|
|
282
|
+
const cycle = [...resolving.slice(resolving.indexOf(x.name)), x.name].join(" → ");
|
|
283
|
+
fail(`select aliases form a cycle: ${cycle} — an alias used in \`where\` cannot depend on itself`);
|
|
284
|
+
}
|
|
285
|
+
if (a.kind === "collect") {
|
|
286
|
+
fail(`select alias '${x.name}' is a ${a.op.op} { … } block — in \`where\` it can only stand alone as a non-empty test, not inside an expression`);
|
|
287
|
+
}
|
|
288
|
+
resolving.push(x.name);
|
|
289
|
+
const out = subst(a.expr);
|
|
290
|
+
resolving.pop();
|
|
291
|
+
return out;
|
|
292
|
+
});
|
|
293
|
+
const walk = (w) => {
|
|
294
|
+
switch (w.kind) {
|
|
295
|
+
case "and":
|
|
296
|
+
case "or": {
|
|
297
|
+
const parts = mapSame(w.parts, walk);
|
|
298
|
+
return parts === w.parts ? w : { ...w, parts };
|
|
299
|
+
}
|
|
300
|
+
case "not": {
|
|
301
|
+
const expr = walk(w.expr);
|
|
302
|
+
return expr === w.expr ? w : { ...w, expr };
|
|
303
|
+
}
|
|
304
|
+
case "scalar": {
|
|
305
|
+
if (w.expr.kind === "ident") {
|
|
306
|
+
const a = aliases.get(w.expr.name);
|
|
307
|
+
if (a?.kind === "collect")
|
|
308
|
+
return a.op; // a collection in predicate position: non-empty
|
|
309
|
+
}
|
|
310
|
+
const expr = subst(w.expr);
|
|
311
|
+
return expr === w.expr ? w : { ...w, expr };
|
|
312
|
+
}
|
|
313
|
+
case "op": { // the receiver is read in this scope; the block is its own scope
|
|
314
|
+
const receiver = subst(w.receiver);
|
|
315
|
+
return receiver === w.receiver ? w : { ...w, receiver };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
return walk(where);
|
|
320
|
+
}
|
|
321
|
+
// `map` that returns the input array itself when no element changed.
|
|
322
|
+
function mapSame(xs, f) {
|
|
323
|
+
let out = null;
|
|
324
|
+
for (let i = 0; i < xs.length; i++) {
|
|
325
|
+
const y = f(xs[i]);
|
|
326
|
+
if (y !== xs[i]) {
|
|
327
|
+
out ??= xs.slice();
|
|
328
|
+
out[i] = y;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return out ?? xs;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The OQX language version (`spec/oqx/VERSION`, `major.minor`) this implementation
|
|
2
|
+
* conforms to — distinct from the package's own semver, whose `major.minor` it
|
|
3
|
+
* equals. Stamped on every `toJSON` document. */
|
|
4
|
+
export declare const LANGUAGE_VERSION = "0.20";
|
|
5
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;iDAEiD;AACjD,eAAO,MAAM,gBAAgB,SAAS,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The OQX language version (`spec/oqx/VERSION`, `major.minor`) this implementation
|
|
2
|
+
* conforms to — distinct from the package's own semver, whose `major.minor` it
|
|
3
|
+
* equals. Stamped on every `toJSON` document. */
|
|
4
|
+
export const LANGUAGE_VERSION = "0.20";
|
|
5
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;iDAEiD;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC"}
|
package/dist/walk.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AstKind, AstNode, Expr, Query, QueryJson, Subquery } from "./ast.js";
|
|
2
|
+
/** The clause a node sits in, for `visit`/`transform` contexts. `source` is the
|
|
3
|
+
* root collection (`from <source>` or the directive receiver); `from` the further
|
|
4
|
+
* re-projections; `follow` the `Follow` node itself and `follow.*` its parts.
|
|
5
|
+
* The root node has no clause (`null`). */
|
|
6
|
+
export type Clause = "source" | "from" | "where" | "select" | "orderBy" | "limit" | "offset" | "follow" | "follow.destination" | "follow.frontier";
|
|
7
|
+
/** Where a visited node sits. `depth` is the scope depth at which the node is
|
|
8
|
+
* evaluated (0 = the root scope: a top-level `source`, `limit`, `offset`; 1 =
|
|
9
|
+
* a top-level row: its `where`, `select`, `order by`, `from` re-projections and
|
|
10
|
+
* `follow`; a block's rows are one deeper than the block's receiver — a follow
|
|
11
|
+
* destination block's `where` therefore one deeper than the frontier row —
|
|
12
|
+
* and a destination block's `frontier` one level out of its rows, under the
|
|
13
|
+
* walk's enclosing scope). */
|
|
14
|
+
export interface VisitContext {
|
|
15
|
+
/** The ancestors of the node, root first (empty for the root). */
|
|
16
|
+
readonly path: readonly AstNode[];
|
|
17
|
+
readonly clause: Clause | null;
|
|
18
|
+
readonly depth: number;
|
|
19
|
+
}
|
|
20
|
+
export interface Visitor {
|
|
21
|
+
/** Called before a node's children; return `false` to skip the subtree
|
|
22
|
+
* (`leave` is still called for the node). */
|
|
23
|
+
enter?(node: AstNode, ctx: VisitContext): boolean | void;
|
|
24
|
+
/** Called after a node's children. */
|
|
25
|
+
leave?(node: AstNode, ctx: VisitContext): void;
|
|
26
|
+
}
|
|
27
|
+
/** One child slot of a node kind: the property, the clause it opens (inherited
|
|
28
|
+
* from the parent when absent) and how much deeper its scope is. */
|
|
29
|
+
export interface ChildKey {
|
|
30
|
+
readonly key: string;
|
|
31
|
+
readonly clause?: Clause;
|
|
32
|
+
readonly depth?: number;
|
|
33
|
+
}
|
|
34
|
+
/** The child-key table: every node kind's children, in canonical source order.
|
|
35
|
+
* A slot's value is a node, an array of nodes, or `null`. */
|
|
36
|
+
export declare const CHILDREN: {
|
|
37
|
+
readonly [K in AstKind]: readonly ChildKey[];
|
|
38
|
+
};
|
|
39
|
+
/** Walk a tree depth-first in canonical source order. */
|
|
40
|
+
export declare function visit(root: AstNode, visitor: Visitor): void;
|
|
41
|
+
/** Rebuild a query (or block body) with every expression mapped through `f`,
|
|
42
|
+
* children first (so `f` sees an expression whose operands are already mapped).
|
|
43
|
+
* Nodes `f` returns unchanged, and every ancestor whose children did not change,
|
|
44
|
+
* are kept by reference — spans and identity of untouched nodes survive. */
|
|
45
|
+
export declare function transform<T extends Query | Subquery>(root: T, f: (expr: Expr, ctx: VisitContext) => Expr): T;
|
|
46
|
+
/** The tree with every `span` removed, for shape comparisons (the fixtures and
|
|
47
|
+
* the round-trip law compare stripped trees). A deep copy of plain data. */
|
|
48
|
+
export type Stripped<T> = T extends readonly (infer U)[] ? Stripped<U>[] : T extends object ? {
|
|
49
|
+
[K in keyof T as K extends "span" ? never : K]: Stripped<T[K]>;
|
|
50
|
+
} : T;
|
|
51
|
+
export declare function stripSpans<T>(node: T): Stripped<T>;
|
|
52
|
+
/** The query as the JSON document both implementations exchange: the tree
|
|
53
|
+
* (already plain data) stamped with the language version it was produced under
|
|
54
|
+
* (`{ "oqx": "0.16", "kind": "query", … }`). */
|
|
55
|
+
export declare function toJSON(query: Query): QueryJson;
|
|
56
|
+
//# sourceMappingURL=walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../src/walk.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAInF;;;2CAG2C;AAC3C,MAAM,MAAM,MAAM,GACd,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GACvE,QAAQ,GAAG,oBAAoB,GAAG,iBAAiB,CAAC;AAExD;;;;;;8BAM8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB;iDAC6C;IAC7C,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAAC;IACzD,sCAAsC;IACtC,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;CAChD;AAED;oEACoE;AACpE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;6DAC6D;AAC7D,eAAO,MAAM,QAAQ,EAAE;IAAE,QAAQ,EAAE,CAAC,IAAI,OAAO,GAAG,SAAS,QAAQ,EAAE;CAiDpE,CAAC;AAwBF,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB3D;AAED;;;4EAG4E;AAC5E,wBAAgB,SAAS,CAAC,CAAC,SAAS,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,CAAC,CAuB5G;AAED;4EAC4E;AAC5E,MAAM,MAAM,QAAQ,CAAC,CAAC,IACpB,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,GAC5C,CAAC,SAAS,MAAM,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACrF,CAAC,CAAC;AAEN,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAWlD;AAED;;gDAEgD;AAChD,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAE9C"}
|
package/dist/walk.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// Generic traversal over the AST (spec/oqx/AST.md §5): `visit` (enter/leave with
|
|
2
|
+
// a path, the enclosing clause and the scope depth), `transform` (rebuild a
|
|
3
|
+
// query with every expression mapped), `stripSpans`, `toJSON`. All three walks
|
|
4
|
+
// are driven by ONE child-key table per node kind — `CHILDREN` — so a future
|
|
5
|
+
// field is added in one place and every tool sees it.
|
|
6
|
+
import { isExpr } from "./ast.js";
|
|
7
|
+
import { LANGUAGE_VERSION } from "./version.js";
|
|
8
|
+
/** The child-key table: every node kind's children, in canonical source order.
|
|
9
|
+
* A slot's value is a node, an array of nodes, or `null`. */
|
|
10
|
+
export const CHILDREN = {
|
|
11
|
+
query: [
|
|
12
|
+
{ key: "select", clause: "select", depth: 1 },
|
|
13
|
+
{ key: "source", clause: "source" },
|
|
14
|
+
{ key: "from", clause: "from", depth: 1 },
|
|
15
|
+
{ key: "where", clause: "where", depth: 1 },
|
|
16
|
+
// The body's `frontier` (0.20) reads each seed in the row scope, like `where`.
|
|
17
|
+
{ key: "frontier", clause: "follow.frontier", depth: 1 },
|
|
18
|
+
{ key: "follow", clause: "follow", depth: 1 },
|
|
19
|
+
{ key: "orderBy", clause: "orderBy", depth: 1 },
|
|
20
|
+
{ key: "limit", clause: "limit" },
|
|
21
|
+
{ key: "offset", clause: "offset" },
|
|
22
|
+
],
|
|
23
|
+
subquery: [
|
|
24
|
+
{ key: "select", clause: "select" },
|
|
25
|
+
{ key: "from", clause: "from" },
|
|
26
|
+
{ key: "where", clause: "where" },
|
|
27
|
+
// A destination block's `frontier` reads the occurrence under the walk's
|
|
28
|
+
// enclosing scope — one level OUT of the block's rows (SEMANTICS §20); any
|
|
29
|
+
// other block's reads its seeds in the row scope, like `where`
|
|
30
|
+
// (`childDepth` tells the two apart by the block's position).
|
|
31
|
+
{ key: "frontier", clause: "follow.frontier", depth: -1 },
|
|
32
|
+
{ key: "follow", clause: "follow" },
|
|
33
|
+
{ key: "orderBy", clause: "orderBy" },
|
|
34
|
+
{ key: "limit", clause: "limit" },
|
|
35
|
+
{ key: "offset", clause: "offset" },
|
|
36
|
+
],
|
|
37
|
+
op: [{ key: "receiver" }, { key: "sub", depth: 1 }],
|
|
38
|
+
follow: [{ key: "destinations", clause: "follow.destination" }],
|
|
39
|
+
order: [{ key: "expr" }],
|
|
40
|
+
field: [{ key: "expr" }],
|
|
41
|
+
collect: [{ key: "op" }],
|
|
42
|
+
and: [{ key: "parts" }],
|
|
43
|
+
or: [{ key: "parts" }],
|
|
44
|
+
not: [{ key: "expr" }],
|
|
45
|
+
scalar: [{ key: "expr" }],
|
|
46
|
+
lit: [],
|
|
47
|
+
ident: [],
|
|
48
|
+
outer: [],
|
|
49
|
+
binding: [],
|
|
50
|
+
member: [{ key: "recv" }],
|
|
51
|
+
call: [{ key: "recv" }, { key: "args" }],
|
|
52
|
+
unary: [{ key: "expr" }],
|
|
53
|
+
required: [{ key: "expr" }],
|
|
54
|
+
binary: [{ key: "left" }, { key: "right" }],
|
|
55
|
+
logical: [{ key: "left" }, { key: "right" }],
|
|
56
|
+
in: [{ key: "left" }, { key: "right" }],
|
|
57
|
+
range: [{ key: "lo" }, { key: "hi" }],
|
|
58
|
+
tuple: [{ key: "items" }],
|
|
59
|
+
};
|
|
60
|
+
function slot(node, key) {
|
|
61
|
+
return node[key] ?? null;
|
|
62
|
+
}
|
|
63
|
+
/** A block is a follow destination block when its `op` is a direct destination
|
|
64
|
+
* of a `follow` node. `path` is the ancestors with the block itself last. */
|
|
65
|
+
function isDestinationBlock(path) {
|
|
66
|
+
const op = path[path.length - 2];
|
|
67
|
+
const owner = path[path.length - 3];
|
|
68
|
+
return op?.kind === "op" && owner?.kind === "follow";
|
|
69
|
+
}
|
|
70
|
+
/** How much deeper a child's scope is: the table's value, except a block's
|
|
71
|
+
* `frontier`, which is one level OUT only for a destination block (the walk's
|
|
72
|
+
* enclosing scope) and the row scope itself for a body with its own `follow`. */
|
|
73
|
+
function childDepth(node, child, path) {
|
|
74
|
+
if (node.kind === "subquery" && child.key === "frontier" && !isDestinationBlock(path))
|
|
75
|
+
return 0;
|
|
76
|
+
return child.depth ?? 0;
|
|
77
|
+
}
|
|
78
|
+
/** Walk a tree depth-first in canonical source order. */
|
|
79
|
+
export function visit(root, visitor) {
|
|
80
|
+
const path = [];
|
|
81
|
+
const go = (node, clause, depth) => {
|
|
82
|
+
const ctx = { path: path.slice(), clause, depth };
|
|
83
|
+
const descend = visitor.enter?.(node, ctx) !== false;
|
|
84
|
+
if (descend) {
|
|
85
|
+
path.push(node);
|
|
86
|
+
for (const child of CHILDREN[node.kind]) {
|
|
87
|
+
const v = slot(node, child.key);
|
|
88
|
+
if (v === null)
|
|
89
|
+
continue;
|
|
90
|
+
const c = child.clause ?? clause;
|
|
91
|
+
const d = depth + childDepth(node, child, path);
|
|
92
|
+
if (Array.isArray(v))
|
|
93
|
+
for (const x of v)
|
|
94
|
+
go(x, c, d);
|
|
95
|
+
else
|
|
96
|
+
go(v, c, d);
|
|
97
|
+
}
|
|
98
|
+
path.pop();
|
|
99
|
+
}
|
|
100
|
+
visitor.leave?.(node, ctx);
|
|
101
|
+
};
|
|
102
|
+
go(root, null, 0);
|
|
103
|
+
}
|
|
104
|
+
/** Rebuild a query (or block body) with every expression mapped through `f`,
|
|
105
|
+
* children first (so `f` sees an expression whose operands are already mapped).
|
|
106
|
+
* Nodes `f` returns unchanged, and every ancestor whose children did not change,
|
|
107
|
+
* are kept by reference — spans and identity of untouched nodes survive. */
|
|
108
|
+
export function transform(root, f) {
|
|
109
|
+
const path = [];
|
|
110
|
+
const go = (node, clause, depth) => {
|
|
111
|
+
const ctx = { path: path.slice(), clause, depth };
|
|
112
|
+
path.push(node);
|
|
113
|
+
let out = node;
|
|
114
|
+
for (const child of CHILDREN[node.kind]) {
|
|
115
|
+
const v = slot(node, child.key);
|
|
116
|
+
if (v === null)
|
|
117
|
+
continue;
|
|
118
|
+
const c = child.clause ?? clause;
|
|
119
|
+
const d = depth + childDepth(node, child, path);
|
|
120
|
+
let next;
|
|
121
|
+
if (Array.isArray(v)) {
|
|
122
|
+
let changed = false;
|
|
123
|
+
const mapped = v.map((x) => { const y = go(x, c, d); if (y !== x)
|
|
124
|
+
changed = true; return y; });
|
|
125
|
+
next = changed ? mapped : v;
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
next = go(v, c, d);
|
|
129
|
+
if (next !== v)
|
|
130
|
+
out = { ...out, [child.key]: next };
|
|
131
|
+
}
|
|
132
|
+
path.pop();
|
|
133
|
+
return isExpr(out) ? f(out, ctx) : out;
|
|
134
|
+
};
|
|
135
|
+
return go(root, null, 0);
|
|
136
|
+
}
|
|
137
|
+
export function stripSpans(node) {
|
|
138
|
+
if (Array.isArray(node))
|
|
139
|
+
return node.map(stripSpans);
|
|
140
|
+
if (node !== null && typeof node === "object") {
|
|
141
|
+
const out = {};
|
|
142
|
+
for (const [k, v] of Object.entries(node)) {
|
|
143
|
+
if (k === "span")
|
|
144
|
+
continue;
|
|
145
|
+
out[k] = stripSpans(v);
|
|
146
|
+
}
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
return node;
|
|
150
|
+
}
|
|
151
|
+
/** The query as the JSON document both implementations exchange: the tree
|
|
152
|
+
* (already plain data) stamped with the language version it was produced under
|
|
153
|
+
* (`{ "oqx": "0.16", "kind": "query", … }`). */
|
|
154
|
+
export function toJSON(query) {
|
|
155
|
+
return { oqx: LANGUAGE_VERSION, ...query };
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=walk.js.map
|
package/dist/walk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../src/walk.ts"],"names":[],"mappings":"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"}
|