@omgbase/oqx 0.1.0 → 0.2.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 (51) hide show
  1. package/README.md +7 -7
  2. package/dist/adapters/indexed.d.ts +11 -0
  3. package/dist/adapters/indexed.d.ts.map +1 -0
  4. package/dist/adapters/indexed.js +57 -0
  5. package/dist/adapters/indexed.js.map +1 -0
  6. package/dist/adapters/sqlite.d.ts +23 -0
  7. package/dist/adapters/sqlite.d.ts.map +1 -0
  8. package/dist/adapters/sqlite.js +113 -0
  9. package/dist/adapters/sqlite.js.map +1 -0
  10. package/dist/ast.d.ts +121 -0
  11. package/dist/ast.d.ts.map +1 -0
  12. package/dist/ast.js +7 -0
  13. package/dist/ast.js.map +1 -0
  14. package/dist/context.d.ts +38 -0
  15. package/dist/context.d.ts.map +1 -0
  16. package/dist/context.js +47 -0
  17. package/dist/context.js.map +1 -0
  18. package/dist/engine.d.ts +49 -0
  19. package/dist/engine.d.ts.map +1 -0
  20. package/dist/engine.js +396 -0
  21. package/dist/engine.js.map +1 -0
  22. package/dist/errors.d.ts +6 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +13 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +34 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +74 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lexer.d.ts +17 -0
  31. package/dist/lexer.d.ts.map +1 -0
  32. package/dist/lexer.js +187 -0
  33. package/dist/lexer.js.map +1 -0
  34. package/dist/parser.d.ts +6 -0
  35. package/dist/parser.d.ts.map +1 -0
  36. package/dist/parser.js +584 -0
  37. package/dist/parser.js.map +1 -0
  38. package/dist/plan.d.ts +21 -0
  39. package/dist/plan.d.ts.map +1 -0
  40. package/dist/plan.js +56 -0
  41. package/dist/plan.js.map +1 -0
  42. package/dist/planner.d.ts +24 -0
  43. package/dist/planner.d.ts.map +1 -0
  44. package/dist/planner.js +27 -0
  45. package/dist/planner.js.map +1 -0
  46. package/dist/semantics.d.ts +22 -0
  47. package/dist/semantics.d.ts.map +1 -0
  48. package/dist/semantics.js +142 -0
  49. package/dist/semantics.js.map +1 -0
  50. package/package.json +16 -6
  51. package/src/engine.ts +12 -1
package/dist/engine.js ADDED
@@ -0,0 +1,396 @@
1
+ // The in-memory execution engine (tier 1), now parameterized by a DataContext
2
+ // (tier 2) so it can drive any data model, and expressed behind an `Engine`
3
+ // interface so a pushdown planner (tier 3, planner.ts) is a drop-in alternative.
4
+ //
5
+ // Optimizations over a naive walk: `exists` short-circuits at the first match;
6
+ // `first`/`single` stop early when the result is unordered; `count` never
7
+ // materializes rows; and within an `&&` the cheap scalar leaves are evaluated
8
+ // before expensive consumer-op leaves (which each drive a nested traversal).
9
+ import { DefaultContext } from "./context.js";
10
+ import { OqxError } from "./errors.js";
11
+ import { equals, relate, arith, membership, truthy, toNumber, compareForSort, } from "./semantics.js";
12
+ const RECUR = new Set(["$depth", "$stop", "$leaf", "$frontier", "$ordinal"]);
13
+ const HARD_DEPTH_CAP = 8;
14
+ export class InMemoryEngine {
15
+ ctx;
16
+ constructor(context = new DefaultContext()) {
17
+ this.ctx = context;
18
+ }
19
+ run(query, bindings = []) {
20
+ const root = { row: null, parent: null, bindings };
21
+ let rows = this.rowsOf(this.evalExpr(query.source, root));
22
+ for (const proj of query.from) {
23
+ rows = rows.flatMap((r) => this.rowsOf(this.evalExpr(proj, this.child(r, root))));
24
+ }
25
+ if (query.follow)
26
+ return this.runFollow(query, rows, root);
27
+ // Consumer-directed short-circuits.
28
+ if (query.consumer === "exists") {
29
+ for (const r of rows)
30
+ if (this.matches(query.where, r, root))
31
+ return { consumer: "exists", exists: true };
32
+ return { consumer: "exists", exists: false };
33
+ }
34
+ if (query.consumer === "count") {
35
+ let count = 0;
36
+ for (const r of rows)
37
+ if (this.matches(query.where, r, root))
38
+ count++;
39
+ return { consumer: "count", count };
40
+ }
41
+ const cap = !query.orderBy && query.consumer === "first" ? 1
42
+ : !query.orderBy && query.consumer === "single" ? 2
43
+ : Infinity;
44
+ const kept = [];
45
+ for (const r of rows) {
46
+ const s = { row: r, parent: root, bindings, lifts: {} };
47
+ if (!query.where || this.evalWhere(query.where, s)) {
48
+ kept.push(s);
49
+ if (kept.length >= cap)
50
+ break;
51
+ }
52
+ }
53
+ this.sortScopes(kept, query.orderBy);
54
+ return this.shape(query.consumer, kept, query.select);
55
+ }
56
+ // A where match that needs no lift capture (exists/count fast paths).
57
+ matches(where, row, parent) {
58
+ if (!where)
59
+ return true;
60
+ return this.evalWhere(where, { row, parent, bindings: parent.bindings });
61
+ }
62
+ rowsOf(v) {
63
+ return Array.from(this.ctx.toRows(v));
64
+ }
65
+ child(row, parent) {
66
+ return { row, parent, bindings: parent.bindings };
67
+ }
68
+ // ---- follow ---------------------------------------------------------------
69
+ runFollow(query, rows, root) {
70
+ const { seed, post } = query.where ? partitionRecur(query.where) : { seed: null, post: null };
71
+ const seeds = seed ? rows.filter((r) => this.matches(seed, r, root)) : rows;
72
+ const occ = this.followWalk(seeds, query.follow, root);
73
+ let scopes = occ.map((o) => ({ row: o.row, parent: root, bindings: root.bindings, lifts: {}, meta: o.meta }));
74
+ if (post)
75
+ scopes = scopes.filter((s) => this.evalWhere(post, s));
76
+ this.sortScopes(scopes, query.orderBy);
77
+ return this.shape(query.consumer, scopes, query.select);
78
+ }
79
+ followWalk(seedRows, follow, parent) {
80
+ const cap = follow.depth ?? HARD_DEPTH_CAP;
81
+ const idOf = (row) => follow.by ? this.evalExpr(follow.by, { row, parent, bindings: parent.bindings }) : this.ctx.identity(row);
82
+ const occ = [];
83
+ const seen = new Set();
84
+ let level = seedRows.map((r) => ({ row: r, depth: 1 }));
85
+ while (level.length > 0) {
86
+ const next = [];
87
+ for (const cur of level) {
88
+ const key = idOf(cur.row);
89
+ if (seen.has(key))
90
+ continue;
91
+ seen.add(key);
92
+ const s = { row: cur.row, parent, bindings: parent.bindings };
93
+ const raw = this.rowsOf(this.evalExpr(follow.receiver, s));
94
+ const succ = follow.where
95
+ ? raw.filter((x) => truthy(this.evalExpr(follow.where, { row: x, parent, bindings: parent.bindings })))
96
+ : raw;
97
+ const atCap = cur.depth >= cap;
98
+ const frontierHit = follow.frontier ? truthy(this.evalExpr(follow.frontier, s)) : false;
99
+ const isLeaf = succ.length === 0;
100
+ const stop = frontierHit ? "frontier" : atCap ? "depth" : isLeaf ? "leaf" : "continue";
101
+ occ.push({ row: cur.row, meta: { $depth: cur.depth, $stop: stop, $leaf: isLeaf, $frontier: frontierHit } });
102
+ if (!atCap && !frontierHit && !isLeaf)
103
+ for (const x of succ)
104
+ next.push({ row: x, depth: cur.depth + 1 });
105
+ }
106
+ level = next;
107
+ }
108
+ return occ;
109
+ }
110
+ // ---- consumer shaping -----------------------------------------------------
111
+ shape(consumer, scopes, select) {
112
+ switch (consumer) {
113
+ case "exists": return { consumer, exists: scopes.length > 0 };
114
+ case "count": return { consumer, count: scopes.length };
115
+ case "collect": return { consumer, rows: scopes.map((s) => this.projectRow(select, s)) };
116
+ case "first": return { consumer, row: scopes.length > 0 ? this.projectRow(select, scopes[0]) : null };
117
+ case "single":
118
+ if (scopes.length > 1)
119
+ throw new OqxError(`single { … } matched ${scopes.length} rows; use first { … } for zero-or-one`, "eval");
120
+ return { consumer, row: scopes.length > 0 ? this.projectRow(select, scopes[0]) : null };
121
+ }
122
+ }
123
+ projectRow(select, scope) {
124
+ if (select.length === 0)
125
+ return scope.row;
126
+ const out = {};
127
+ for (const item of select) {
128
+ out[item.name] = item.kind === "field" ? this.evalExpr(item.expr, scope) : this.evalCollectValue(item.op, scope);
129
+ }
130
+ return out;
131
+ }
132
+ // ---- where evaluation -----------------------------------------------------
133
+ evalWhere(w, scope) {
134
+ switch (w.kind) {
135
+ case "and": {
136
+ // Cheap scalar leaves before expensive consumer ops; `.every` short-circuits.
137
+ for (const p of orderByCost(w.parts))
138
+ if (!this.evalWhere(p, scope))
139
+ return false;
140
+ return true;
141
+ }
142
+ case "or": return w.parts.some((p) => this.evalWhere(p, scope));
143
+ case "not": return !this.evalWhere(w.expr, scope);
144
+ case "scalar": return truthy(this.evalExpr(w.expr, scope));
145
+ case "op": return this.evalWhereOp(w, scope);
146
+ }
147
+ }
148
+ evalWhereOp(op, scope) {
149
+ if (op.sub.follow)
150
+ throw new OqxError("`follow` is only valid on a select-position collect { … }, not a where op", "eval");
151
+ if (op.op === "exists")
152
+ return this.anyMatch(op, scope);
153
+ if (op.op === "collect") {
154
+ const matched = this.matchRows(op, scope);
155
+ for (const item of op.sub.select) {
156
+ if (item.kind !== "field")
157
+ continue;
158
+ // Bind `item.lift` scopes out: `^` = the collect's own scope, `^^` its
159
+ // parent, etc. Values flatten-append into the target scope, so repeated
160
+ // evaluations (a deeper lift fanning out through intermediate scopes)
161
+ // accumulate into one flat list rather than overwriting.
162
+ let target = scope;
163
+ for (let i = 1; i < item.lift && target.parent; i++)
164
+ target = target.parent;
165
+ const lifts = (target.lifts ??= {});
166
+ const prior = Array.isArray(lifts[item.name]) ? lifts[item.name] : [];
167
+ lifts[item.name] = prior.concat(matched.map((s) => this.evalExpr(item.expr, s)));
168
+ }
169
+ return matched.length > 0;
170
+ }
171
+ if (op.op === "count") {
172
+ const n = this.matchRows(op, scope).length;
173
+ return op.countCmp ? compareCount(n, op.countCmp) : n > 0;
174
+ }
175
+ return this.matchRows(op, scope).length > 0;
176
+ }
177
+ // Short-circuiting existence check over a consumer receiver.
178
+ anyMatch(op, scope) {
179
+ for (const s of this.iterMatchRows(op, scope)) {
180
+ void s;
181
+ return true;
182
+ }
183
+ return false;
184
+ }
185
+ *iterMatchRows(op, scope) {
186
+ let rows = this.rowsOf(this.evalExpr(op.receiver, scope));
187
+ for (const proj of op.sub.from)
188
+ rows = rows.flatMap((r) => this.rowsOf(this.evalExpr(proj, this.child(r, scope))));
189
+ for (const r of rows) {
190
+ const s = { row: r, parent: scope, bindings: scope.bindings, lifts: {} };
191
+ if (!op.sub.where || this.evalWhere(op.sub.where, s))
192
+ yield s;
193
+ }
194
+ }
195
+ matchRows(op, scope) {
196
+ return Array.from(this.iterMatchRows(op, scope));
197
+ }
198
+ // A select-position collect/first/single, optionally recursive via `follow`.
199
+ evalCollectValue(op, scope) {
200
+ const sub = op.sub;
201
+ let scopes;
202
+ if (sub.follow) {
203
+ let rows = this.rowsOf(this.evalExpr(op.receiver, scope));
204
+ for (const proj of sub.from)
205
+ rows = rows.flatMap((r) => this.rowsOf(this.evalExpr(proj, this.child(r, scope))));
206
+ const seeds = sub.where ? rows.filter((r) => this.evalWhere(sub.where, { row: r, parent: scope, bindings: scope.bindings, lifts: {} })) : rows;
207
+ scopes = this.followWalk(seeds, sub.follow, scope).map((o) => ({ row: o.row, parent: scope, bindings: scope.bindings, meta: o.meta }));
208
+ }
209
+ else {
210
+ scopes = this.matchRows(op, scope);
211
+ }
212
+ this.sortScopes(scopes, sub.orderBy);
213
+ switch (op.op) {
214
+ case "collect": return scopes.map((s) => this.projectRow(sub.select, s));
215
+ case "first": return scopes.length > 0 ? this.projectRow(sub.select, scopes[0]) : null;
216
+ case "single":
217
+ if (scopes.length > 1)
218
+ throw new OqxError(`single { … } for '${describeReceiver(op.receiver)}' matched ${scopes.length} rows`, "eval");
219
+ return scopes.length > 0 ? this.projectRow(sub.select, scopes[0]) : null;
220
+ default: throw new OqxError(`${op.op} { … } is not valid in select position`, "eval");
221
+ }
222
+ }
223
+ // ---- ordering -------------------------------------------------------------
224
+ sortScopes(scopes, orderBy) {
225
+ if (!orderBy || orderBy.length === 0)
226
+ return;
227
+ scopes.sort((a, b) => {
228
+ for (const spec of orderBy) {
229
+ const av = this.evalExpr(spec.expr, a);
230
+ const bv = this.evalExpr(spec.expr, b);
231
+ // Absent (null/undefined) sorts LAST regardless of direction: `desc`
232
+ // reverses the ordering of PRESENT values only, and must not hoist rows
233
+ // that lack the sort key to the top. (Negating the direction over
234
+ // `compareForSort`'s absent-handling result would flip absent-last to
235
+ // absent-first under `desc` — the bug this guards against.)
236
+ const an = av == null, bn = bv == null;
237
+ if (an && bn)
238
+ continue;
239
+ if (an)
240
+ return 1;
241
+ if (bn)
242
+ return -1;
243
+ const c = compareForSort(av, bv);
244
+ if (c !== 0)
245
+ return spec.desc ? -c : c;
246
+ }
247
+ return 0;
248
+ });
249
+ }
250
+ // ---- scalar expression evaluation -----------------------------------------
251
+ evalExpr(e, scope) {
252
+ switch (e.kind) {
253
+ case "lit": return e.value;
254
+ case "binding": return scope.bindings[e.index];
255
+ case "ident": return this.resolveFrom(e.name, scope);
256
+ case "outer": {
257
+ let s = scope;
258
+ for (let i = 0; i < e.levels && s; i++)
259
+ s = s.parent;
260
+ return s ? this.resolveFrom(e.name, s) : undefined;
261
+ }
262
+ case "member": {
263
+ const r = this.evalExpr(e.recv, scope);
264
+ return r == null ? undefined : this.ctx.get(r, e.name);
265
+ }
266
+ case "index": {
267
+ const r = this.evalExpr(e.recv, scope);
268
+ const i = this.evalExpr(e.index, scope);
269
+ return r == null ? undefined : this.ctx.get(r, String(i));
270
+ }
271
+ case "call": return this.evalCall(e, scope);
272
+ case "unary":
273
+ return e.op === "!" ? !truthy(this.evalExpr(e.expr, scope)) : -toNumber(this.evalExpr(e.expr, scope));
274
+ case "binary": {
275
+ const l = this.evalExpr(e.left, scope);
276
+ const r = this.evalExpr(e.right, scope);
277
+ return isRelOp(e.op) ? relate(e.op, l, r) : arith(e.op, l, r);
278
+ }
279
+ case "logical": {
280
+ const l = this.evalExpr(e.left, scope);
281
+ if (e.op === "&&")
282
+ return truthy(l) ? this.evalExpr(e.right, scope) : l;
283
+ return truthy(l) ? l : this.evalExpr(e.right, scope);
284
+ }
285
+ case "in": return membership(this.evalExpr(e.left, scope), this.evalExpr(e.right, scope));
286
+ }
287
+ }
288
+ // Resolve a bare name starting at `start` and climbing enclosing scopes: `^`
289
+ // outer references reuse this after skipping the requested number of scopes.
290
+ resolveFrom(name, start) {
291
+ if (RECUR.has(name)) {
292
+ for (let s = start; s; s = s.parent)
293
+ if (s.meta && name in s.meta)
294
+ return s.meta[name];
295
+ return undefined;
296
+ }
297
+ for (let s = start; s; s = s.parent) {
298
+ if (s.lifts && name in s.lifts)
299
+ return s.lifts[name];
300
+ if (s.parent === null) {
301
+ const v = this.ctx.root(name);
302
+ if (v !== undefined)
303
+ return v;
304
+ }
305
+ else if (this.has(s.row, name)) {
306
+ return this.ctx.get(s.row, name);
307
+ }
308
+ }
309
+ return undefined;
310
+ }
311
+ has(row, name) {
312
+ if (this.ctx.has)
313
+ return this.ctx.has(row, name);
314
+ return row != null && typeof row === "object" && name in row;
315
+ }
316
+ evalCall(e, scope) {
317
+ const args = e.args.map((a) => this.evalExpr(a, scope));
318
+ if (e.recv === null) {
319
+ const r = this.ctx.callFunction?.(e.name, args);
320
+ if (r?.handled)
321
+ return r.value;
322
+ throw new OqxError(`unknown function '${e.name}(…)'`, "eval");
323
+ }
324
+ const recv = this.evalExpr(e.recv, scope);
325
+ const r = this.ctx.callMethod?.(e.name, recv, args);
326
+ if (r?.handled)
327
+ return r.value;
328
+ throw new OqxError(`unknown method '.${e.name}(…)'`, "eval");
329
+ }
330
+ }
331
+ // ---- free helpers -----------------------------------------------------------
332
+ function isRelOp(op) {
333
+ return op === "==" || op === "!=" || op === "<" || op === "<=" || op === ">" || op === ">=";
334
+ }
335
+ function compareCount(n, cmp) {
336
+ return relate(cmp.op, n, cmp.value);
337
+ }
338
+ // Order `&&` conjuncts so cheap scalar leaves run before consumer-op leaves.
339
+ function orderByCost(parts) {
340
+ return [...parts].sort((a, b) => whereCost(a) - whereCost(b));
341
+ }
342
+ function whereCost(w) {
343
+ switch (w.kind) {
344
+ case "op": return 2;
345
+ case "and":
346
+ case "or": return Math.max(0, ...w.parts.map(whereCost));
347
+ case "not": return whereCost(w.expr);
348
+ case "scalar": return 0;
349
+ }
350
+ }
351
+ function describeReceiver(e) {
352
+ if (e.kind === "ident")
353
+ return e.name;
354
+ if (e.kind === "member")
355
+ return `${describeReceiver(e.recv)}.${e.name}`;
356
+ if (e.kind === "binding")
357
+ return `\${${e.index}}`;
358
+ return "receiver";
359
+ }
360
+ function partitionRecur(w) {
361
+ const parts = w.kind === "and" ? w.parts : [w];
362
+ const seed = [];
363
+ const post = [];
364
+ for (const p of parts)
365
+ (whereHasRecur(p) ? post : seed).push(p);
366
+ const rebuild = (ps) => (ps.length === 0 ? null : ps.length === 1 ? ps[0] : { kind: "and", parts: ps });
367
+ return { seed: rebuild(seed), post: rebuild(post) };
368
+ }
369
+ function whereHasRecur(w) {
370
+ switch (w.kind) {
371
+ case "and":
372
+ case "or": return w.parts.some(whereHasRecur);
373
+ case "not": return whereHasRecur(w.expr);
374
+ case "scalar": return exprHasRecur(w.expr);
375
+ case "op": return false;
376
+ }
377
+ }
378
+ function exprHasRecur(e) {
379
+ switch (e.kind) {
380
+ case "ident": return RECUR.has(e.name);
381
+ case "member": return exprHasRecur(e.recv);
382
+ case "index": return exprHasRecur(e.recv) || exprHasRecur(e.index);
383
+ case "call": return (e.recv ? exprHasRecur(e.recv) : false) || e.args.some(exprHasRecur);
384
+ case "unary": return exprHasRecur(e.expr);
385
+ case "binary":
386
+ case "logical":
387
+ case "in": return exprHasRecur(e.left) || exprHasRecur(e.right);
388
+ default: return false;
389
+ }
390
+ }
391
+ /** Convenience: run a query with plain-object roots (the default context). */
392
+ export function runQuery(query, bindings, roots) {
393
+ const ctx = new DefaultContext(roots ?? {});
394
+ return new InMemoryEngine(ctx).run(query, bindings);
395
+ }
396
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type OqxStage = "lex" | "parse" | "eval";
2
+ export declare class OqxError extends Error {
3
+ readonly stage: OqxStage;
4
+ constructor(message: string, stage: OqxStage);
5
+ }
6
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;CAK7C"}
package/dist/errors.js ADDED
@@ -0,0 +1,13 @@
1
+ // A single error type for every OQX failure — lex, parse, and evaluation. `stage`
2
+ // distinguishes where it came from so callers (and tests) can branch without
3
+ // string-matching messages. Mirrors the reference impl's FilterInvalid, but the
4
+ // generic kernel has no SQL/CEL layer to name.
5
+ export class OqxError extends Error {
6
+ stage;
7
+ constructor(message, stage) {
8
+ super(message);
9
+ this.name = "OqxError";
10
+ this.stage = stage;
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,6EAA6E;AAC7E,gFAAgF;AAChF,+CAA+C;AAI/C,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,KAAK,CAAW;IACzB,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import type { Query } from "./ast.js";
2
+ import type { Engine, OqxResult } from "./engine.js";
3
+ import type { DataContext } from "./context.js";
4
+ export { OqxError } from "./errors.js";
5
+ export type { OqxResult, Engine } from "./engine.js";
6
+ export { InMemoryEngine, runQuery } from "./engine.js";
7
+ export type { DataContext, CallResult } from "./context.js";
8
+ export { DefaultContext } from "./context.js";
9
+ export type { QueryPlanner, Plan } from "./planner.js";
10
+ export { PlannedEngine } from "./planner.js";
11
+ export { IndexedCollection } from "./adapters/indexed.js";
12
+ export { ROWS_ROOT, partitionPushable, residualQuery, asEquality, isConst, constValue } from "./plan.js";
13
+ export * as semantics from "./semantics.js";
14
+ export type * from "./ast.js";
15
+ /** The OQX tagged template. Returns the query result shaped by its consumer:
16
+ * an array for `collect` (the default), a boolean for `exists`, a number for
17
+ * `count`, or a single record / null for `first` / `single`. */
18
+ export declare function oqx(strings: TemplateStringsArray, ...values: unknown[]): unknown;
19
+ /** Parse a query string into a reusable AST. */
20
+ export declare function parse(source: string): Query;
21
+ /** Run a string query against a data context of named roots (e.g. `{ people }`,
22
+ * so `from people` resolves), returning the consumer-shaped result. */
23
+ export declare function execute(source: string, roots?: Record<string, unknown>): unknown;
24
+ /** Run a pre-parsed query with explicit bindings and/or a backend, returning the
25
+ * full discriminated result. Provide `engine` (any `Engine`), or `context` (a
26
+ * `DataContext`, run in-memory), or `roots` (plain-object named roots). */
27
+ export declare function run(query: Query, opts?: {
28
+ values?: readonly unknown[];
29
+ roots?: Record<string, unknown>;
30
+ context?: DataContext;
31
+ engine?: Engine;
32
+ }): OqxResult;
33
+ export default oqx;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACzG,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,mBAAmB,UAAU,CAAC;AAM9B;;gEAEgE;AAChE,wBAAgB,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAOhF;AAED,gDAAgD;AAChD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAE3C;AAED;uEACuE;AACvE,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAEhF;AAED;;2EAE2E;AAC3E,wBAAgB,GAAG,CACjB,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAClH,SAAS,CAKX;AAWD,eAAe,GAAG,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,74 @@
1
+ // OQX for JavaScript — a generic object-query language.
2
+ //
3
+ // The primary API is a tagged template:
4
+ //
5
+ // const employees = oqx`
6
+ // name, id, title
7
+ // from ${people}
8
+ // where jobs exists { employer == ${company} && !end_date }
9
+ // `;
10
+ //
11
+ // Interpolations cross the host/OQX boundary as typed VALUE bindings, never as
12
+ // source text (prepared-statement semantics).
13
+ //
14
+ // The engine is layered so OQX can be a foundation for other query systems:
15
+ // • tier 1 — `InMemoryEngine` over a `DataContext` (this file's default);
16
+ // • tier 2 — a custom `DataContext` binds any data model (ORM, remote, …);
17
+ // • tier 3 — a `QueryPlanner` pushes work into a store (see `oqx/sqlite`),
18
+ // with `PlannedEngine` finishing the residual in-memory.
19
+ // All backends must obey the scalar rules in `./semantics.ts` (the conformance
20
+ // suite verifies this).
21
+ import { parseTemplate, parseString } from "./parser.js";
22
+ import { InMemoryEngine, runQuery } from "./engine.js";
23
+ import { DefaultContext } from "./context.js";
24
+ export { OqxError } from "./errors.js";
25
+ export { InMemoryEngine, runQuery } from "./engine.js";
26
+ export { DefaultContext } from "./context.js";
27
+ export { PlannedEngine } from "./planner.js";
28
+ export { IndexedCollection } from "./adapters/indexed.js";
29
+ export { ROWS_ROOT, partitionPushable, residualQuery, asEquality, isConst, constValue } from "./plan.js";
30
+ export * as semantics from "./semantics.js";
31
+ // Compiled-query cache keyed by the template's stable `strings` identity, so the
32
+ // same call site parses once and re-runs with fresh bindings.
33
+ const templateCache = new WeakMap();
34
+ /** The OQX tagged template. Returns the query result shaped by its consumer:
35
+ * an array for `collect` (the default), a boolean for `exists`, a number for
36
+ * `count`, or a single record / null for `first` / `single`. */
37
+ export function oqx(strings, ...values) {
38
+ let query = templateCache.get(strings);
39
+ if (!query) {
40
+ query = parseTemplate(strings, values.length);
41
+ templateCache.set(strings, query);
42
+ }
43
+ return unwrap(runQuery(query, values, undefined));
44
+ }
45
+ /** Parse a query string into a reusable AST. */
46
+ export function parse(source) {
47
+ return parseString(source);
48
+ }
49
+ /** Run a string query against a data context of named roots (e.g. `{ people }`,
50
+ * so `from people` resolves), returning the consumer-shaped result. */
51
+ export function execute(source, roots) {
52
+ return unwrap(runQuery(parseString(source), [], roots));
53
+ }
54
+ /** Run a pre-parsed query with explicit bindings and/or a backend, returning the
55
+ * full discriminated result. Provide `engine` (any `Engine`), or `context` (a
56
+ * `DataContext`, run in-memory), or `roots` (plain-object named roots). */
57
+ export function run(query, opts = {}) {
58
+ const values = opts.values ?? [];
59
+ if (opts.engine)
60
+ return opts.engine.run(query, values);
61
+ const context = opts.context ?? new DefaultContext(opts.roots ?? {});
62
+ return new InMemoryEngine(context).run(query, values);
63
+ }
64
+ function unwrap(result) {
65
+ switch (result.consumer) {
66
+ case "collect": return result.rows;
67
+ case "exists": return result.exists;
68
+ case "count": return result.count;
69
+ case "first":
70
+ case "single": return result.row;
71
+ }
72
+ }
73
+ export default oqx;
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type TokType = "ident" | "kw" | "string" | "number" | "lparen" | "rparen" | "lbrace" | "rbrace" | "comma" | "colon" | "caret" | "dot" | "op" | "binding" | "eof";
2
+ export interface Token {
3
+ type: TokType;
4
+ value: string;
5
+ pos: number;
6
+ index?: number;
7
+ }
8
+ /** Lex a tagged-template call: the cooked string fragments and the count of
9
+ * interpolated values. Emits a single flat token stream with `binding` tokens
10
+ * (index 0..values-1) between fragments, terminated by `eof`. */
11
+ export declare function lexTemplate(fragments: readonly string[], values: number): Token[];
12
+ /** Lex a plain string (no bindings) — used by the string entry point. */
13
+ export declare function lexString(src: string): Token[];
14
+ /** A human-readable reconstruction of the query source, with `${N}` markers where
15
+ * bindings were, for error messages. */
16
+ export declare function rawSource(fragments: readonly string[]): string;
17
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,OAAO,GACf,OAAO,GACP,IAAI,GACJ,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,OAAO,GACP,OAAO,GACP,KAAK,GACL,IAAI,GACJ,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD;;iEAEiE;AACjE,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAkBjF;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,CAK9C;AA2FD;wCACwC;AACxC,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE9D"}