@rindle/client 0.1.6 → 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.
package/README.md CHANGED
@@ -8,22 +8,45 @@ backend such as [`@rindle/wasm`](../wasm) (local, in-process) or a remote (netwo
8
8
  ## Schema + queries
9
9
 
10
10
  ```ts
11
- import { table, string, number, boolean, json, createSchema, extendSchema, eq, gt, ilike, or, exists } from "@rindle/client";
11
+ import {
12
+ table,
13
+ string,
14
+ number,
15
+ boolean,
16
+ json,
17
+ createSchema,
18
+ defineRelationships,
19
+ rel,
20
+ extendSchema,
21
+ eq,
22
+ gt,
23
+ ilike,
24
+ or,
25
+ exists,
26
+ } from "@rindle/client";
12
27
 
13
28
  const issue = table("issue")
14
29
  .columns({ id: number(), title: string(), priority: number(), meta: json<{ tags: string[] }>() })
15
30
  .primaryKey("id");
16
31
 
17
- const schema = createSchema({ tables: [issue] }); // pass to `new Store(schema, backend)`
32
+ const comment = table("comment")
33
+ .columns({ id: number(), issueId: number(), body: string() })
34
+ .primaryKey("id");
35
+
36
+ const schema = createSchema({ tables: [issue, comment] }); // pass to `new Store(schema, backend)`
37
+
38
+ const rels = defineRelationships({
39
+ issueComments: rel(issue, comment, { id: "issueId" }),
40
+ });
18
41
  ```
19
42
 
20
43
  - **Operators** are named value-functions: `eq / ne / gt / ge / lt / le / like / ilike / inList / …`.
21
44
  - **`where`** is a typed proxy — `where.closed(false)`, `where.priority(gt(3))` — with camelCase
22
45
  sugar `whereClosed(false)`. Multiple `where`s are AND-ed.
23
46
  - **`or` / `and` / `exists`** are plain top-level functions (no closure): conditions carry their
24
- table type, e.g. `where(or(issue.priority(gt(8)), exists(comment, { parent: ["id"], child: ["issueID"] })))`.
25
- - **Nesting** is `sub(alias, childTable, correlation, build?)` — explicit correlation, inline child
26
- table, no schema-declared relationships.
47
+ table type, e.g. `where(or(issue.priority(gt(8)), exists(comment, { parent: ["id"], child: ["issueId"] })))`.
48
+ - **Nesting** is `sub(alias, relationship, build?)`, or
49
+ `sub(alias, childTable, correlation, build?)` when you want to spell the join inline.
27
50
  - **Paging / single-row**: `orderBy(col, dir)`, `limit(n)`, `start(cursor, { exclusive })` (cursor
28
51
  paging from a partial row over the sort columns), and `one()`.
29
52
 
@@ -38,6 +61,48 @@ const view = store.query.issue.where.id(id).one().materialize();
38
61
  view.subscribe((row) => render(row)); // row: Issue | null, not Issue[]
39
62
  ```
40
63
 
64
+ ## Named queries + fragments
65
+
66
+ Remote subscriptions should be named with `defineQuery`. The returned value is callable: it
67
+ validates untrusted args, builds the query, and stamps it with the `(name, args)` wire identity that
68
+ remote backends subscribe to.
69
+
70
+ Fragments are reusable selections over a table. They compose into named queries with `include`
71
+ (same row) and `sub` (related rows), so a React screen can open one root query while child
72
+ components keep owning their own data declarations.
73
+
74
+ ```ts
75
+ import { defineFragment, defineQuery, newQueryBuilder } from "@rindle/client";
76
+ import type { FragmentData, FragmentRef } from "@rindle/client";
77
+
78
+ const q = newQueryBuilder(schema);
79
+
80
+ export const IssueCardFragment = defineFragment(issue, (i) =>
81
+ i
82
+ .select("id", "title")
83
+ .countAs("commentCount", rels.issueComments),
84
+ );
85
+
86
+ export type IssueCardData = FragmentData<typeof IssueCardFragment>;
87
+ export type IssueCardRef = FragmentRef<typeof IssueCardFragment>;
88
+
89
+ export const issuesPageQuery = defineQuery(
90
+ "issuesPage",
91
+ (raw): { limit: number } => {
92
+ const limit = Number((raw as { limit?: unknown }).limit);
93
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100) throw new Error("bad limit");
94
+ return { limit };
95
+ },
96
+ ({ limit }) => q.issue.orderBy("id", "asc").limit(limit).include(IssueCardFragment),
97
+ );
98
+ ```
99
+
100
+ `FragmentData<F>` is the local data shape read by the component that owns `F`. `FragmentRef<F>` is
101
+ the opaque token React passes between components; use `fragmentKey(ref)` from `@rindle/client` or
102
+ `@rindle/react` for stable list keys. Passing a fragment directly to `sub(alias, rel, ChildFragment)`
103
+ creates child refs in the React-facing local data. Passing an inline builder such as
104
+ `sub(alias, rel, (q) => q.include(ChildFragment).orderBy(...))` keeps that child payload inline for
105
+ the parent to read.
41
106
 
42
107
  ## Local-only tables
43
108
 
package/dist/query.d.ts CHANGED
@@ -1,15 +1,15 @@
1
- import type { Ast, Dir } from "./ast.ts";
1
+ import type { Ast, CorrelatedSubquery, Dir, LitValue } from "./ast.ts";
2
2
  import type { Arg, Cond } from "./operators.ts";
3
3
  import type { AnyCols, ColsMap, ColT, Relationship, RowOf, Schema, TableLike } from "./schema.ts";
4
4
  import type { ArrayView, SingularArrayView } from "./view.ts";
5
- type FieldFn<C extends AnyCols, K extends keyof C, Rels, One extends boolean, Sel extends string> = (arg: Arg<ColT<C[K]>>) => Query<C, Rels, One, Sel>;
5
+ type FieldFn<C extends AnyCols, K extends keyof C, Rels, One extends boolean, Sel extends string, LocalRels> = (arg: Arg<ColT<C[K]>>) => Query<C, Rels, One, Sel, LocalRels>;
6
6
  /** `where.closed(false)`, `where.priority(gt(3))`. */
7
- type WhereProxy<C extends AnyCols, Rels, One extends boolean, Sel extends string> = {
8
- [K in keyof C]: FieldFn<C, K, Rels, One, Sel>;
7
+ type WhereProxy<C extends AnyCols, Rels, One extends boolean, Sel extends string, LocalRels> = {
8
+ [K in keyof C]: FieldFn<C, K, Rels, One, Sel, LocalRels>;
9
9
  };
10
10
  /** `whereClosed(false)`, `wherePriority(gt(3))`. */
11
- type WhereSugar<C extends AnyCols, Rels, One extends boolean, Sel extends string> = {
12
- [K in keyof C as `where${Capitalize<string & K>}`]: FieldFn<C, K, Rels, One, Sel>;
11
+ type WhereSugar<C extends AnyCols, Rels, One extends boolean, Sel extends string, LocalRels> = {
12
+ [K in keyof C as `where${Capitalize<string & K>}`]: FieldFn<C, K, Rels, One, Sel, LocalRels>;
13
13
  };
14
14
  /** What `materialize()` returns: singular (`R | null`) for a top-level `.one()`, else plural. */
15
15
  type MaterializedView<R, One extends boolean> = One extends true ? SingularArrayView<R> : ArrayView<R>;
@@ -22,29 +22,30 @@ type MaterializedView<R, One extends boolean> = One extends true ? SingularArray
22
22
  * narrowing is always sound versus a runtime row that may still carry more.
23
23
  */
24
24
  type Projected<C extends AnyCols, Sel extends string> = [Sel] extends [never] ? RowOf<C> : Pick<RowOf<C>, Sel & keyof C>;
25
- interface QueryBase<C extends AnyCols, Rels, One extends boolean, Sel extends string> {
25
+ type FragmentEdge<C extends AnyCols, Rels, Sel extends string, LocalRels> = (q: Query<C, Rels, false, Sel, LocalRels>) => Query<C, Rels, boolean, Sel, LocalRels>;
26
+ interface QueryBase<C extends AnyCols, Rels, One extends boolean, Sel extends string, LocalRels> {
26
27
  /** Present when this local query came from `defineQuery`; used as the remote identity. */
27
28
  readonly name?: string;
28
29
  /** Present when this local query came from `defineQuery`; sent with `name` upstream. */
29
30
  readonly args?: unknown;
30
31
  /** Condition form — consumes `or()`/`and()`/`exists()`/field conditions (AND-ed across calls).
31
32
  * Filters over the FULL column set (`RowOf<C>`), independent of what's `select`ed/masked. */
32
- where(cond: Cond<RowOf<C>>): Query<C, Rels, One, Sel>;
33
- orderBy<K extends keyof C>(col: K, dir: Dir): Query<C, Rels, One, Sel>;
33
+ where(cond: Cond<RowOf<C>>): Query<C, Rels, One, Sel, LocalRels>;
34
+ orderBy<K extends keyof C>(col: K, dir: Dir): Query<C, Rels, One, Sel, LocalRels>;
34
35
  /** Project a subset of columns (PROJECTION-SUPPORT-DESIGN.md §6, masking §6/§10.6). Chainable
35
36
  * (each call unions into `Sel`); omit to select all. Drives what the server syncs, what the
36
37
  * view reports, AND — once any column is named — narrows the result row TYPE to exactly the
37
38
  * selection (masking). `where`/`orderBy`/`start`/`sub` still see the full column set. */
38
- select<K extends keyof C & string>(...cols: K[]): Query<C, Rels, One, Sel | K>;
39
- limit(n: number): Query<C, Rels, One, Sel>;
39
+ select<K extends keyof C & string>(...cols: K[]): Query<C, Rels, One, Sel | K, LocalRels>;
40
+ limit(n: number): Query<C, Rels, One, Sel, LocalRels>;
40
41
  /** Cursor paging: start at (or, with `exclusive`, after) the partial `cursor` row over the
41
42
  * sort columns. Lowers to a `Skip` in the engine. */
42
43
  start(cursor: Partial<RowOf<C>>, opts?: {
43
44
  exclusive?: boolean;
44
- }): Query<C, Rels, One, Sel>;
45
+ }): Query<C, Rels, One, Sel, LocalRels>;
45
46
  /** Return a single row: `materialize()` yields a {@link SingularArrayView} (`data: R | null`)
46
47
  * and the engine caps the query to `limit = 1`. */
47
- one(): Query<C, Rels, true, Sel>;
48
+ one(): Query<C, Rels, true, Sel, LocalRels>;
48
49
  /** **Merge** a {@link Fragment} into THIS node — Relay's "spread on the same type" (§5). The
49
50
  * fragment must be over the same table (enforced in the result type: a fragment over a different
50
51
  * table yields `never`, plus a runtime throw). Unions the projection (`Sel | FSel`), folds in the
@@ -59,7 +60,38 @@ interface QueryBase<C extends AnyCols, Rels, One extends boolean, Sel extends st
59
60
  * `include` keeps `C` out of any contravariant position — preserving `Query<Concrete>`'s
60
61
  * assignability to `Query<AnyCols>` (needed by `Store<ColsMap>`/`QueryRoot`). Same-table is then
61
62
  * checked as the mutual-assignability of `C` and `FC` in the return type. */
62
- include<FC extends AnyCols, FRels = {}, FSel extends string = never>(fragment: Fragment<FC, FRels, FSel>): [C] extends [FC] ? ([FC] extends [C] ? Query<C, Rels & FRels, One, Sel | FSel> : never) : never;
63
+ include<FC extends AnyCols, FRels = {}, FSel extends string = never, FLocalRels = FRels>(fragment: Fragment<FC, FRels, FSel, FLocalRels>): [C] extends [FC] ? ([FC] extends [C] ? Query<C, Rels & FRels, One, Sel | FSel, LocalRels & FLocalRels> : never) : never;
64
+ /** Nest a child fragment as an opaque local-read ref. The coverage query still composes the
65
+ * child's full AST at runtime; the React-facing fragment data exposes only refs at this
66
+ * boundary so the child component owns its local subscription. */
67
+ sub<A extends string, CC extends AnyCols, CRels = {}, CSel extends string = never, CLocalRels = CRels, F extends Fragment<CC, CRels, CSel, CLocalRels> = Fragment<CC, CRels, CSel, CLocalRels>>(alias: A, child: TableLike<CC>, corr: {
68
+ parent: Array<keyof C & string>;
69
+ child: Array<keyof CC & string>;
70
+ }, build: F, edge: FragmentEdge<CC, CRels, CSel, CLocalRels>): Query<C, Rels & {
71
+ [P in A]: Array<Projected<CC, CSel> & CRels>;
72
+ }, One, Sel, LocalRels & {
73
+ [P in A]: Array<FragmentRef<F>>;
74
+ }>;
75
+ sub<A extends string, CC extends AnyCols, CRels = {}, CSel extends string = never, CLocalRels = CRels, F extends Fragment<CC, CRels, CSel, CLocalRels> = Fragment<CC, CRels, CSel, CLocalRels>>(alias: A, child: TableLike<CC>, corr: {
76
+ parent: Array<keyof C & string>;
77
+ child: Array<keyof CC & string>;
78
+ }, build: F): Query<C, Rels & {
79
+ [P in A]: Array<Projected<CC, CSel> & CRels>;
80
+ }, One, Sel, LocalRels & {
81
+ [P in A]: Array<FragmentRef<F>>;
82
+ }>;
83
+ /** Relationship-value form of the fragment-ref overload above. */
84
+ sub<A extends string, CC extends AnyCols, CRels = {}, CSel extends string = never, CLocalRels = CRels, F extends Fragment<CC, CRels, CSel, CLocalRels> = Fragment<CC, CRels, CSel, CLocalRels>>(alias: A, relationship: Relationship<C, CC>, build: F, edge: FragmentEdge<CC, CRels, CSel, CLocalRels>): Query<C, Rels & {
85
+ [P in A]: Array<Projected<CC, CSel> & CRels>;
86
+ }, One, Sel, LocalRels & {
87
+ [P in A]: Array<FragmentRef<F>>;
88
+ }>;
89
+ /** Relationship-value form of the fragment-ref overload above. */
90
+ sub<A extends string, CC extends AnyCols, CRels = {}, CSel extends string = never, CLocalRels = CRels, F extends Fragment<CC, CRels, CSel, CLocalRels> = Fragment<CC, CRels, CSel, CLocalRels>>(alias: A, relationship: Relationship<C, CC>, build: F): Query<C, Rels & {
91
+ [P in A]: Array<Projected<CC, CSel> & CRels>;
92
+ }, One, Sel, LocalRels & {
93
+ [P in A]: Array<FragmentRef<F>>;
94
+ }>;
63
95
  /** Nest a child by EXPLICIT correlation (no schema relationship). `alias` is the result key.
64
96
  * The child's own projection (`CSel`) masks the nested row, so a fragment spread here
65
97
  * contributes exactly the columns it declared. */
@@ -68,13 +100,17 @@ interface QueryBase<C extends AnyCols, Rels, One extends boolean, Sel extends st
68
100
  child: Array<keyof CC & string>;
69
101
  }, build?: (q: Query<CC>) => Query<CC, CRels, boolean, CSel>): Query<C, Rels & {
70
102
  [P in A]: Array<Projected<CC, CSel> & CRels>;
71
- }, One, Sel>;
103
+ }, One, Sel, LocalRels & {
104
+ [P in A]: Array<Projected<CC, CSel> & CRels>;
105
+ }>;
72
106
  /** Nest a child by a named {@link Relationship} (`rel(parent, child, {...})`) — the correlation comes
73
107
  * from the relationship, so no `{ parent, child }` keys are restated. The relationship must belong to
74
108
  * THIS table (its parent columns are checked against `C`). `alias` is still the result key. */
75
109
  sub<A extends string, CC extends AnyCols, CRels = {}, CSel extends string = never>(alias: A, relationship: Relationship<C, CC>, build?: (q: Query<CC>) => Query<CC, CRels, boolean, CSel>): Query<C, Rels & {
76
110
  [P in A]: Array<Projected<CC, CSel> & CRels>;
77
- }, One, Sel>;
111
+ }, One, Sel, LocalRels & {
112
+ [P in A]: Array<Projected<CC, CSel> & CRels>;
113
+ }>;
78
114
  /** Add a **relationship aggregate** — `issue.countAs("commentCount", comment, …)`
79
115
  * (`REDUCE-DESIGN.md` §9). Like {@link sub} (explicit correlation, optional child
80
116
  * `build` for a filtered `count(child WHERE …)`), but the relationship surfaces a single
@@ -85,12 +121,16 @@ interface QueryBase<C extends AnyCols, Rels, One extends boolean, Sel extends st
85
121
  child: Array<keyof CC & string>;
86
122
  }, build?: (q: Query<CC>) => Query<CC, unknown>): Query<C, Rels & {
87
123
  [P in A]: number;
88
- }, One, Sel>;
124
+ }, One, Sel, LocalRels & {
125
+ [P in A]: number;
126
+ }>;
89
127
  /** `countAs` by a named {@link Relationship} — like the explicit form, but the correlation comes from
90
128
  * `rel(...)` instead of being restated. */
91
129
  countAs<A extends string, CC extends AnyCols>(alias: A, relationship: Relationship<C, CC>, build?: (q: Query<CC>) => Query<CC, unknown>): Query<C, Rels & {
92
130
  [P in A]: number;
93
- }, One, Sel>;
131
+ }, One, Sel, LocalRels & {
132
+ [P in A]: number;
133
+ }>;
94
134
  /** The compiled Zero-wire AST (what a backend's `query` consumes). */
95
135
  ast(): Ast;
96
136
  /** Materialize into a live, typed view. Wired by the Store/backend. A top-level `.one()`
@@ -98,10 +138,11 @@ interface QueryBase<C extends AnyCols, Rels, One extends boolean, Sel extends st
98
138
  * projection ({@link Projected}) — full {@link RowOf} until a column is `select`ed. */
99
139
  materialize(): MaterializedView<Projected<C, Sel> & Rels, One>;
100
140
  }
101
- export type Query<C extends AnyCols, Rels = {}, One extends boolean = false, Sel extends string = never> = Omit<QueryBase<C, Rels, One, Sel>, "where"> & {
102
- where: QueryBase<C, Rels, One, Sel>["where"] & WhereProxy<C, Rels, One, Sel>;
103
- } & WhereSugar<C, Rels, One, Sel>;
104
- type AnyQuery = Query<any, any, any>;
141
+ export type Query<C extends AnyCols, Rels = {}, One extends boolean = false, Sel extends string = never, LocalRels = Rels> = Omit<QueryBase<C, Rels, One, Sel, LocalRels>, "where"> & {
142
+ where: QueryBase<C, Rels, One, Sel, LocalRels>["where"] & WhereProxy<C, Rels, One, Sel, LocalRels>;
143
+ } & WhereSugar<C, Rels, One, Sel, LocalRels>;
144
+ export type AnyQuery = Query<any, any, any, any, any>;
145
+ export type QueryLocalData<Q extends AnyQuery> = Q extends Query<infer C, any, infer One, infer Sel, infer LocalRels> ? One extends true ? (Projected<C, Sel> & LocalRels) | null : readonly (Projected<C, Sel> & LocalRels)[] : never;
105
146
  /** Turn raw, UNTRUSTED wire args into the canonical, typed args a query is built from. Its return
106
147
  * type IS the query's args type — written once, it flows to both the client call signature and the
107
148
  * `build` step, so there's no second place to restate the shape. */
@@ -182,6 +223,7 @@ export declare function defineQuery<Q extends AnyQuery>(name: string, build: ()
182
223
  export declare function defineQuery<Args, Ctx extends readonly unknown[], Q extends AnyQuery>(name: string, build: (args: Args, ...ctx: Ctx) => Q): NamedQuery<Args, Ctx, Q>;
183
224
  export declare function defineQuery<Args, Ctx extends readonly unknown[], Q extends AnyQuery>(name: string, validate: QueryValidator<Args>, build: (args: Args, ...ctx: Ctx) => Q): NamedQuery<Args, Ctx, Q>;
184
225
  declare const FRAGMENT_BRAND: unique symbol;
226
+ declare const LOCAL_FRAGMENT_REF_BRAND: unique symbol;
185
227
  /**
186
228
  * A reusable, typed *selection over a table* — Relay's "fragment", promoted to a first-class
187
229
  * value. **Two verbs** compose a fragment, on one axis — does its data belong to THIS row or to a
@@ -198,18 +240,31 @@ declare const FRAGMENT_BRAND: unique symbol;
198
240
  * fragments assembles ONE {@link Ast} → one materialization → one `/query` — the whole point
199
241
  * (no request waterfall; design §1).
200
242
  */
201
- export interface Fragment<C extends AnyCols, Rels = {}, Sel extends string = never> {
202
- (q: Query<C>): Query<C, Rels, false, Sel>;
243
+ export interface Fragment<C extends AnyCols, Rels = {}, Sel extends string = never, LocalRels = Rels> {
244
+ (q: Query<C>): Query<C, Rels, false, Sel, LocalRels>;
203
245
  readonly table: TableLike<C>;
204
246
  readonly [FRAGMENT_BRAND]: true;
205
247
  }
206
248
  /**
207
- * The "fragment ref" a parent passes down for a {@link Fragment} read: the already-projected
208
- * node(s) at the fragment's alias in the shared root view — i.e. the fragment's result shape.
209
- * It is **masked** ({@link Projected}) to the fragment's own `select` a fragment reads only the
210
- * columns it declared. A fragment with no `select` stays the full `RowOf<C> & Rels` (§10.6).
249
+ * The data returned by `useFragment(fragment, ref)`: the fragment's own selected columns plus
250
+ * immediate relationship values. Relationships whose builder is another fragment surface as
251
+ * opaque {@link FragmentRef}s, so child-owned payload is read only by the child fragment reader.
211
252
  */
212
- export type FragmentRef<F> = F extends Fragment<infer C, infer Rels, infer Sel> ? Projected<C, Sel> & Rels : never;
253
+ export type FragmentData<F> = F extends Fragment<infer C, unknown, infer Sel, infer LocalRels> ? Projected<C, Sel> & LocalRels : never;
254
+ export interface FragmentCoverage<Q extends AnyQuery = AnyQuery> {
255
+ readonly key: string;
256
+ readonly query: Q;
257
+ }
258
+ export interface LocalFragmentRef<F extends Fragment<any, any, any, any> = Fragment<any, any, any, any>> {
259
+ readonly [LOCAL_FRAGMENT_REF_BRAND]: true;
260
+ readonly source: "local";
261
+ readonly table: string;
262
+ readonly pk: Readonly<Record<string, LitValue>>;
263
+ readonly coverage: FragmentCoverage;
264
+ readonly __fragment?: F;
265
+ }
266
+ /** The opaque token a parent passes to a component that reads {@link FragmentData} for `F`. */
267
+ export type FragmentRef<F> = F extends Fragment<any, any, any, any> ? LocalFragmentRef<F> : never;
213
268
  /**
214
269
  * Define a co-located, composable {@link Fragment}: a named selection over `table`. The returned
215
270
  * value is callable (the `build` transform), so it threads through the existing `sub`/`Rels`
@@ -222,9 +277,19 @@ export type FragmentRef<F> = F extends Fragment<infer C, infer Rels, infer Sel>
222
277
  * .sub("author", schema.user, { parent: ["authorId"], child: ["id"] }, UserAvatar));
223
278
  * ```
224
279
  */
225
- export declare function defineFragment<C extends AnyCols, Rels = {}, Sel extends string = never>(table: TableLike<C>, build: (q: Query<C>) => Query<C, Rels, boolean, Sel>): Fragment<C, Rels, Sel>;
280
+ export declare function defineFragment<C extends AnyCols, Rels = {}, Sel extends string = never, LocalRels = Rels>(table: TableLike<C>, build: (q: Query<C>) => Query<C, Rels, boolean, Sel, LocalRels>): Fragment<C, Rels, Sel, LocalRels>;
226
281
  /** Runtime guard: is `v` a {@link Fragment} (a `defineFragment` value, not a plain build fn)? */
227
- export declare function isFragment(v: unknown): v is Fragment<AnyCols, unknown>;
282
+ export declare function isFragment(v: unknown): v is Fragment<AnyCols, unknown, never, unknown>;
283
+ export declare function isFragmentRelationship(rel: CorrelatedSubquery): boolean;
284
+ export declare function fragmentKey(ref: FragmentRef<any>): string;
285
+ export declare function createLocalFragmentRef<F extends Fragment<any, any, any>>(fragment: F, pk: Record<string, LitValue>, coverage: FragmentCoverage): LocalFragmentRef<F>;
286
+ export declare function createLocalFragmentRefForTable<F extends Fragment<any, any, any>>(table: string, pk: Record<string, LitValue>, coverage: FragmentCoverage): LocalFragmentRef<F>;
287
+ export declare function createRootFragmentRef<F extends Fragment<any, any, any>, Q extends AnyQuery>(fragment: F, query: Q, coverageKey?: string): LocalFragmentRef<F>;
288
+ export declare function fragmentAst<F extends Fragment<any, any, any>>(fragment: F): Ast;
289
+ export declare function localFragmentReadAst<F extends Fragment<any, any, any>>(fragment: F, ref: LocalFragmentRef<F>, primaryKeyFor: (table: string) => readonly string[]): Ast;
290
+ export declare function localRootFragmentRefsAst<F extends Fragment<any, any, any>>(fragment: F, query: AnyQuery, primaryKeyFor: (table: string) => readonly string[]): Ast;
291
+ export declare function localQueryReadAst(query: AnyQuery, primaryKeyFor: (table: string) => readonly string[]): Ast;
292
+ export declare function queryFromAst(ast: Ast): AnyQuery;
228
293
  /** Throw if `ast` references a local-only table ANYWHERE — the complete form of the {@link queries}
229
294
  * root guard (Q1 / E3 client half). The root proxy `get` only sees the table accessed off the
230
295
  * builder root; a local table reached through a relationship / `sub` / `countAs` / `exists` CHILD is
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,GAAG,EAAoB,kBAAkB,EAAE,GAAG,EAAY,QAAQ,EAAa,MAAM,UAAU,CAAC;AAE9G,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,OAAO,EAA6B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAExI,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAQ9D,KAAK,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,SAAS,IAAI,CAC7G,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KACjB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAEzC,sDAAsD;AACtD,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,SAAS,IAAI;KAC5F,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC;CACzD,CAAC;AAEF,oDAAoD;AACpD,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,SAAS,IAAI;KAC5F,CAAC,IAAI,MAAM,CAAC,IAAI,QAAQ,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC;CAC7F,CAAC;AAEF,iGAAiG;AACjG,KAAK,gBAAgB,CAAC,CAAC,EAAE,GAAG,SAAS,OAAO,IAAI,GAAG,SAAS,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAEvG;;;;;;;GAOG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GACzE,KAAK,CAAC,CAAC,CAAC,GACR,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC;AAElC,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS,MAAM,EAAE,SAAS,IAAI,CAC1E,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,KACrC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAE7C,UAAU,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,SAAS;IAC7F,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;kGAC8F;IAC9F,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAClF;;;8FAG0F;IAC1F,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1F,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACtD;0DACsD;IACtD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACtG;wDACoD;IACpD,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C;;;;;;;;;;;;;kFAa8E;IAC9E,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,SAAS,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EACrF,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAC9C,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;IAC3H;;uEAEmE;IACnE,GAAG,CACD,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,OAAO,EAClB,KAAK,GAAG,EAAE,EACV,IAAI,SAAS,MAAM,GAAG,KAAK,EAC3B,UAAU,GAAG,KAAK,EAClB,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,EAEvF,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;KAAE,EAC1E,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAC9C,KAAK,CACN,CAAC,EACD,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,EACvD,GAAG,EACH,GAAG,EACH,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAAE,CAChD,CAAC;IACF,GAAG,CACD,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,OAAO,EAClB,KAAK,GAAG,EAAE,EACV,IAAI,SAAS,MAAM,GAAG,KAAK,EAC3B,UAAU,GAAG,KAAK,EAClB,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,EAEvF,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;KAAE,EAC1E,KAAK,EAAE,CAAC,GACP,KAAK,CACN,CAAC,EACD,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,EACvD,GAAG,EACH,GAAG,EACH,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAAE,CAChD,CAAC;IACF,kEAAkE;IAClE,GAAG,CACD,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,OAAO,EAClB,KAAK,GAAG,EAAE,EACV,IAAI,SAAS,MAAM,GAAG,KAAK,EAC3B,UAAU,GAAG,KAAK,EAClB,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,EAEvF,KAAK,EAAE,CAAC,EACR,YAAY,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EACjC,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAC9C,KAAK,CACN,CAAC,EACD,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,EACvD,GAAG,EACH,GAAG,EACH,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAAE,CAChD,CAAC;IACF,kEAAkE;IAClE,GAAG,CACD,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,OAAO,EAClB,KAAK,GAAG,EAAE,EACV,IAAI,SAAS,MAAM,GAAG,KAAK,EAC3B,UAAU,GAAG,KAAK,EAClB,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,EAEvF,KAAK,EAAE,CAAC,EACR,YAAY,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EACjC,KAAK,EAAE,CAAC,GACP,KAAK,CACN,CAAC,EACD,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,EACvD,GAAG,EACH,GAAG,EACH,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAAE,CAChD,CAAC;IACF;;uDAEmD;IACnD,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,SAAS,MAAM,GAAG,KAAK,EAC/E,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;KAAE,EAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GACxD,KAAK,CACN,CAAC,EACD,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,EACvD,GAAG,EACH,GAAG,EACH,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,CAC7D,CAAC;IACF;;oGAEgG;IAChG,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,SAAS,MAAM,GAAG,KAAK,EAC/E,KAAK,EAAE,CAAC,EACR,YAAY,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EACjC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GACxD,KAAK,CACN,CAAC,EACD,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,EACvD,GAAG,EACH,GAAG,EACH,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;KAAE,CAC7D,CAAC;IACF;;;;yEAIqE;IACrE,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,OAAO,EAC1C,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;KAAE,EAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAC3C,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,MAAM;KAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,MAAM;KAAE,CAAC,CAAC;IACrF;gDAC4C;IAC5C,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,OAAO,EAC1C,KAAK,EAAE,CAAC,EACR,YAAY,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EACjC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAC3C,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,MAAM;KAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,MAAM;KAAE,CAAC,CAAC;IACrF,sEAAsE;IACtE,GAAG,IAAI,GAAG,CAAC;IACX;;4FAEwF;IACxF,WAAW,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;CAChE;AAED,MAAM,MAAM,KAAK,CACf,CAAC,SAAS,OAAO,EACjB,IAAI,GAAG,EAAE,EACT,GAAG,SAAS,OAAO,GAAG,KAAK,EAC3B,GAAG,SAAS,MAAM,GAAG,KAAK,EAC1B,SAAS,GAAG,IAAI,IAEd,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,GACtD;IAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;CAAE,GACtG,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAE7C,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEtD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,QAAQ,IAC3C,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,SAAS,CAAC,GAChE,GAAG,SAAS,IAAI,GACd,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,GACtC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,GAC5C,KAAK,CAAC;AAeZ;;qEAEqE;AACrE,MAAM,MAAM,cAAc,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAC9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,SAAS,QAAQ,EAAE,GAAG,SAAS,SAAS,OAAO,EAAE,GAAG,EAAE,IAAI,CACxF,IAAI,EAAE,IAAI,EACV,GAAG,GAAG,EAAE,GAAG,KACR,CAAC,CAAC;AAEP;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,GAAG,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,SAAS,QAAQ;IAClF,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IAC7B;2EACuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;8DAC0D;IAC1D,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACvG,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,SAAS,QAAQ,EAClF,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,GACpC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5B,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,SAAS,QAAQ,EAClF,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,EAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,GACpC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAkB5B,QAAA,MAAM,cAAc,EAAE,OAAO,MAAkC,CAAC;AAChE,QAAA,MAAM,wBAAwB,EAAE,OAAO,MAA0C,CAAC;AAGlF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,SAAS,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI;IAClG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,MAAM,SAAS,CAAC,GAC1F,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,GAC7B,KAAK,CAAC;AAEV,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IAC7D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACrG,QAAQ,CAAC,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;CACzB;AAED,+FAA+F;AAC/F,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAElG;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,SAAS,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,EACvG,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,GAC9D,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAGnC;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAEtF;AAaD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAEvE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAGzD;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACtE,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,CAAC,CAAC,CAAC,CAErB;AAED,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9E,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,CAAC,CAAC,CAAC,CAQrB;AAED,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,QAAQ,EACzF,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,CAAC,EACR,WAAW,SAGT,GACD,gBAAgB,CAAC,CAAC,CAAC,CAUrB;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,CAE/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpE,QAAQ,EAAE,CAAC,EACX,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,EACxB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAClD,GAAG,CASL;AAED,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACxE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAClD,GAAG,CAWL;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAClD,GAAG,CAEL;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAO/C;AAsHD;;;;;2EAK2E;AAC3E,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAUxF;AA6QD,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA2BD;gFACgF;AAChF,wBAAgB,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,OAAO,EAC3D,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAClC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAC5C,IAAI,CAAC,EAAE,UAAU,GAChB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,sFAAsF;AACtF,wBAAgB,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,GAAG,OAAO,EACpD,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;CAAE,EAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAC5C,IAAI,CAAC,EAAE,UAAU,GAChB,IAAI,CAAC,CAAC,CAAC,CAAC;AAOX,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,OAAO,EAC9D,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAClC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAC5C,IAAI,CAAC,EAAE,UAAU,GAChB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,GAAG,OAAO,EACvD,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;CAAE,EAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAC5C,IAAI,CAAC,EAAE,UAAU,GAChB,IAAI,CAAC,CAAC,CAAC,CAAC;AAOX;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,OAAO,EACjE,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAClC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAC3C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,wBAAgB,YAAY,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,GAAG,OAAO,EAC1D,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;CAAE,EAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAC3C,IAAI,CAAC,CAAC,CAAC,CAAC;AAMX,kKAAkK;AAClK,wBAAgB,eAAe,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,OAAO,EACpE,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAClC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAC3C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,wBAAgB,eAAe,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC,GAAG,OAAO,EAC7D,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,IAAI,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;CAAE,EAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAC3C,IAAI,CAAC,CAAC,CAAC,CAAC;AAQX,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAE3E,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B;;kGAE8F;IAC9F,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,EACvC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,EAC5C,IAAI,CAAC,EAAE,cAAc,GACpB,SAAS,CAAC,CAAC,CAAC,CA4Bd;AAED;4FAC4F;AAC5F,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAElF"}
package/dist/query.js CHANGED
@@ -27,6 +27,8 @@ export function defineQuery(name, validateOrBuild, maybeBuild) {
27
27
  }
28
28
  // ----------------------------- fragments (FRAGMENT-COMPOSITION-DESIGN.md, Phase 0) -----------------------------
29
29
  const FRAGMENT_BRAND = Symbol("rindle.fragment");
30
+ const LOCAL_FRAGMENT_REF_BRAND = Symbol("rindle.localFragmentRef");
31
+ const FRAGMENT_REL_BRAND = Symbol("rindle.fragmentRelationship");
30
32
  /**
31
33
  * Define a co-located, composable {@link Fragment}: a named selection over `table`. The returned
32
34
  * value is callable (the `build` transform), so it threads through the existing `sub`/`Rels`
@@ -47,6 +49,143 @@ export function defineFragment(table, build) {
47
49
  export function isFragment(v) {
48
50
  return typeof v === "function" && v[FRAGMENT_BRAND] === true;
49
51
  }
52
+ function isLocalFragmentRef(v) {
53
+ return typeof v === "object" && v !== null && v[LOCAL_FRAGMENT_REF_BRAND] === true;
54
+ }
55
+ function markFragmentRelationship(rel) {
56
+ Object.defineProperty(rel, FRAGMENT_REL_BRAND, { value: true });
57
+ return rel;
58
+ }
59
+ export function isFragmentRelationship(rel) {
60
+ return rel[FRAGMENT_REL_BRAND] === true;
61
+ }
62
+ export function fragmentKey(ref) {
63
+ if (!isLocalFragmentRef(ref))
64
+ throw new Error("fragmentKey(): expected an opaque fragment ref.");
65
+ return stableKey({ table: ref.table, pk: ref.pk });
66
+ }
67
+ export function createLocalFragmentRef(fragment, pk, coverage) {
68
+ return createLocalFragmentRefForTable(fragment.table[SCHEMA].name, pk, coverage);
69
+ }
70
+ export function createLocalFragmentRefForTable(table, pk, coverage) {
71
+ return {
72
+ [LOCAL_FRAGMENT_REF_BRAND]: true,
73
+ source: "local",
74
+ table,
75
+ pk: { ...pk },
76
+ coverage,
77
+ };
78
+ }
79
+ export function createRootFragmentRef(fragment, query, coverageKey = stableKey({
80
+ ast: query.ast(),
81
+ remote: typeof query.name === "string" ? { name: query.name, args: query.args } : null,
82
+ })) {
83
+ const ast = query.ast();
84
+ const table = fragment.table[SCHEMA];
85
+ if (ast.table !== table.name) {
86
+ throw new Error(`useRoot(): the coverage query is over "${ast.table}" but the fragment is over "${table.name}".`);
87
+ }
88
+ const pk = primaryKeyFromWhere(ast, table.primaryKey);
89
+ return createLocalFragmentRef(fragment, pk, { key: coverageKey, query });
90
+ }
91
+ export function fragmentAst(fragment) {
92
+ return childAst(fragment.table, fragment);
93
+ }
94
+ export function localFragmentReadAst(fragment, ref, primaryKeyFor) {
95
+ const table = fragment.table[SCHEMA].name;
96
+ if (ref.table !== table) {
97
+ throw new Error(`useFragment(): the ref is for "${ref.table}" but the fragment is over "${table}".`);
98
+ }
99
+ const ast = localizeFragmentAst(fragmentAst(fragment), primaryKeyFor);
100
+ ast.where = andConditions(pkConditions(ref.pk), ast.where);
101
+ ast.one = true;
102
+ return ast;
103
+ }
104
+ export function localRootFragmentRefsAst(fragment, query, primaryKeyFor) {
105
+ const ast = query.ast();
106
+ const table = fragment.table[SCHEMA].name;
107
+ if (ast.table !== table) {
108
+ throw new Error(`useRoot(): the coverage query is over "${ast.table}" but the fragment is over "${table}".`);
109
+ }
110
+ const out = { ...ast, select: uniqSort([...primaryKeyFor(table)]) };
111
+ delete out.related;
112
+ return out;
113
+ }
114
+ export function localQueryReadAst(query, primaryKeyFor) {
115
+ return localizeFragmentAst(query.ast(), primaryKeyFor);
116
+ }
117
+ export function queryFromAst(ast) {
118
+ return {
119
+ ast: () => ast,
120
+ materialize: () => {
121
+ throw new Error("queryFromAst(): materialize() requires a Store; pass this query through Store/React.");
122
+ },
123
+ };
124
+ }
125
+ function primaryKeyFromWhere(ast, primaryKey) {
126
+ const found = new Map();
127
+ collectLiteralEquals(ast.where, found);
128
+ const pk = {};
129
+ for (const col of primaryKey) {
130
+ if (!found.has(col)) {
131
+ throw new Error(`useRoot(): the coverage query must constrain primary key column "${col}" with a literal equality.`);
132
+ }
133
+ pk[col] = found.get(col);
134
+ }
135
+ return pk;
136
+ }
137
+ function collectLiteralEquals(cond, out) {
138
+ if (!cond)
139
+ return;
140
+ if (cond.type === "and") {
141
+ for (const c of cond.conditions)
142
+ collectLiteralEquals(c, out);
143
+ return;
144
+ }
145
+ if (cond.type !== "simple" || cond.op !== "=")
146
+ return;
147
+ const leftCol = cond.left.type === "column" ? cond.left.name : undefined;
148
+ const rightCol = cond.right.type === "column" ? cond.right.name : undefined;
149
+ if (leftCol !== undefined && cond.right.type === "literal")
150
+ out.set(leftCol, cond.right.value);
151
+ else if (rightCol !== undefined && cond.left.type === "literal")
152
+ out.set(rightCol, cond.left.value);
153
+ }
154
+ function pkConditions(pk) {
155
+ return Object.keys(pk)
156
+ .sort()
157
+ .map((name) => fieldCondition(name, pk[name]));
158
+ }
159
+ function andConditions(conditions, tail) {
160
+ const all = tail ? [...conditions, tail] : conditions;
161
+ if (all.length === 0)
162
+ return undefined;
163
+ if (all.length === 1)
164
+ return all[0];
165
+ return { type: "and", conditions: all };
166
+ }
167
+ function localizeFragmentAst(ast, primaryKeyFor) {
168
+ const out = { ...ast };
169
+ if (ast.select !== undefined)
170
+ out.select = uniqSort([...ast.select, ...primaryKeyFor(ast.table)]);
171
+ if (ast.related !== undefined) {
172
+ out.related = ast.related.map((rel) => {
173
+ if (rel.subquery.aggregate !== undefined)
174
+ return rel;
175
+ if (!isFragmentRelationship(rel)) {
176
+ return { ...rel, subquery: localizeFragmentAst(rel.subquery, primaryKeyFor) };
177
+ }
178
+ const childPk = primaryKeyFor(rel.subquery.table);
179
+ const subquery = {
180
+ ...rel.subquery,
181
+ select: uniqSort([...childPk]),
182
+ };
183
+ delete subquery.related;
184
+ return markFragmentRelationship({ ...rel, subquery });
185
+ });
186
+ }
187
+ return out;
188
+ }
50
189
  function emptyState(table) {
51
190
  return { table, wheres: [], orderBy: [], related: [], one: false };
52
191
  }
@@ -115,20 +254,30 @@ function childAst(child, build) {
115
254
  cq = build(cq);
116
255
  return cq.ast();
117
256
  }
257
+ function composeCorrelatedBuild(build, edge) {
258
+ if (edge === undefined)
259
+ return build;
260
+ if (!isFragment(build)) {
261
+ throw new Error("sub(): an edge callback is only supported when the child build is a Fragment.");
262
+ }
263
+ return (q) => edge(build(q));
264
+ }
118
265
  /** Resolve the two `sub`/`countAs`/`exists` call shapes to a common `{ child, corr, build }`:
119
266
  * either a named {@link Relationship} (`(rel, build?)`) or an explicit `(child, corr, build?)`. */
120
- function resolveCorrelated(a, b, c) {
267
+ function resolveCorrelated(a, b, c, d) {
121
268
  if (isRelationship(a)) {
122
269
  return {
123
270
  child: a.child,
124
271
  corr: { parent: [...a.correlation.parent], child: [...a.correlation.child] },
125
- build: b,
272
+ build: composeCorrelatedBuild(b, c),
273
+ fragment: isFragment(b),
126
274
  };
127
275
  }
128
276
  return {
129
277
  child: a,
130
278
  corr: b,
131
- build: c,
279
+ build: composeCorrelatedBuild(c, d),
280
+ fragment: isFragment(c),
132
281
  };
133
282
  }
134
283
  // ----------------------------- the merge pass (`include`, FRAGMENT-COMPOSITION-DESIGN §5) -----------
@@ -215,7 +364,8 @@ function mergeRelatedLists(base, add) {
215
364
  `same alias with different correlation/table/where/orderBy/limit. Give them distinct aliases ` +
216
365
  `or align them (FRAGMENT-COMPOSITION-DESIGN §10.2).`);
217
366
  }
218
- byAlias.set(alias, { ...existing, subquery: mergeSubqueryAst(existing.subquery, csq.subquery) });
367
+ const merged = { ...existing, subquery: mergeSubqueryAst(existing.subquery, csq.subquery) };
368
+ byAlias.set(alias, isFragmentRelationship(existing) || isFragmentRelationship(csq) ? markFragmentRelationship(merged) : merged);
219
369
  }
220
370
  return [...byAlias.values()].sort((a, b) => {
221
371
  const x = aliasOf(a);
@@ -270,15 +420,15 @@ guardAst) {
270
420
  const fragAst = childAst(fragTable, fragment);
271
421
  return makeQuery(meta, mergeIncludedFragment(s, fragAst), onMat, named, guardAst);
272
422
  },
273
- sub: (alias, childOrRel, b, c) => {
274
- const { child, corr, build } = resolveCorrelated(childOrRel, b, c);
423
+ sub: (alias, childOrRel, b, c, d) => {
424
+ const { child, corr, build, fragment } = resolveCorrelated(childOrRel, b, c, d);
275
425
  const sub = childAst(child, build);
276
426
  sub.alias = alias;
277
427
  const csq = {
278
428
  correlation: { parentField: corr.parent, childField: corr.child },
279
429
  subquery: sub,
280
430
  };
281
- return next({ related: [...s.related, csq] });
431
+ return next({ related: [...s.related, fragment ? markFragmentRelationship(csq) : csq] });
282
432
  },
283
433
  countAs: (alias, childOrRel, b, c) => {
284
434
  // Same correlated-child mechanism as `sub`, but mark the child a `count` aggregate: