@omgbase/oqx 0.14.1 → 0.18.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 +41 -0
- package/README.md +192 -34
- package/dist/ast.d.ts +77 -23
- 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 +37 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +54 -0
- package/dist/build.js.map +1 -0
- package/dist/context.d.ts +13 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -3
- package/dist/context.js.map +1 -1
- package/dist/engine.d.ts +1 -2
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +55 -26
- 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 +34 -12
- 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 +1 -1
- package/dist/optimize/analysis.d.ts.map +1 -1
- package/dist/optimize/analysis.js +7 -5
- package/dist/optimize/analysis.js.map +1 -1
- package/dist/optimize/ir.d.ts +3 -3
- 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 +616 -251
- package/dist/parser.js.map +1 -1
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +5 -3
- 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 +330 -0
- package/dist/resolve.js.map +1 -0
- package/dist/semantics.js +1 -1
- package/dist/semantics.js.map +1 -1
- 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 +54 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +139 -0
- package/dist/walk.js.map +1 -0
- package/package.json +1 -1
- package/src/ast.ts +105 -36
- package/src/build.ts +72 -0
- package/src/context.ts +16 -3
- package/src/engine.ts +57 -28
- package/src/errors.ts +3 -2
- package/src/index.ts +38 -13
- package/src/lexer.ts +102 -51
- package/src/optimize/analysis.ts +6 -5
- package/src/optimize/ir.ts +5 -5
- package/src/parser.ts +573 -225
- package/src/plan.ts +4 -3
- package/src/print.ts +274 -0
- package/src/resolve.ts +305 -0
- package/src/semantics.ts +1 -1
- package/src/version.ts +4 -0
- package/src/walk.ts +180 -0
package/dist/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/ast.js
CHANGED
|
@@ -1,7 +1,22 @@
|
|
|
1
|
-
// OQX
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
|
|
1
|
+
// The OQX AST — a first-class, language-level contract (spec/oqx/AST.md, since
|
|
2
|
+
// language 0.16). The parser produces it, the interpreter walks it, and tools
|
|
3
|
+
// reflect on it without re-parsing: every node carries `kind` and `span`, every
|
|
4
|
+
// optional field is materialized (`null` / `false`), and the in-memory objects
|
|
5
|
+
// ARE the JSON shape both implementations serialize (plain data, no parent
|
|
6
|
+
// pointers, no methods). There is no separate lowering/IR pass: a "relation" is
|
|
7
|
+
// just an expression evaluated against the current row.
|
|
8
|
+
//
|
|
9
|
+
// `where` keeps its surface form: a `select` alias referenced in `where` stays a
|
|
10
|
+
// bare identifier here; `resolveAliases` (resolve.ts) performs the substitution
|
|
11
|
+
// before evaluation. Nodes built by a tool rather than the parser carry the
|
|
12
|
+
// empty span `[0, 0]` (see `build.ts`).
|
|
13
|
+
/** The expression kinds (`Expr["kind"]`), for `isExpr`. */
|
|
14
|
+
const EXPR_KINDS = new Set([
|
|
15
|
+
"lit", "ident", "outer", "binding", "member", "call", "unary", "required", "binary", "logical", "in", "range",
|
|
16
|
+
]);
|
|
17
|
+
/** Whether a node is a scalar `Expr` (an `op` in expression position is not: it
|
|
18
|
+
* is an expression only by position, see AST.md §1). */
|
|
19
|
+
export function isExpr(node) {
|
|
20
|
+
return EXPR_KINDS.has(node.kind);
|
|
21
|
+
}
|
|
7
22
|
//# sourceMappingURL=ast.js.map
|
package/dist/ast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,gFAAgF;AAChF,wDAAwD;AACxD,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,4EAA4E;AAC5E,wCAAwC;AAqKxC,2DAA2D;AAC3D,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC;IAC9C,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO;CAC9G,CAAC,CAAC;AAEH;wDACwD;AACxD,MAAM,UAAU,MAAM,CAAC,IAAa;IAClC,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/build.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BinaryOp, Consumer, CountCmp, Expr, Follow, FollowDestination, LogicalOp, OpNode, OrderSpec, Query, SelectItem, Span, Subquery, UnaryOp, Where } from "./ast.js";
|
|
2
|
+
/** A fresh empty span (never shared: spans are mutable tuples). */
|
|
3
|
+
export declare const span: () => Span;
|
|
4
|
+
export declare const lit: (value: string | number | boolean | null) => Expr;
|
|
5
|
+
export declare const ident: (name: string) => Expr;
|
|
6
|
+
export declare const outer: (levels: number, name: string) => Expr;
|
|
7
|
+
export declare const binding: (index: number) => Expr;
|
|
8
|
+
export declare const member: (recv: Expr, name: string) => Expr;
|
|
9
|
+
/** `a.b.c` from a dotted path. */
|
|
10
|
+
export declare const path: (first: string, ...rest: string[]) => Expr;
|
|
11
|
+
export declare const call: (recv: Expr | null, name: string, args?: Expr[]) => Expr;
|
|
12
|
+
export declare const unary: (op: UnaryOp, expr: Expr) => Expr;
|
|
13
|
+
/** `expr!` — the required value (SEMANTICS §5b). */
|
|
14
|
+
export declare const required: (expr: Expr) => Expr;
|
|
15
|
+
export declare const binary: (op: BinaryOp, left: Expr, right: Expr) => Expr;
|
|
16
|
+
export declare const logical: (op: LogicalOp, left: Expr, right: Expr) => Expr;
|
|
17
|
+
export declare const inOp: (left: Expr, right: Expr) => Expr;
|
|
18
|
+
export declare const range: (lo: Expr | null, hi: Expr | null, exclusiveEnd?: boolean) => Expr;
|
|
19
|
+
export declare const scalar: (expr: Expr) => Where;
|
|
20
|
+
export declare const and: (parts: Where[]) => Where;
|
|
21
|
+
export declare const or: (parts: Where[]) => Where;
|
|
22
|
+
export declare const not: (expr: Where) => Where;
|
|
23
|
+
export declare const field: (name: string, expr: Expr, lift?: number) => SelectItem;
|
|
24
|
+
export declare const collect: (name: string, op: OpNode) => SelectItem;
|
|
25
|
+
export declare const order: (expr: Expr, desc?: boolean) => OrderSpec;
|
|
26
|
+
/** A block body; every clause defaults to empty/absent. */
|
|
27
|
+
export declare function subquery(parts?: Partial<Omit<Subquery, "kind" | "span">>): Subquery;
|
|
28
|
+
/** `<receiver> <op> [distinct] { sub } [<relop> N]`. */
|
|
29
|
+
export declare function op(receiver: Expr, consumer: Consumer, sub?: Subquery, opts?: {
|
|
30
|
+
distinct?: boolean;
|
|
31
|
+
countCmp?: CountCmp | null;
|
|
32
|
+
}): OpNode;
|
|
33
|
+
export declare function follow(destinations: FollowDestination[], opts?: Partial<Omit<Follow, "kind" | "span" | "destinations">>): Follow;
|
|
34
|
+
/** A top-level query over `source`; every other clause defaults to empty/absent
|
|
35
|
+
* and the consumer to `collect`. */
|
|
36
|
+
export declare function query(source: Expr, parts?: Partial<Omit<Query, "kind" | "span" | "source">>): Query;
|
|
37
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/build.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Builders for AST nodes a tool constructs itself (spec/oqx/AST.md §7). Every
|
|
2
|
+
// node they make carries the empty span `[0, 0]` — "not from source" — and the
|
|
3
|
+
// materialized defaults (`distinct: false`, `limit: null`, …), so a hand-built
|
|
4
|
+
// tree has the same shape as a parsed one and prints with `print`.
|
|
5
|
+
/** A fresh empty span (never shared: spans are mutable tuples). */
|
|
6
|
+
export const span = () => [0, 0];
|
|
7
|
+
export const lit = (value) => ({ kind: "lit", span: span(), value });
|
|
8
|
+
export const ident = (name) => ({ kind: "ident", span: span(), name });
|
|
9
|
+
export const outer = (levels, name) => ({ kind: "outer", span: span(), levels, name });
|
|
10
|
+
export const binding = (index) => ({ kind: "binding", span: span(), index });
|
|
11
|
+
export const member = (recv, name) => ({ kind: "member", span: span(), recv, name });
|
|
12
|
+
/** `a.b.c` from a dotted path. */
|
|
13
|
+
export const path = (first, ...rest) => rest.reduce((e, n) => member(e, n), ident(first));
|
|
14
|
+
export const call = (recv, name, args = []) => ({ kind: "call", span: span(), recv, name, args });
|
|
15
|
+
export const unary = (op, expr) => ({ kind: "unary", span: span(), op, expr });
|
|
16
|
+
/** `expr!` — the required value (SEMANTICS §5b). */
|
|
17
|
+
export const required = (expr) => ({ kind: "required", span: span(), expr });
|
|
18
|
+
export const binary = (op, left, right) => ({ kind: "binary", span: span(), op, left, right });
|
|
19
|
+
export const logical = (op, left, right) => ({ kind: "logical", span: span(), op, left, right });
|
|
20
|
+
export const inOp = (left, right) => ({ kind: "in", span: span(), left, right });
|
|
21
|
+
export const range = (lo, hi, exclusiveEnd = false) => ({ kind: "range", span: span(), lo, hi, exclusiveEnd });
|
|
22
|
+
export const scalar = (expr) => ({ kind: "scalar", span: span(), expr });
|
|
23
|
+
export const and = (parts) => ({ kind: "and", span: span(), parts });
|
|
24
|
+
export const or = (parts) => ({ kind: "or", span: span(), parts });
|
|
25
|
+
export const not = (expr) => ({ kind: "not", span: span(), expr });
|
|
26
|
+
export const field = (name, expr, lift = 0) => ({ kind: "field", span: span(), name, expr, lift });
|
|
27
|
+
export const collect = (name, op) => ({ kind: "collect", span: span(), name, op });
|
|
28
|
+
export const order = (expr, desc = false) => ({ kind: "order", span: span(), expr, desc });
|
|
29
|
+
/** A block body; every clause defaults to empty/absent. */
|
|
30
|
+
export function subquery(parts = {}) {
|
|
31
|
+
return {
|
|
32
|
+
kind: "subquery", span: span(),
|
|
33
|
+
from: [], where: null, select: [], orderBy: null, follow: null, values: false, limit: null, offset: null,
|
|
34
|
+
...parts,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** `<receiver> <op> [distinct] { sub } [<relop> N]`. */
|
|
38
|
+
export function op(receiver, consumer, sub = subquery(), opts = {}) {
|
|
39
|
+
return { kind: "op", span: span(), receiver, op: consumer, sub, countCmp: opts.countCmp ?? null, distinct: opts.distinct ?? false };
|
|
40
|
+
}
|
|
41
|
+
export function follow(destinations, opts = {}) {
|
|
42
|
+
return { kind: "follow", span: span(), destinations, distinct: false, where: null, frontier: null, depth: null, by: null, ...opts };
|
|
43
|
+
}
|
|
44
|
+
/** A top-level query over `source`; every other clause defaults to empty/absent
|
|
45
|
+
* and the consumer to `collect`. */
|
|
46
|
+
export function query(source, parts = {}) {
|
|
47
|
+
return {
|
|
48
|
+
kind: "query", span: span(), source,
|
|
49
|
+
from: [], where: null, select: [], orderBy: null, consumer: "collect", follow: null,
|
|
50
|
+
distinct: false, values: false, limit: null, offset: null,
|
|
51
|
+
...parts,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts
CHANGED
|
@@ -9,6 +9,14 @@ export interface CallResult {
|
|
|
9
9
|
export interface DataContext {
|
|
10
10
|
/** Resolve a named root collection (the `from <name>` / directive receiver). */
|
|
11
11
|
root(name: string): unknown;
|
|
12
|
+
/** The root scope's row — the host's root object: what `$it` is at the root
|
|
13
|
+
* scope and `^$it` from a top-level row (SEMANTICS §2, since 0.18), so
|
|
14
|
+
* `^$it.people` navigates it through `get` and `entries(^$it)` enumerates it.
|
|
15
|
+
* Bare names at the root still resolve through `root(name)`, so a host with
|
|
16
|
+
* lazy roots is unaffected. Optional: a context without it (or returning
|
|
17
|
+
* `undefined`) has no root row — `$it` at the root is absent, the pre-0.18
|
|
18
|
+
* behavior. `DefaultContext` returns its roots record. */
|
|
19
|
+
rootObject?(): unknown;
|
|
12
20
|
/** Read a property/relation off a row: a bare identifier (`field`), a
|
|
13
21
|
* `.field` segment, or a `^field` outer reference all come through here, each
|
|
14
22
|
* against exactly the row of the scope it names. An absent property is
|
|
@@ -61,14 +69,16 @@ export interface DefaultContextOptions {
|
|
|
61
69
|
regexDialect?: RegexDialect;
|
|
62
70
|
}
|
|
63
71
|
/** The default context: ordinary JavaScript objects. Named roots come from a
|
|
64
|
-
* plain `{ name: collection }` map
|
|
65
|
-
*
|
|
66
|
-
*
|
|
72
|
+
* plain `{ name: collection }` map, which is also the root object (`^$it` from
|
|
73
|
+
* a top-level row); properties are OWN keys only (an array exposes only its
|
|
74
|
+
* integer indices, a primitive has none); identity is `.id` when present, else
|
|
75
|
+
* the row itself (the engine keys it structurally). */
|
|
67
76
|
export declare class DefaultContext implements DataContext {
|
|
68
77
|
private roots;
|
|
69
78
|
readonly regexDialect: RegexDialect;
|
|
70
79
|
constructor(roots?: Record<string, unknown>, options?: DefaultContextOptions);
|
|
71
80
|
root(name: string): unknown;
|
|
81
|
+
rootObject(): unknown;
|
|
72
82
|
get(row: unknown, key: string): unknown;
|
|
73
83
|
toRows(value: unknown): Iterable<unknown>;
|
|
74
84
|
identity(row: unknown): unknown;
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQzD;kEACkE;AAClE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B;;;;;kFAK8E;IAC9E,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,8DAA8D;IAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C;;;;;;;;;;yEAUqE;IACrE,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,2EAA2E;IAC3E,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IACzD,oEAAoE;IACpE,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IACtE;;;;;;iCAM6B;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC;;;;;;;;;yCASqC;IACrC,QAAQ,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC/E;AAED,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQzD;kEACkE;AAClE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B;;;;;;8DAM0D;IAC1D,UAAU,CAAC,IAAI,OAAO,CAAC;IACvB;;;;;kFAK8E;IAC9E,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,8DAA8D;IAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C;;;;;;;;;;yEAUqE;IACrE,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,2EAA2E;IAC3E,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IACzD,oEAAoE;IACpE,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IACtE;;;;;;iCAM6B;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC;;;;;;;;;yCASqC;IACrC,QAAQ,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC/E;AAED,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;uDAIuD;AACvD,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAA0B;IACvC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;gBAExB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,OAAO,GAAE,qBAA0B;IAKpF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3B,UAAU,IAAI,OAAO;IAIrB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAMvC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAIzC,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAK/B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU;IAKvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU;CAKrE"}
|
package/dist/context.js
CHANGED
|
@@ -14,9 +14,10 @@ function isIndexKey(key) {
|
|
|
14
14
|
return /^(0|[1-9]\d*)$/.test(key);
|
|
15
15
|
}
|
|
16
16
|
/** The default context: ordinary JavaScript objects. Named roots come from a
|
|
17
|
-
* plain `{ name: collection }` map
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* plain `{ name: collection }` map, which is also the root object (`^$it` from
|
|
18
|
+
* a top-level row); properties are OWN keys only (an array exposes only its
|
|
19
|
+
* integer indices, a primitive has none); identity is `.id` when present, else
|
|
20
|
+
* the row itself (the engine keys it structurally). */
|
|
20
21
|
export class DefaultContext {
|
|
21
22
|
roots;
|
|
22
23
|
regexDialect;
|
|
@@ -27,6 +28,9 @@ export class DefaultContext {
|
|
|
27
28
|
root(name) {
|
|
28
29
|
return Object.hasOwn(this.roots, name) ? this.roots[name] : undefined;
|
|
29
30
|
}
|
|
31
|
+
rootObject() {
|
|
32
|
+
return this.roots;
|
|
33
|
+
}
|
|
30
34
|
get(row, key) {
|
|
31
35
|
if (row == null || typeof row !== "object")
|
|
32
36
|
return undefined;
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,EAAE;AACF,gFAAgF;AAChF,2EAA2E;AAE3E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIpG,0EAA0E;AAC1E,+DAA+D;AAC/D,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -102,8 +102,7 @@ export declare class InMemoryEngine implements Engine {
|
|
|
102
102
|
private evalExpr;
|
|
103
103
|
private evalRaw;
|
|
104
104
|
private resolveIn;
|
|
105
|
+
private rowIdentity;
|
|
105
106
|
private evalCall;
|
|
106
107
|
}
|
|
107
|
-
/** Convenience: run a query with plain-object roots (the default context). */
|
|
108
|
-
export declare function runQuery(query: Query, bindings: readonly unknown[], roots: unknown): OqxResult;
|
|
109
108
|
//# sourceMappingURL=engine.d.ts.map
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,KAAK,EAAe,MAAM,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,OAAO,KAAK,EAA0B,IAAI,EAAY,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,KAAK,EAAe,MAAM,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,OAAO,KAAK,EAA0B,IAAI,EAAY,MAAM,qBAAqB,CAAC;AAIlF,yEAAyE;AACzE,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,GACxC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GAC1C;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,WAAW,MAAM;IACrB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;CAC5D;AA6CD;;;;;uBAKuB;AACvB,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GACtF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,kBAAkB,CAAA;CAAE,CAAC;AAE5F,MAAM,WAAW,qBAAqB;IACpC;8CAC0C;IAC1C,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACxB,sEAAsE;IACtE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACrC;AAcD,qBAAa,cAAe,YAAW,MAAM;IAC3C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,KAAK,CAA4C;gBAE7C,OAAO,GAAE,WAAkC,EAAE,OAAO,GAAE,qBAA0B;IAM5F,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAE,SAAS,OAAO,EAAO,GAAG,SAAS;IA0D/D,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,iBAAiB;IAuCzB,OAAO,CAAC,UAAU;IA4ElB,OAAO,CAAC,KAAK;IAgBb,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAE,aAAa;IAQtB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,KAAK;IAoBb,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,QAAQ;IAqBhB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,uBAAuB;IA4B/B,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,OAAO;IAmFf,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,QAAQ;CAYjB"}
|
package/dist/engine.js
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import { DefaultContext } from "./context.js";
|
|
22
22
|
import { OqxError } from "./errors.js";
|
|
23
23
|
import { relate, arith, membership, truthy, compareForSort, compare, canonicalKey, makeRange, isEntry, isRange, } from "./semantics.js";
|
|
24
|
+
import { printTemplate } from "./print.js";
|
|
24
25
|
import { DEFAULT_RULES, HashIndex, intersectPositions, lookupOrder, planFor, residualWithout } from "./optimize/index.js";
|
|
25
26
|
const RECUR = new Set(["$depth", "$stop", "$leaf", "$frontier", "$ordinal"]);
|
|
26
27
|
const KEY = "$key";
|
|
@@ -45,7 +46,7 @@ export class InMemoryEngine {
|
|
|
45
46
|
};
|
|
46
47
|
if (this.trace)
|
|
47
48
|
run.trace = this.trace;
|
|
48
|
-
const root = { row:
|
|
49
|
+
const root = { row: this.ctx.rootObject?.(), parent: null, bindings, run };
|
|
49
50
|
const rows = this.reproject(this.rowsOf(this.evalRaw(query.source, root)), query.from, root);
|
|
50
51
|
const bound = this.boundOf(query, root);
|
|
51
52
|
if (query.follow)
|
|
@@ -95,12 +96,16 @@ export class InMemoryEngine {
|
|
|
95
96
|
// Evaluate a block's `limit`/`offset`. The bound is part of the block, so it
|
|
96
97
|
// is read in a row-less scope INSIDE it: a bare name is absent (there is no
|
|
97
98
|
// current item yet), `^name` is the enclosing row — exactly as in the block's
|
|
98
|
-
// body — and literals/bindings are themselves. For a top-level query
|
|
99
|
-
// is the root
|
|
99
|
+
// body — and literals/bindings are themselves. For a top-level query the
|
|
100
|
+
// scope is the root scope WITHOUT its row (SEMANTICS §18): bare names are
|
|
101
|
+
// still the named roots, but `$it` — reached through a bracket inside the
|
|
102
|
+
// bound — is absent, not the root object. Each must be a non-negative integer.
|
|
100
103
|
boundOf(b, enclosing) {
|
|
101
104
|
if (!b.limit && !b.offset)
|
|
102
105
|
return UNBOUNDED;
|
|
103
|
-
const scope = enclosing.parent === null
|
|
106
|
+
const scope = enclosing.parent === null
|
|
107
|
+
? { row: undefined, parent: null, bindings: enclosing.bindings, run: enclosing.run }
|
|
108
|
+
: rowless(enclosing);
|
|
104
109
|
const read = (e, word) => {
|
|
105
110
|
if (!e)
|
|
106
111
|
return null;
|
|
@@ -125,7 +130,7 @@ export class InMemoryEngine {
|
|
|
125
130
|
return this.enter(row, parent);
|
|
126
131
|
}
|
|
127
132
|
// Make the scope for a row. An `entries()` entry is unwrapped here: the scope's
|
|
128
|
-
// row is the property's VALUE (so `$
|
|
133
|
+
// row is the property's VALUE (so `$it` and bare names read it) and the key
|
|
129
134
|
// becomes the `$key` intrinsic in `meta`. Every place a row becomes a scope
|
|
130
135
|
// goes through this, so entries behave the same at the top level, in nested
|
|
131
136
|
// blocks, as `from` re-projections, and as follow seeds.
|
|
@@ -656,11 +661,6 @@ export class InMemoryEngine {
|
|
|
656
661
|
const r = this.evalExpr(e.recv, scope);
|
|
657
662
|
return r == null ? undefined : this.ctx.get(r, e.name);
|
|
658
663
|
}
|
|
659
|
-
case "index": {
|
|
660
|
-
const r = this.evalExpr(e.recv, scope);
|
|
661
|
-
const i = this.evalExpr(e.index, scope);
|
|
662
|
-
return r == null ? undefined : this.ctx.get(r, String(i));
|
|
663
|
-
}
|
|
664
664
|
case "call": return this.evalCall(e, scope);
|
|
665
665
|
case "unary": {
|
|
666
666
|
const v = this.evalExpr(e.expr, scope);
|
|
@@ -668,9 +668,25 @@ export class InMemoryEngine {
|
|
|
668
668
|
return !truthy(v);
|
|
669
669
|
return v == null ? undefined : -v;
|
|
670
670
|
}
|
|
671
|
+
// `x!` — the value, or an eval error naming the expression (and the row's
|
|
672
|
+
// identity when it has a scalar one). Never a filter, never a coercion.
|
|
673
|
+
case "required": {
|
|
674
|
+
const v = this.evalExpr(e.expr, scope);
|
|
675
|
+
if (v == null)
|
|
676
|
+
throw new OqxError(`\`${describe(e.expr)}!\` is absent${this.rowIdentity(scope)}`, "eval");
|
|
677
|
+
return v;
|
|
678
|
+
}
|
|
679
|
+
// A value-position directive (`jobs first { … }.pay`, the desugared `x[…]`).
|
|
680
|
+
case "op": return this.evalCollectValue(e, scope);
|
|
671
681
|
case "binary": {
|
|
672
682
|
const l = this.evalExpr(e.left, scope);
|
|
673
683
|
const r = this.evalExpr(e.right, scope);
|
|
684
|
+
if (e.op === "is" || e.op === "is not") {
|
|
685
|
+
// Identity (SEMANTICS §5b): the context's identity of each side,
|
|
686
|
+
// compared structurally — the key `distinct` and `follow` use.
|
|
687
|
+
const same = canonicalKey(this.ctx.identity(l)) === canonicalKey(this.ctx.identity(r));
|
|
688
|
+
return e.op === "is" ? same : !same;
|
|
689
|
+
}
|
|
674
690
|
return isRelOp(e.op) ? relate(e.op, l, r) : arith(e.op, l, r);
|
|
675
691
|
}
|
|
676
692
|
case "logical": {
|
|
@@ -684,12 +700,15 @@ export class InMemoryEngine {
|
|
|
684
700
|
}
|
|
685
701
|
}
|
|
686
702
|
// Resolve a name against ONE scope — never its ancestors. A scope provides,
|
|
687
|
-
// in order: `$
|
|
688
|
-
// type, so scalar collections are queryable;
|
|
689
|
-
//
|
|
690
|
-
//
|
|
691
|
-
//
|
|
692
|
-
//
|
|
703
|
+
// in order: `$it` (the scope's row itself — the current item, whatever its
|
|
704
|
+
// type, so scalar collections are queryable; at the root the host's root
|
|
705
|
+
// object, since 0.18; `$value`, its pre-0.15 spelling, is an ordinary
|
|
706
|
+
// property name now); `$key` (the property key) when it is an entry scope —
|
|
707
|
+
// see `enter`; the recursion intrinsics (`$depth`, …) when it is a follow
|
|
708
|
+
// occurrence; values lifted into it by `^name:` items; then either the row's
|
|
709
|
+
// own property or, for the root scope, the context's named roots (`root(name)`
|
|
710
|
+
// — never a property of the root object, so a host with lazy roots is
|
|
711
|
+
// unaffected by what its root object holds).
|
|
693
712
|
//
|
|
694
713
|
// The two metadata steps apply only where the scope CARRIES that metadata
|
|
695
714
|
// (SEMANTICS §2, since 0.13). Anywhere else — `$key` on an ordinary row,
|
|
@@ -705,8 +724,8 @@ export class InMemoryEngine {
|
|
|
705
724
|
// always spelled explicitly as `^name`. Present-but-falsy values (null, false,
|
|
706
725
|
// 0, "") need no special case — there is no "absent, so look outward" rule.
|
|
707
726
|
resolveIn(name, scope) {
|
|
708
|
-
if (name === "$
|
|
709
|
-
return scope.
|
|
727
|
+
if (name === "$it")
|
|
728
|
+
return scope.row;
|
|
710
729
|
if ((name === KEY || RECUR.has(name)) && scope.meta && Object.hasOwn(scope.meta, name))
|
|
711
730
|
return scope.meta[name];
|
|
712
731
|
if (scope.lifts && Object.hasOwn(scope.lifts, name))
|
|
@@ -715,6 +734,15 @@ export class InMemoryEngine {
|
|
|
715
734
|
return this.ctx.root(name);
|
|
716
735
|
return this.ctx.get(scope.row, name);
|
|
717
736
|
}
|
|
737
|
+
// ` on <identity>` for a required-value error when the scope has a row with a
|
|
738
|
+
// scalar identity (its `id`, through the context); empty otherwise, and at the
|
|
739
|
+
// root (the root object is not a row of the data).
|
|
740
|
+
rowIdentity(scope) {
|
|
741
|
+
if (scope.parent === null || scope.row == null)
|
|
742
|
+
return "";
|
|
743
|
+
const id = this.ctx.identity(scope.row);
|
|
744
|
+
return typeof id === "string" || typeof id === "number" ? ` on ${JSON.stringify(id)}` : "";
|
|
745
|
+
}
|
|
718
746
|
evalCall(e, scope) {
|
|
719
747
|
const args = e.args.map((a) => this.evalExpr(a, scope));
|
|
720
748
|
if (e.recv === null) {
|
|
@@ -800,6 +828,12 @@ function boundedCount(n, b) {
|
|
|
800
828
|
const rest = Math.max(0, n - b.offset);
|
|
801
829
|
return b.limit == null ? rest : Math.min(rest, b.limit);
|
|
802
830
|
}
|
|
831
|
+
// The canonical text of an expression for an error message; a binding shows as
|
|
832
|
+
// its `${n}` marker (the printer refuses to turn a bound value into source).
|
|
833
|
+
function describe(e) {
|
|
834
|
+
const t = printTemplate(e);
|
|
835
|
+
return t.strings.map((s, i) => (i < t.count ? `${s}\${${t.indices[i]}}` : s)).join("");
|
|
836
|
+
}
|
|
803
837
|
function describeReceiver(e) {
|
|
804
838
|
if (e.kind === "ident")
|
|
805
839
|
return e.name;
|
|
@@ -820,7 +854,7 @@ function partitionRecur(w) {
|
|
|
820
854
|
const post = [];
|
|
821
855
|
for (const p of parts)
|
|
822
856
|
(whereHasRecur(p) ? post : seed).push(p);
|
|
823
|
-
const rebuild = (ps) => (ps.length === 0 ? null : ps.length === 1 ? ps[0] : { kind: "and", parts: ps });
|
|
857
|
+
const rebuild = (ps) => (ps.length === 0 ? null : ps.length === 1 ? ps[0] : { kind: "and", span: [0, 0], parts: ps });
|
|
824
858
|
return { seed: rebuild(seed), post: rebuild(post) };
|
|
825
859
|
}
|
|
826
860
|
function whereHasRecur(w) {
|
|
@@ -836,9 +870,9 @@ function exprHasRecur(e) {
|
|
|
836
870
|
switch (e.kind) {
|
|
837
871
|
case "ident": return RECUR.has(e.name);
|
|
838
872
|
case "member": return exprHasRecur(e.recv);
|
|
839
|
-
case "index": return exprHasRecur(e.recv) || exprHasRecur(e.index);
|
|
840
873
|
case "call": return (e.recv ? exprHasRecur(e.recv) : false) || e.args.some(exprHasRecur);
|
|
841
|
-
case "unary":
|
|
874
|
+
case "unary":
|
|
875
|
+
case "required": return exprHasRecur(e.expr);
|
|
842
876
|
case "binary":
|
|
843
877
|
case "logical":
|
|
844
878
|
case "in": return exprHasRecur(e.left) || exprHasRecur(e.right);
|
|
@@ -846,9 +880,4 @@ function exprHasRecur(e) {
|
|
|
846
880
|
default: return false;
|
|
847
881
|
}
|
|
848
882
|
}
|
|
849
|
-
/** Convenience: run a query with plain-object roots (the default context). */
|
|
850
|
-
export function runQuery(query, bindings, roots) {
|
|
851
|
-
const ctx = new DefaultContext(roots ?? {});
|
|
852
|
-
return new InMemoryEngine(ctx).run(query, bindings);
|
|
853
|
-
}
|
|
854
883
|
//# sourceMappingURL=engine.js.map
|