@rindle/normalized 0.9.0 → 0.10.1

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.
@@ -14,6 +14,17 @@ export declare function aggTableSchemas(ast: Ast, isLocal?: (table: string) => b
14
14
  * with a plain join + the same scalar projection (`aggregatePrecomputed`), never a `reduce`
15
15
  * (which would recount the already-aggregated rows). Non-aggregate relationships recurse
16
16
  * (a nested aggregate is rewritten too); the parent's frame is otherwise untouched, so the
17
- * view-schema slot order is preserved. Returns a new AST; the input is not mutated. */
17
+ * view-schema slot order is preserved. Returns a new AST; the input is not mutated.
18
+ *
19
+ * The `where` tree is rewritten the SAME way (`PARENT-AGGREGATE-FILTER-DESIGN.md` §3): a
20
+ * `having_count` parent gate lowers to an EXISTS whose subquery CLONES the display `count_as`
21
+ * and adds a post-aggregation `HAVING`. That is a relationship `count` like any other, so §3's
22
+ * premise — the client never recomputes a count, it lacks the child rows — applies to it too;
23
+ * left un-rewritten the gate would reduce over child rows the server (rightly) does not sync
24
+ * and every parent would fail it. `agg_table_name` hashes neither `alias` nor `having`, so the
25
+ * gate resolves to the SAME `__agg_*` table the display `count_as` already registers and syncs:
26
+ * the rewrite costs no extra table, no extra rows, and reads a count the server already sent.
27
+ * Its counterpart is the server pruning the gate's witnesses from the footprint (Rust
28
+ * `table_tree`) — that prune is only sound BECAUSE of this rewrite, so ship this side first. */
18
29
  export declare function rewriteAggregates(ast: Ast, isLocal?: (table: string) => boolean): Ast;
19
30
  //# sourceMappingURL=agg-table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agg-table.d.ts","sourceRoot":"","sources":["../src/agg-table.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAEV,GAAG,EAEH,kBAAkB,EAGlB,qBAAqB,EAEtB,MAAM,gBAAgB,CAAC;AA2CxB;;;;wEAIwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAM5D;AA0ID;;6FAE6F;AAC7F,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,qBAAqB,EAAE,CAIvG;AAoBD;;;;;wFAKwF;AACxF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,GAAG,CAGrF"}
1
+ {"version":3,"file":"agg-table.d.ts","sourceRoot":"","sources":["../src/agg-table.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAEV,GAAG,EAEH,kBAAkB,EAGlB,qBAAqB,EAEtB,MAAM,gBAAgB,CAAC;AA2CxB;;;;wEAIwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAM5D;AA0ID;;6FAE6F;AAC7F,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,qBAAqB,EAAE,CAIvG;AAoBD;;;;;;;;;;;;;;;;iGAgBiG;AACjG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,GAAG,CAUrF"}
package/dist/agg-table.js CHANGED
@@ -238,11 +238,56 @@ function collectAggTables(ast, out, isLocal) {
238
238
  * with a plain join + the same scalar projection (`aggregatePrecomputed`), never a `reduce`
239
239
  * (which would recount the already-aggregated rows). Non-aggregate relationships recurse
240
240
  * (a nested aggregate is rewritten too); the parent's frame is otherwise untouched, so the
241
- * view-schema slot order is preserved. Returns a new AST; the input is not mutated. */
241
+ * view-schema slot order is preserved. Returns a new AST; the input is not mutated.
242
+ *
243
+ * The `where` tree is rewritten the SAME way (`PARENT-AGGREGATE-FILTER-DESIGN.md` §3): a
244
+ * `having_count` parent gate lowers to an EXISTS whose subquery CLONES the display `count_as`
245
+ * and adds a post-aggregation `HAVING`. That is a relationship `count` like any other, so §3's
246
+ * premise — the client never recomputes a count, it lacks the child rows — applies to it too;
247
+ * left un-rewritten the gate would reduce over child rows the server (rightly) does not sync
248
+ * and every parent would fail it. `agg_table_name` hashes neither `alias` nor `having`, so the
249
+ * gate resolves to the SAME `__agg_*` table the display `count_as` already registers and syncs:
250
+ * the rewrite costs no extra table, no extra rows, and reads a count the server already sent.
251
+ * Its counterpart is the server pruning the gate's witnesses from the footprint (Rust
252
+ * `table_tree`) — that prune is only sound BECAUSE of this rewrite, so ship this side first. */
242
253
  export function rewriteAggregates(ast, isLocal) {
243
- if (!ast.related?.length)
254
+ const where = ast.where && rewriteConditionAggregates(ast.where, isLocal);
255
+ const related = ast.related?.length
256
+ ? ast.related.map((r) => rewriteRelationship(r, isLocal))
257
+ : ast.related;
258
+ if (where === ast.where && related === ast.related)
244
259
  return ast;
245
- return { ...ast, related: ast.related.map((r) => rewriteRelationship(r, isLocal)) };
260
+ const out = { ...ast };
261
+ if (where)
262
+ out.where = where;
263
+ if (related)
264
+ out.related = related;
265
+ return out;
266
+ }
267
+ /** The `where`-tree half of {@link rewriteAggregates}: an EXISTS gate whose subquery carries an
268
+ * aggregate (the `having_count` lowering) is rewritten by the very same
269
+ * {@link rewriteRelationship}; every other condition recurses structurally. Returns `cond`
270
+ * itself when nothing below it rewrote, so an untouched frame keeps object identity and the
271
+ * caller can skip the copy. */
272
+ function rewriteConditionAggregates(cond, isLocal) {
273
+ switch (cond.type) {
274
+ case "and":
275
+ case "or": {
276
+ let changed = false;
277
+ const conditions = cond.conditions.map((c) => {
278
+ const next = rewriteConditionAggregates(c, isLocal);
279
+ changed ||= next !== c;
280
+ return next;
281
+ });
282
+ return changed ? { ...cond, conditions } : cond;
283
+ }
284
+ case "correlatedSubquery": {
285
+ const related = rewriteRelationship(cond.related, isLocal);
286
+ return related === cond.related ? cond : { ...cond, related };
287
+ }
288
+ default:
289
+ return cond; // a `simple` leaf holds no subquery
290
+ }
246
291
  }
247
292
  function rewriteRelationship(csq, isLocal) {
248
293
  // L1 (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5.2): a count over a LOCAL child is left as the native
@@ -258,11 +303,17 @@ function rewriteRelationship(csq, isLocal) {
258
303
  // child correlation fields, so `childField` still resolves against `[childField…, count]`.
259
304
  if (csq.subquery.alias !== undefined)
260
305
  subquery.alias = csq.subquery.alias;
306
+ // The post-aggregation `HAVING` SURVIVES the rewrite — it is the gate's whole predicate
307
+ // (`count > n`), and it addresses the reduce's output column, which is exactly what the
308
+ // synthetic row carries. A display `count_as` never has one, so this is inert there.
309
+ if (csq.subquery.having !== undefined)
310
+ subquery.having = csq.subquery.having;
261
311
  const out = { correlation: csq.correlation, subquery };
262
312
  if (csq.system !== undefined)
263
313
  out.system = csq.system;
264
314
  return out;
265
315
  }
266
- return { ...csq, subquery: rewriteAggregates(csq.subquery, isLocal) };
316
+ const subquery = rewriteAggregates(csq.subquery, isLocal);
317
+ return subquery === csq.subquery ? csq : { ...csq, subquery };
267
318
  }
268
319
  //# sourceMappingURL=agg-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agg-table.js","sourceRoot":"","sources":["../src/agg-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agg-table.js","sourceRoot":"","sources":["../src/agg-table.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rindle/normalized",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,8 +25,8 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@rindle/client": "0.9.0",
29
- "@rindle/wasm": "0.9.0"
28
+ "@rindle/client": "0.10.1",
29
+ "@rindle/wasm": "0.10.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^22.10.0",
package/src/agg-table.ts CHANGED
@@ -244,10 +244,54 @@ function collectAggTables(ast: Ast, out: NormalizedTableSchema[], isLocal?: (tab
244
244
  * with a plain join + the same scalar projection (`aggregatePrecomputed`), never a `reduce`
245
245
  * (which would recount the already-aggregated rows). Non-aggregate relationships recurse
246
246
  * (a nested aggregate is rewritten too); the parent's frame is otherwise untouched, so the
247
- * view-schema slot order is preserved. Returns a new AST; the input is not mutated. */
247
+ * view-schema slot order is preserved. Returns a new AST; the input is not mutated.
248
+ *
249
+ * The `where` tree is rewritten the SAME way (`PARENT-AGGREGATE-FILTER-DESIGN.md` §3): a
250
+ * `having_count` parent gate lowers to an EXISTS whose subquery CLONES the display `count_as`
251
+ * and adds a post-aggregation `HAVING`. That is a relationship `count` like any other, so §3's
252
+ * premise — the client never recomputes a count, it lacks the child rows — applies to it too;
253
+ * left un-rewritten the gate would reduce over child rows the server (rightly) does not sync
254
+ * and every parent would fail it. `agg_table_name` hashes neither `alias` nor `having`, so the
255
+ * gate resolves to the SAME `__agg_*` table the display `count_as` already registers and syncs:
256
+ * the rewrite costs no extra table, no extra rows, and reads a count the server already sent.
257
+ * Its counterpart is the server pruning the gate's witnesses from the footprint (Rust
258
+ * `table_tree`) — that prune is only sound BECAUSE of this rewrite, so ship this side first. */
248
259
  export function rewriteAggregates(ast: Ast, isLocal?: (table: string) => boolean): Ast {
249
- if (!ast.related?.length) return ast;
250
- return { ...ast, related: ast.related.map((r) => rewriteRelationship(r, isLocal)) };
260
+ const where = ast.where && rewriteConditionAggregates(ast.where, isLocal);
261
+ const related = ast.related?.length
262
+ ? ast.related.map((r) => rewriteRelationship(r, isLocal))
263
+ : ast.related;
264
+ if (where === ast.where && related === ast.related) return ast;
265
+ const out: Ast = { ...ast };
266
+ if (where) out.where = where;
267
+ if (related) out.related = related;
268
+ return out;
269
+ }
270
+
271
+ /** The `where`-tree half of {@link rewriteAggregates}: an EXISTS gate whose subquery carries an
272
+ * aggregate (the `having_count` lowering) is rewritten by the very same
273
+ * {@link rewriteRelationship}; every other condition recurses structurally. Returns `cond`
274
+ * itself when nothing below it rewrote, so an untouched frame keeps object identity and the
275
+ * caller can skip the copy. */
276
+ function rewriteConditionAggregates(cond: Condition, isLocal?: (table: string) => boolean): Condition {
277
+ switch (cond.type) {
278
+ case "and":
279
+ case "or": {
280
+ let changed = false;
281
+ const conditions = cond.conditions.map((c) => {
282
+ const next = rewriteConditionAggregates(c, isLocal);
283
+ changed ||= next !== c;
284
+ return next;
285
+ });
286
+ return changed ? { ...cond, conditions } : cond;
287
+ }
288
+ case "correlatedSubquery": {
289
+ const related = rewriteRelationship(cond.related, isLocal);
290
+ return related === cond.related ? cond : { ...cond, related };
291
+ }
292
+ default:
293
+ return cond; // a `simple` leaf holds no subquery
294
+ }
251
295
  }
252
296
 
253
297
  function rewriteRelationship(csq: CorrelatedSubquery, isLocal?: (table: string) => boolean): CorrelatedSubquery {
@@ -263,9 +307,14 @@ function rewriteRelationship(csq: CorrelatedSubquery, isLocal?: (table: string)
263
307
  // The correlation is unchanged: the synthetic table's group columns are named after the
264
308
  // child correlation fields, so `childField` still resolves against `[childField…, count]`.
265
309
  if (csq.subquery.alias !== undefined) subquery.alias = csq.subquery.alias;
310
+ // The post-aggregation `HAVING` SURVIVES the rewrite — it is the gate's whole predicate
311
+ // (`count > n`), and it addresses the reduce's output column, which is exactly what the
312
+ // synthetic row carries. A display `count_as` never has one, so this is inert there.
313
+ if (csq.subquery.having !== undefined) subquery.having = csq.subquery.having;
266
314
  const out: CorrelatedSubquery = { correlation: csq.correlation, subquery };
267
315
  if (csq.system !== undefined) out.system = csq.system;
268
316
  return out;
269
317
  }
270
- return { ...csq, subquery: rewriteAggregates(csq.subquery, isLocal) };
318
+ const subquery = rewriteAggregates(csq.subquery, isLocal);
319
+ return subquery === csq.subquery ? csq : { ...csq, subquery };
271
320
  }