@omgbase/oqx 0.10.1 → 0.12.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 +170 -0
- package/README.md +142 -33
- package/dist/context.d.ts +18 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +21 -9
- package/dist/context.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +80 -61
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lexer.d.ts.map +1 -1
- package/dist/lexer.js +47 -21
- package/dist/lexer.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +356 -163
- package/dist/parser.js.map +1 -1
- package/dist/regex.d.ts +19 -0
- package/dist/regex.d.ts.map +1 -0
- package/dist/regex.js +0 -0
- package/dist/regex.js.map +1 -0
- package/dist/semantics.d.ts +37 -9
- package/dist/semantics.d.ts.map +1 -1
- package/dist/semantics.js +138 -36
- package/dist/semantics.js.map +1 -1
- package/package.json +8 -5
- package/src/context.ts +34 -9
- package/src/engine.ts +81 -60
- package/src/index.ts +7 -1
- package/src/lexer.ts +44 -14
- package/src/parser.ts +340 -119
- package/src/regex.ts +0 -0
- package/src/semantics.ts +128 -31
package/dist/semantics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantics.js","sourceRoot":"","sources":["../src/semantics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"semantics.js","sourceRoot":"","sources":["../src/semantics.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.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "OQX (omgbase Query eXpressions): a composable query language and engine for JavaScript collections",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"query",
|
|
@@ -15,13 +15,14 @@
|
|
|
15
15
|
],
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"author": "Brendan Baldwin",
|
|
18
|
-
"homepage": "https://github.com/omgbase/oqx#readme",
|
|
18
|
+
"homepage": "https://github.com/omgbase/omgbase/tree/main/packages/oqx#readme",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/omgbase/
|
|
21
|
+
"url": "git+https://github.com/omgbase/omgbase.git",
|
|
22
|
+
"directory": "packages/oqx"
|
|
22
23
|
},
|
|
23
24
|
"bugs": {
|
|
24
|
-
"url": "https://github.com/omgbase/
|
|
25
|
+
"url": "https://github.com/omgbase/omgbase/issues"
|
|
25
26
|
},
|
|
26
27
|
"type": "module",
|
|
27
28
|
"sideEffects": false,
|
|
@@ -53,7 +54,9 @@
|
|
|
53
54
|
"clean": "rm -rf dist",
|
|
54
55
|
"test": "node --test test/*.test.ts",
|
|
55
56
|
"typecheck": "tsc --noEmit",
|
|
56
|
-
"
|
|
57
|
+
"lint": "eslint .",
|
|
58
|
+
"lint:fix": "eslint . --fix",
|
|
59
|
+
"prepublishOnly": "pnpm run build"
|
|
57
60
|
},
|
|
58
61
|
"devDependencies": {
|
|
59
62
|
"@types/node": "^22.20.2",
|
package/src/context.ts
CHANGED
|
@@ -8,7 +8,14 @@
|
|
|
8
8
|
// (Performant execution over a real store is the tier-3 seam — see planner.ts —
|
|
9
9
|
// which pushes work into the store instead of driving it row-by-row here.)
|
|
10
10
|
|
|
11
|
-
import { coerceCollection, BUILTIN_FUNCTIONS, BUILTIN_METHODS } from "./semantics.ts";
|
|
11
|
+
import { coerceCollection, regexMatches, BUILTIN_FUNCTIONS, BUILTIN_METHODS } from "./semantics.ts";
|
|
12
|
+
import type { RegexDialect } from "./regex.ts";
|
|
13
|
+
|
|
14
|
+
// An array's only properties are its integer indices, spelled canonically
|
|
15
|
+
// (`"0"`, `"12"`; never `"01"`, `"length"`, or a method name).
|
|
16
|
+
function isIndexKey(key: string): boolean {
|
|
17
|
+
return /^(0|[1-9]\d*)$/.test(key);
|
|
18
|
+
}
|
|
12
19
|
|
|
13
20
|
/** Result of a context-provided function/method call: `handled: false` tells the
|
|
14
21
|
* engine to fall back to the builtin table (or error if none). */
|
|
@@ -33,25 +40,42 @@ export interface DataContext {
|
|
|
33
40
|
callFunction?(name: string, args: unknown[]): CallResult;
|
|
34
41
|
/** Optional custom method; return `{ handled: false }` to defer. */
|
|
35
42
|
callMethod?(name: string, recv: unknown, args: unknown[]): CallResult;
|
|
43
|
+
/** The regex dialect `matches()` compiles against. `"oqx"` (the default when
|
|
44
|
+
* absent) is the portable baseline the spec tests; `"native"` hands the
|
|
45
|
+
* pattern to the host `RegExp` unvalidated — implementation-defined, not
|
|
46
|
+
* portable. Note the engine dispatches `matches` through `callMethod`, so
|
|
47
|
+
* this is read by the context's own `matches` (`DefaultContext` does;
|
|
48
|
+
* `regexMatches(recv, args, dialect)` is the helper). `BUILTIN_METHODS.matches`
|
|
49
|
+
* is always the baseline. */
|
|
50
|
+
readonly regexDialect?: RegexDialect;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface DefaultContextOptions {
|
|
54
|
+
/** See `DataContext.regexDialect`. Default `"oqx"`. */
|
|
55
|
+
regexDialect?: RegexDialect;
|
|
36
56
|
}
|
|
37
57
|
|
|
38
58
|
/** The default context: ordinary JavaScript objects. Named roots come from a
|
|
39
|
-
* plain `{ name: collection }` map; properties are
|
|
40
|
-
*
|
|
59
|
+
* plain `{ name: collection }` map; properties are OWN keys only (an array
|
|
60
|
+
* exposes only its integer indices, a primitive has none); identity is `.id`
|
|
61
|
+
* when present, else the row itself (the engine keys it structurally). */
|
|
41
62
|
export class DefaultContext implements DataContext {
|
|
42
63
|
private roots: Record<string, unknown>;
|
|
64
|
+
readonly regexDialect: RegexDialect;
|
|
43
65
|
|
|
44
|
-
constructor(roots: Record<string, unknown> = {}) {
|
|
66
|
+
constructor(roots: Record<string, unknown> = {}, options: DefaultContextOptions = {}) {
|
|
45
67
|
this.roots = roots;
|
|
68
|
+
this.regexDialect = options.regexDialect ?? "oqx";
|
|
46
69
|
}
|
|
47
70
|
|
|
48
71
|
root(name: string): unknown {
|
|
49
|
-
return this.roots[name];
|
|
72
|
+
return Object.hasOwn(this.roots, name) ? this.roots[name] : undefined;
|
|
50
73
|
}
|
|
51
74
|
|
|
52
75
|
get(row: unknown, key: string): unknown {
|
|
53
|
-
if (row == null) return undefined;
|
|
54
|
-
|
|
76
|
+
if (row == null || typeof row !== "object") return undefined;
|
|
77
|
+
if (Array.isArray(row)) return isIndexKey(key) ? row[Number(key)] : undefined;
|
|
78
|
+
return Object.hasOwn(row, key) ? (row as Record<string, unknown>)[key] : undefined;
|
|
55
79
|
}
|
|
56
80
|
|
|
57
81
|
toRows(value: unknown): Iterable<unknown> {
|
|
@@ -64,12 +88,13 @@ export class DefaultContext implements DataContext {
|
|
|
64
88
|
}
|
|
65
89
|
|
|
66
90
|
callFunction(name: string, args: unknown[]): CallResult {
|
|
67
|
-
const fn = BUILTIN_FUNCTIONS[name];
|
|
91
|
+
const fn = Object.hasOwn(BUILTIN_FUNCTIONS, name) ? BUILTIN_FUNCTIONS[name] : undefined;
|
|
68
92
|
return fn ? { handled: true, value: fn(args) } : { handled: false };
|
|
69
93
|
}
|
|
70
94
|
|
|
71
95
|
callMethod(name: string, recv: unknown, args: unknown[]): CallResult {
|
|
72
|
-
|
|
96
|
+
if (name === "matches") return { handled: true, value: regexMatches(recv, args, this.regexDialect) };
|
|
97
|
+
const fn = Object.hasOwn(BUILTIN_METHODS, name) ? BUILTIN_METHODS[name] : undefined;
|
|
73
98
|
return fn ? { handled: true, value: fn(recv, args) } : { handled: false };
|
|
74
99
|
}
|
|
75
100
|
}
|
package/src/engine.ts
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
// interface so a pushdown planner (tier 3, planner.ts) is a drop-in alternative.
|
|
4
4
|
//
|
|
5
5
|
// Optimizations over a naive walk: `exists` short-circuits at the first match;
|
|
6
|
-
// `first
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
// `first` stops early when the result is unordered; `count` never materializes
|
|
7
|
+
// rows. (`single` always materializes, so its error reports the true row count,
|
|
8
|
+
// and `&&` evaluates strictly left to right — evaluation order is observable
|
|
9
|
+
// through errors, so the engine never reorders conjuncts.)
|
|
9
10
|
//
|
|
10
11
|
// Name resolution is strictly lexical and LOCAL: a bare identifier is read from
|
|
11
12
|
// the current scope only, and an enclosing scope is reached solely through an
|
|
@@ -19,7 +20,7 @@ import type { DataContext } from "./context.ts";
|
|
|
19
20
|
import { DefaultContext } from "./context.ts";
|
|
20
21
|
import { OqxError } from "./errors.ts";
|
|
21
22
|
import {
|
|
22
|
-
|
|
23
|
+
relate, arith, membership, truthy, compareForSort, compare, canonicalKey, makeRange, isEntry, isRange,
|
|
23
24
|
} from "./semantics.ts";
|
|
24
25
|
|
|
25
26
|
/** The shaped result of a top-level query, discriminated by consumer. */
|
|
@@ -95,11 +96,11 @@ export class InMemoryEngine implements Engine {
|
|
|
95
96
|
return { consumer: "none", none: m === 0 };
|
|
96
97
|
}
|
|
97
98
|
|
|
98
|
-
// first
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
const cap = !query.orderBy && !query.distinct
|
|
102
|
-
? bound.offset + Math.min(
|
|
99
|
+
// first over an unordered, non-distinct set needs only the rows up to the
|
|
100
|
+
// bound (offset + 1). single materializes everything so its error can
|
|
101
|
+
// report how many rows actually matched.
|
|
102
|
+
const cap = query.consumer === "first" && !query.orderBy && !query.distinct
|
|
103
|
+
? bound.offset + Math.min(1, bound.limit ?? 1)
|
|
103
104
|
: Infinity;
|
|
104
105
|
let kept: Scope[] = [];
|
|
105
106
|
for (const r of rows) {
|
|
@@ -180,14 +181,16 @@ export class InMemoryEngine implements Engine {
|
|
|
180
181
|
|
|
181
182
|
// Dedup scopes by their PROJECTED value (`distinct`): keep the first scope per
|
|
182
183
|
// distinct projection, preserving order. An empty projection dedups by row
|
|
183
|
-
// identity (so `count distinct { }` counts distinct rows).
|
|
184
|
+
// identity (so `count distinct { }` counts distinct rows). Both keys are
|
|
185
|
+
// structural (`canonicalKey`): absent ≡ null, key order ignored, types kept
|
|
186
|
+
// apart — never a host `String()`.
|
|
184
187
|
private dedupByProjection(scopes: Scope[], proj: Projection): Scope[] {
|
|
185
188
|
const seen = new Set<string>();
|
|
186
189
|
const out: Scope[] = [];
|
|
187
190
|
for (const s of scopes) {
|
|
188
191
|
const key = proj.select.length === 0
|
|
189
|
-
? `i:${
|
|
190
|
-
: `p:${
|
|
192
|
+
? `i:${canonicalKey(this.ctx.identity(s.row))}`
|
|
193
|
+
: `p:${canonicalKey(this.projectRow(proj, s))}`;
|
|
191
194
|
if (seen.has(key)) continue;
|
|
192
195
|
seen.add(key);
|
|
193
196
|
out.push(s);
|
|
@@ -207,12 +210,14 @@ export class InMemoryEngine implements Engine {
|
|
|
207
210
|
// • `$leaf` = (stop == leaf); `$frontier` = (stop ∈ {frontier, depth}) — the
|
|
208
211
|
// "there is unfollowed graph beyond me" signal;
|
|
209
212
|
// • identity for cycle detection + `distinct` is `by <expr>` when given, else
|
|
210
|
-
// `ctx.identity(row)
|
|
213
|
+
// `ctx.identity(row)` (an entry's identity is its value's); identities are
|
|
214
|
+
// compared structurally via `canonicalKey`, and `$ordinal` paths compare
|
|
215
|
+
// component-wise (`comparePath`), so `10` follows `9`.
|
|
211
216
|
private followWalk(seedRows: unknown[], follow: Follow, parent: Scope): Occurrence[] {
|
|
212
217
|
const cap = follow.depth ?? HARD_DEPTH_CAP;
|
|
213
218
|
const scopeFor = (row: unknown): Scope => this.enter(row, parent);
|
|
214
|
-
const
|
|
215
|
-
|
|
219
|
+
const identityOf = (row: unknown): unknown =>
|
|
220
|
+
follow.by ? this.evalExpr(follow.by, scopeFor(row)) : this.ctx.identity(isEntry(row) ? row.value : row);
|
|
216
221
|
const succOf = (row: unknown): unknown[] => {
|
|
217
222
|
const raw = this.rowsOf(this.evalExpr(follow.receiver, scopeFor(row)));
|
|
218
223
|
return follow.where ? raw.filter((x) => truthy(this.evalExpr(follow.where!, scopeFor(x)))) : raw;
|
|
@@ -220,12 +225,13 @@ export class InMemoryEngine implements Engine {
|
|
|
220
225
|
const frontierHit = (row: unknown): boolean =>
|
|
221
226
|
follow.frontier ? truthy(this.evalExpr(follow.frontier, scopeFor(row))) : false;
|
|
222
227
|
|
|
223
|
-
interface Walked { row: unknown; depth: number; path:
|
|
228
|
+
interface Walked { row: unknown; depth: number; path: unknown[]; key: string; stop: string; }
|
|
224
229
|
const walked: Walked[] = [];
|
|
225
230
|
|
|
226
|
-
const visit = (row: unknown, depth: number, ancestors: string[]): void => {
|
|
227
|
-
const
|
|
228
|
-
const
|
|
231
|
+
const visit = (row: unknown, depth: number, ancestors: string[], ancestorIds: unknown[]): void => {
|
|
232
|
+
const id = identityOf(row);
|
|
233
|
+
const key = canonicalKey(id);
|
|
234
|
+
const path = [...ancestorIds, id];
|
|
229
235
|
let stop: string;
|
|
230
236
|
if (ancestors.includes(key)) stop = "cycle";
|
|
231
237
|
else if (frontierHit(row)) stop = "frontier";
|
|
@@ -235,13 +241,13 @@ export class InMemoryEngine implements Engine {
|
|
|
235
241
|
if (succ.length === 0) stop = "leaf";
|
|
236
242
|
else {
|
|
237
243
|
walked.push({ row, depth, path, key, stop: "interior" });
|
|
238
|
-
for (const s of succ) visit(s, depth + 1, [...ancestors, key]);
|
|
244
|
+
for (const s of succ) visit(s, depth + 1, [...ancestors, key], path);
|
|
239
245
|
return;
|
|
240
246
|
}
|
|
241
247
|
}
|
|
242
248
|
walked.push({ row, depth, path, key, stop });
|
|
243
249
|
};
|
|
244
|
-
for (const r of seedRows) visit(r, 1, []);
|
|
250
|
+
for (const r of seedRows) visit(r, 1, [], []);
|
|
245
251
|
|
|
246
252
|
let rows = walked;
|
|
247
253
|
if (follow.distinct) {
|
|
@@ -249,12 +255,12 @@ export class InMemoryEngine implements Engine {
|
|
|
249
255
|
const best = new Map<string, Walked>();
|
|
250
256
|
for (const w of rows) {
|
|
251
257
|
const prev = best.get(w.key);
|
|
252
|
-
if (!prev || w.depth < prev.depth || (w.depth === prev.depth && w.path
|
|
258
|
+
if (!prev || w.depth < prev.depth || (w.depth === prev.depth && comparePath(w.path, prev.path) < 0)) best.set(w.key, w);
|
|
253
259
|
}
|
|
254
260
|
rows = [...best.values()];
|
|
255
261
|
}
|
|
256
262
|
// $ordinal: a deterministic 1..N rank over (depth, path).
|
|
257
|
-
rows = rows.slice().sort((a, b) => a.depth - b.depth || (a.path
|
|
263
|
+
rows = rows.slice().sort((a, b) => a.depth - b.depth || comparePath(a.path, b.path));
|
|
258
264
|
return rows.map((w, i) => ({
|
|
259
265
|
row: w.row,
|
|
260
266
|
meta: {
|
|
@@ -283,13 +289,14 @@ export class InMemoryEngine implements Engine {
|
|
|
283
289
|
}
|
|
284
290
|
|
|
285
291
|
// The per-row result: the raw row (empty projection), the single item's value
|
|
286
|
-
// itself (`values` mode), or a `{ name: value }` record.
|
|
292
|
+
// itself (`values` mode), or a `{ name: value }` record. A range is an
|
|
293
|
+
// evaluation-time value only and never appears in a result.
|
|
287
294
|
private projectRow(proj: Projection, scope: Scope): unknown {
|
|
288
295
|
const { select } = proj;
|
|
289
|
-
if (select.length === 0) return scope.row;
|
|
290
|
-
if (proj.values) return this.itemValue(select[0]!, scope);
|
|
296
|
+
if (select.length === 0) return noRange(scope.row);
|
|
297
|
+
if (proj.values) return noRange(this.itemValue(select[0]!, scope));
|
|
291
298
|
const out: Record<string, unknown> = {};
|
|
292
|
-
for (const item of select) out[item.name] = this.itemValue(item, scope);
|
|
299
|
+
for (const item of select) out[item.name] = noRange(this.itemValue(item, scope));
|
|
293
300
|
return out;
|
|
294
301
|
}
|
|
295
302
|
|
|
@@ -301,11 +308,9 @@ export class InMemoryEngine implements Engine {
|
|
|
301
308
|
|
|
302
309
|
private evalWhere(w: Where, scope: Scope): boolean {
|
|
303
310
|
switch (w.kind) {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
return true;
|
|
308
|
-
}
|
|
311
|
+
// Strictly left to right, short-circuiting: `false && f()` never evaluates
|
|
312
|
+
// `f()`, so a query may guard an expensive or failing operand by position.
|
|
313
|
+
case "and": return w.parts.every((p) => this.evalWhere(p, scope));
|
|
309
314
|
case "or": return w.parts.some((p) => this.evalWhere(p, scope));
|
|
310
315
|
case "not": return !this.evalWhere(w.expr, scope);
|
|
311
316
|
case "scalar": return truthy(this.evalExpr(w.expr, scope));
|
|
@@ -427,7 +432,11 @@ export class InMemoryEngine implements Engine {
|
|
|
427
432
|
private evalExpr(e: Expr, scope: Scope): unknown {
|
|
428
433
|
switch (e.kind) {
|
|
429
434
|
case "lit": return e.value;
|
|
430
|
-
case "binding":
|
|
435
|
+
case "binding":
|
|
436
|
+
if (e.index >= scope.bindings.length) {
|
|
437
|
+
throw new OqxError(`binding \${${e.index}} is out of range: the query references ${e.index + 1} value${e.index === 0 ? "" : "s"} but ${scope.bindings.length} ${scope.bindings.length === 1 ? "was" : "were"} given`, "eval");
|
|
438
|
+
}
|
|
439
|
+
return scope.bindings[e.index];
|
|
431
440
|
case "ident": return this.resolveIn(e.name, scope);
|
|
432
441
|
case "outer": {
|
|
433
442
|
// `^name` reads from EXACTLY `levels` scopes out — the target scope is
|
|
@@ -446,8 +455,11 @@ export class InMemoryEngine implements Engine {
|
|
|
446
455
|
return r == null ? undefined : this.ctx.get(r, String(i));
|
|
447
456
|
}
|
|
448
457
|
case "call": return this.evalCall(e, scope);
|
|
449
|
-
case "unary":
|
|
450
|
-
|
|
458
|
+
case "unary": {
|
|
459
|
+
const v = this.evalExpr(e.expr, scope);
|
|
460
|
+
if (e.op === "!") return !truthy(v);
|
|
461
|
+
return v == null ? undefined : -(v as number);
|
|
462
|
+
}
|
|
451
463
|
case "binary": {
|
|
452
464
|
const l = this.evalExpr(e.left, scope);
|
|
453
465
|
const r = this.evalExpr(e.right, scope);
|
|
@@ -483,7 +495,7 @@ export class InMemoryEngine implements Engine {
|
|
|
483
495
|
private resolveIn(name: string, scope: Scope): unknown {
|
|
484
496
|
if (name === "$value") return scope.parent === null ? undefined : scope.row;
|
|
485
497
|
if (name === KEY || RECUR.has(name)) return scope.meta ? scope.meta[name] : undefined;
|
|
486
|
-
if (scope.lifts &&
|
|
498
|
+
if (scope.lifts && Object.hasOwn(scope.lifts, name)) return scope.lifts[name];
|
|
487
499
|
if (scope.parent === null) return this.ctx.root(name);
|
|
488
500
|
return this.ctx.get(scope.row, name);
|
|
489
501
|
}
|
|
@@ -510,17 +522,40 @@ function isRelOp(op: string): boolean {
|
|
|
510
522
|
return op === "==" || op === "!=" || op === "<" || op === "<=" || op === ">" || op === ">=";
|
|
511
523
|
}
|
|
512
524
|
|
|
513
|
-
//
|
|
514
|
-
//
|
|
515
|
-
//
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
if (Array.isArray(v)
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
525
|
+
// Guard a value bound for a result: a range (`lo..hi`) exists only during
|
|
526
|
+
// evaluation. Checks the value itself and, for an array, its elements — deeper
|
|
527
|
+
// structure is host data (which cannot hold a range) or a nested block's
|
|
528
|
+
// result (already guarded when it was projected).
|
|
529
|
+
function noRange(v: unknown): unknown {
|
|
530
|
+
if (isRange(v) || (Array.isArray(v) && v.some(isRange))) {
|
|
531
|
+
throw new OqxError("a range (lo..hi) cannot appear in a result; test membership with `x in lo..hi` instead", "eval");
|
|
532
|
+
}
|
|
533
|
+
return v;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Order two `follow` paths (identity sequences of equal depth) component-wise:
|
|
537
|
+
// two numbers numerically, two strings by code point; otherwise numbers precede
|
|
538
|
+
// strings precede everything else, and same-kind others order by canonical key.
|
|
539
|
+
function comparePath(a: unknown[], b: unknown[]): number {
|
|
540
|
+
const n = Math.min(a.length, b.length);
|
|
541
|
+
for (let i = 0; i < n; i++) {
|
|
542
|
+
const c = compareComponent(a[i], b[i]);
|
|
543
|
+
if (c !== 0) return c;
|
|
522
544
|
}
|
|
523
|
-
return
|
|
545
|
+
return a.length - b.length;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
function compareComponent(x: unknown, y: unknown): number {
|
|
549
|
+
const c = compare(x, y);
|
|
550
|
+
if (c !== undefined) return c;
|
|
551
|
+
const rx = componentRank(x), ry = componentRank(y);
|
|
552
|
+
if (rx !== ry) return rx - ry;
|
|
553
|
+
const kx = canonicalKey(x), ky = canonicalKey(y);
|
|
554
|
+
return kx < ky ? -1 : kx > ky ? 1 : 0;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function componentRank(v: unknown): number {
|
|
558
|
+
return typeof v === "number" ? 0 : typeof v === "string" ? 1 : 2;
|
|
524
559
|
}
|
|
525
560
|
|
|
526
561
|
function compareCount(n: number, cmp: { op: string; value: number }): boolean {
|
|
@@ -537,20 +572,6 @@ function boundedCount(n: number, b: Bound): number {
|
|
|
537
572
|
return b.limit == null ? rest : Math.min(rest, b.limit);
|
|
538
573
|
}
|
|
539
574
|
|
|
540
|
-
// Order `&&` conjuncts so cheap scalar leaves run before consumer-op leaves.
|
|
541
|
-
function orderByCost(parts: Where[]): Where[] {
|
|
542
|
-
return [...parts].sort((a, b) => whereCost(a) - whereCost(b));
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
function whereCost(w: Where): number {
|
|
546
|
-
switch (w.kind) {
|
|
547
|
-
case "op": return 2;
|
|
548
|
-
case "and": case "or": return Math.max(0, ...w.parts.map(whereCost));
|
|
549
|
-
case "not": return whereCost(w.expr);
|
|
550
|
-
case "scalar": return 0;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
|
|
554
575
|
function describeReceiver(e: Expr): string {
|
|
555
576
|
if (e.kind === "ident") return e.name;
|
|
556
577
|
if (e.kind === "member") return `${describeReceiver(e.recv)}.${e.name}`;
|
package/src/index.ts
CHANGED
|
@@ -27,10 +27,16 @@ import type { DataContext } from "./context.ts";
|
|
|
27
27
|
import { DefaultContext } from "./context.ts";
|
|
28
28
|
|
|
29
29
|
export { OqxError } from "./errors.ts";
|
|
30
|
+
|
|
31
|
+
/** The OQX spec version (`spec/oqx/VERSION`, `major.minor`) this implementation
|
|
32
|
+
* conforms to — distinct from the package's own semver. */
|
|
33
|
+
export const LANGUAGE_VERSION = "0.12";
|
|
30
34
|
export type { OqxResult, Engine } from "./engine.ts";
|
|
31
35
|
export { InMemoryEngine, runQuery } from "./engine.ts";
|
|
32
|
-
export type { DataContext, CallResult } from "./context.ts";
|
|
36
|
+
export type { DataContext, CallResult, DefaultContextOptions } from "./context.ts";
|
|
33
37
|
export { DefaultContext } from "./context.ts";
|
|
38
|
+
export type { RegexDialect, RegexFlags } from "./regex.ts";
|
|
39
|
+
export { compileRegex } from "./regex.ts";
|
|
34
40
|
export type { QueryPlanner, Plan } from "./planner.ts";
|
|
35
41
|
export { PlannedEngine } from "./planner.ts";
|
|
36
42
|
export { IndexedCollection } from "./adapters/indexed.ts";
|
package/src/lexer.ts
CHANGED
|
@@ -108,9 +108,18 @@ function lexFragment(src: string, base: number, out: Token[]): void {
|
|
|
108
108
|
push("range", "..", i); i += 2; continue;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
// `.`
|
|
112
|
-
// no leading-dot numerals
|
|
113
|
-
|
|
111
|
+
// `.` followed by a digit is neither navigation (a property name cannot start
|
|
112
|
+
// with a digit) nor a number (OQX has no leading-dot numerals): it is a
|
|
113
|
+
// malformed number, reported as such rather than surfacing as a confusing
|
|
114
|
+
// parse error downstream. Any other `.` is member navigation.
|
|
115
|
+
if (c === ".") {
|
|
116
|
+
if (isDigit(src[i + 1] ?? "")) {
|
|
117
|
+
const end = scanNumberTail(src, i + 1, base);
|
|
118
|
+
const lit = src.slice(i, end);
|
|
119
|
+
throw new OqxError(`malformed number ${JSON.stringify(lit)} at ${base + i} — a number starts with a digit (write 0${lit}), and a property name cannot be a digit (there is no index access)`, "lex");
|
|
120
|
+
}
|
|
121
|
+
push("dot", c, i); i++; continue;
|
|
122
|
+
}
|
|
114
123
|
|
|
115
124
|
// string literal — decode into its VALUE (quotes stripped, escapes resolved).
|
|
116
125
|
if (c === '"' || c === "'") {
|
|
@@ -133,18 +142,14 @@ function lexFragment(src: string, base: number, out: Token[]): void {
|
|
|
133
142
|
continue;
|
|
134
143
|
}
|
|
135
144
|
|
|
136
|
-
// number (
|
|
137
|
-
|
|
145
|
+
// number: `digits [ "." digits ] [ ("e"|"E") ["+"|"-"] digits ]`. A `.` is a
|
|
146
|
+
// decimal point only when a digit follows: `1..5` is `1` `..` `5`. A `.`
|
|
147
|
+
// followed by anything else (`1.`, `1.x`) and an exponent marker without
|
|
148
|
+
// digits (`1e`, `1e+`) are malformed numbers — lex errors, never a silent
|
|
149
|
+
// NaN or a dangling dot.
|
|
150
|
+
if (isDigit(c)) {
|
|
138
151
|
const start = i;
|
|
139
|
-
|
|
140
|
-
// A `.` is a decimal point only when a digit follows; otherwise it belongs
|
|
141
|
-
// to a range operator (`1..5`) or navigation, so the number stops here.
|
|
142
|
-
if (src[i] === "." && isDigit(src[i + 1] ?? "")) { i++; while (i < n && isDigit(src[i]!)) i++; }
|
|
143
|
-
if (src[i] === "e" || src[i] === "E") {
|
|
144
|
-
i++;
|
|
145
|
-
if (src[i] === "+" || src[i] === "-") i++;
|
|
146
|
-
while (i < n && isDigit(src[i]!)) i++;
|
|
147
|
-
}
|
|
152
|
+
i = scanNumberTail(src, i, base);
|
|
148
153
|
push("number", src.slice(start, i), start);
|
|
149
154
|
continue;
|
|
150
155
|
}
|
|
@@ -168,6 +173,31 @@ function lexFragment(src: string, base: number, out: Token[]): void {
|
|
|
168
173
|
}
|
|
169
174
|
}
|
|
170
175
|
|
|
176
|
+
// Scan a number whose first digit is at `i`; return the index just past it.
|
|
177
|
+
// Throws the malformed-number lex error for a trailing decimal point or an
|
|
178
|
+
// exponent without digits.
|
|
179
|
+
function scanNumberTail(src: string, i: number, base = 0): number {
|
|
180
|
+
const start = i;
|
|
181
|
+
const n = src.length;
|
|
182
|
+
const fail = (end: number, why: string): never => {
|
|
183
|
+
throw new OqxError(`malformed number ${JSON.stringify(src.slice(start, end))} at ${base + start} — ${why}`, "lex");
|
|
184
|
+
};
|
|
185
|
+
while (i < n && isDigit(src[i]!)) i++;
|
|
186
|
+
if (src[i] === "." && src[i + 1] !== ".") {
|
|
187
|
+
if (!isDigit(src[i + 1] ?? "")) fail(i + 1, "a decimal point needs a digit after it (write 1.0, not 1.)");
|
|
188
|
+
i++;
|
|
189
|
+
while (i < n && isDigit(src[i]!)) i++;
|
|
190
|
+
}
|
|
191
|
+
if (src[i] === "e" || src[i] === "E") {
|
|
192
|
+
let j = i + 1;
|
|
193
|
+
if (src[j] === "+" || src[j] === "-") j++;
|
|
194
|
+
if (!isDigit(src[j] ?? "")) fail(j, "an exponent needs at least one digit (write 1e5)");
|
|
195
|
+
i = j;
|
|
196
|
+
while (i < n && isDigit(src[i]!)) i++;
|
|
197
|
+
}
|
|
198
|
+
return i;
|
|
199
|
+
}
|
|
200
|
+
|
|
171
201
|
function unescape(c: string | undefined): string {
|
|
172
202
|
switch (c) {
|
|
173
203
|
case "n": return "\n";
|