@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.
Files changed (76) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +308 -70
  3. package/dist/ast.d.ts +97 -27
  4. package/dist/ast.d.ts.map +1 -1
  5. package/dist/ast.js +21 -6
  6. package/dist/ast.js.map +1 -1
  7. package/dist/build.d.ts +43 -0
  8. package/dist/build.d.ts.map +1 -0
  9. package/dist/build.js +58 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/context.d.ts +30 -6
  12. package/dist/context.d.ts.map +1 -1
  13. package/dist/context.js +11 -10
  14. package/dist/context.js.map +1 -1
  15. package/dist/engine.d.ts +13 -3
  16. package/dist/engine.d.ts.map +1 -1
  17. package/dist/engine.js +281 -100
  18. package/dist/engine.js.map +1 -1
  19. package/dist/errors.d.ts +1 -1
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/errors.js +2 -1
  22. package/dist/errors.js.map +1 -1
  23. package/dist/index.d.ts +19 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +36 -13
  26. package/dist/index.js.map +1 -1
  27. package/dist/lexer.d.ts +15 -1
  28. package/dist/lexer.d.ts.map +1 -1
  29. package/dist/lexer.js +104 -51
  30. package/dist/lexer.js.map +1 -1
  31. package/dist/optimize/analysis.d.ts +3 -2
  32. package/dist/optimize/analysis.d.ts.map +1 -1
  33. package/dist/optimize/analysis.js +19 -18
  34. package/dist/optimize/analysis.js.map +1 -1
  35. package/dist/optimize/ir.d.ts +2 -2
  36. package/dist/optimize/ir.d.ts.map +1 -1
  37. package/dist/optimize/ir.js +3 -3
  38. package/dist/optimize/ir.js.map +1 -1
  39. package/dist/parser.d.ts.map +1 -1
  40. package/dist/parser.js +782 -335
  41. package/dist/parser.js.map +1 -1
  42. package/dist/plan.d.ts.map +1 -1
  43. package/dist/plan.js +4 -2
  44. package/dist/plan.js.map +1 -1
  45. package/dist/print.d.ts +17 -0
  46. package/dist/print.d.ts.map +1 -0
  47. package/dist/print.js +266 -0
  48. package/dist/print.js.map +1 -0
  49. package/dist/resolve.d.ts +23 -0
  50. package/dist/resolve.d.ts.map +1 -0
  51. package/dist/resolve.js +333 -0
  52. package/dist/resolve.js.map +1 -0
  53. package/dist/version.d.ts +5 -0
  54. package/dist/version.d.ts.map +1 -0
  55. package/dist/version.js +5 -0
  56. package/dist/version.js.map +1 -0
  57. package/dist/walk.d.ts +56 -0
  58. package/dist/walk.d.ts.map +1 -0
  59. package/dist/walk.js +157 -0
  60. package/dist/walk.js.map +1 -0
  61. package/package.json +1 -1
  62. package/src/ast.ts +126 -40
  63. package/src/build.ts +73 -0
  64. package/src/context.ts +36 -12
  65. package/src/engine.ts +285 -110
  66. package/src/errors.ts +3 -2
  67. package/src/index.ts +40 -14
  68. package/src/lexer.ts +102 -51
  69. package/src/optimize/analysis.ts +17 -15
  70. package/src/optimize/ir.ts +4 -4
  71. package/src/parser.ts +721 -289
  72. package/src/plan.ts +3 -2
  73. package/src/print.ts +276 -0
  74. package/src/resolve.ts +309 -0
  75. package/src/version.ts +4 -0
  76. package/src/walk.ts +201 -0
@@ -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"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../src/walk.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omgbase/oqx",
3
- "version": "0.15.0",
3
+ "version": "0.20.0",
4
4
  "description": "OQX (omgbase Query eXpressions): a composable query language and engine for JavaScript collections",
5
5
  "keywords": [
6
6
  "query",