@rindle/normalized 0.1.2 → 0.1.6
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/dist/agg-table.d.ts +2 -2
- package/dist/agg-table.d.ts.map +1 -1
- package/dist/agg-table.js +16 -9
- package/dist/agg-table.js.map +1 -1
- package/package.json +3 -3
- package/src/agg-table.ts +15 -9
package/dist/agg-table.d.ts
CHANGED
|
@@ -8,12 +8,12 @@ export declare function aggTableName(csq: CorrelatedSubquery): string;
|
|
|
8
8
|
/** Every synthetic aggregate table `ast` surfaces (recursively, a nested aggregate under a
|
|
9
9
|
* materialized relationship included), as flat table schemas — the twin of Rust
|
|
10
10
|
* `agg_table_schemas`. Columns `[childField…, "count"]`; PK = the leading group columns. */
|
|
11
|
-
export declare function aggTableSchemas(ast: Ast): NormalizedTableSchema[];
|
|
11
|
+
export declare function aggTableSchemas(ast: Ast, isLocal?: (table: string) => boolean): NormalizedTableSchema[];
|
|
12
12
|
/** Rewrite an AST for the LOCAL engine: each relationship `count` becomes a precomputed,
|
|
13
13
|
* source-backed singular relationship over its synthetic table — read the server's count
|
|
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
17
|
* view-schema slot order is preserved. Returns a new AST; the input is not mutated. */
|
|
18
|
-
export declare function rewriteAggregates(ast: Ast): Ast;
|
|
18
|
+
export declare function rewriteAggregates(ast: Ast, isLocal?: (table: string) => boolean): Ast;
|
|
19
19
|
//# sourceMappingURL=agg-table.d.ts.map
|
package/dist/agg-table.d.ts.map
CHANGED
|
@@ -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;AAsCxB;;;;wEAIwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAM5D;AA8FD;;6FAE6F;AAC7F,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,qBAAqB,EAAE,
|
|
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;AAsCxB;;;;wEAIwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAM5D;AA8FD;;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"}
|
package/dist/agg-table.js
CHANGED
|
@@ -159,14 +159,18 @@ function hashLit(f, lit) {
|
|
|
159
159
|
/** Every synthetic aggregate table `ast` surfaces (recursively, a nested aggregate under a
|
|
160
160
|
* materialized relationship included), as flat table schemas — the twin of Rust
|
|
161
161
|
* `agg_table_schemas`. Columns `[childField…, "count"]`; PK = the leading group columns. */
|
|
162
|
-
export function aggTableSchemas(ast) {
|
|
162
|
+
export function aggTableSchemas(ast, isLocal) {
|
|
163
163
|
const out = [];
|
|
164
|
-
collectAggTables(ast, out);
|
|
164
|
+
collectAggTables(ast, out, isLocal);
|
|
165
165
|
return out;
|
|
166
166
|
}
|
|
167
|
-
function collectAggTables(ast, out) {
|
|
167
|
+
function collectAggTables(ast, out, isLocal) {
|
|
168
168
|
for (const r of ast.related ?? []) {
|
|
169
169
|
if (r.subquery.aggregate) {
|
|
170
|
+
// L1 (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5.2): a count over a LOCAL child is a native IVM
|
|
171
|
+
// reduce — it has no server-authoritative `__agg_*` base, so emit no synthetic schema for it.
|
|
172
|
+
if (isLocal?.(r.subquery.table))
|
|
173
|
+
continue;
|
|
170
174
|
const k = r.correlation.childField.length;
|
|
171
175
|
out.push({
|
|
172
176
|
name: aggTableName(r),
|
|
@@ -175,7 +179,7 @@ function collectAggTables(ast, out) {
|
|
|
175
179
|
});
|
|
176
180
|
}
|
|
177
181
|
else {
|
|
178
|
-
collectAggTables(r.subquery, out);
|
|
182
|
+
collectAggTables(r.subquery, out, isLocal);
|
|
179
183
|
}
|
|
180
184
|
}
|
|
181
185
|
}
|
|
@@ -185,13 +189,16 @@ function collectAggTables(ast, out) {
|
|
|
185
189
|
* (which would recount the already-aggregated rows). Non-aggregate relationships recurse
|
|
186
190
|
* (a nested aggregate is rewritten too); the parent's frame is otherwise untouched, so the
|
|
187
191
|
* view-schema slot order is preserved. Returns a new AST; the input is not mutated. */
|
|
188
|
-
export function rewriteAggregates(ast) {
|
|
192
|
+
export function rewriteAggregates(ast, isLocal) {
|
|
189
193
|
if (!ast.related?.length)
|
|
190
194
|
return ast;
|
|
191
|
-
return { ...ast, related: ast.related.map(rewriteRelationship) };
|
|
195
|
+
return { ...ast, related: ast.related.map((r) => rewriteRelationship(r, isLocal)) };
|
|
192
196
|
}
|
|
193
|
-
function rewriteRelationship(csq) {
|
|
194
|
-
|
|
197
|
+
function rewriteRelationship(csq, isLocal) {
|
|
198
|
+
// L1 (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5.2): a count over a LOCAL child is left as the native
|
|
199
|
+
// IVM reduce (the pre-agg-sync path). The server never ships a count for it, so the precomputed
|
|
200
|
+
// rewrite would point the relationship at an `__agg_*` table that is fed nothing → empty forever.
|
|
201
|
+
if (csq.subquery.aggregate && !isLocal?.(csq.subquery.table)) {
|
|
195
202
|
const subquery = {
|
|
196
203
|
table: aggTableName(csq),
|
|
197
204
|
aggregate: csq.subquery.aggregate,
|
|
@@ -206,6 +213,6 @@ function rewriteRelationship(csq) {
|
|
|
206
213
|
out.system = csq.system;
|
|
207
214
|
return out;
|
|
208
215
|
}
|
|
209
|
-
return { ...csq, subquery: rewriteAggregates(csq.subquery) };
|
|
216
|
+
return { ...csq, subquery: rewriteAggregates(csq.subquery, isLocal) };
|
|
210
217
|
}
|
|
211
218
|
//# sourceMappingURL=agg-table.js.map
|
package/dist/agg-table.js.map
CHANGED
|
@@ -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.1.
|
|
3
|
+
"version": "0.1.6",
|
|
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/
|
|
29
|
-
"@rindle/
|
|
28
|
+
"@rindle/client": "0.1.6",
|
|
29
|
+
"@rindle/wasm": "0.1.6"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^22.10.0",
|
package/src/agg-table.ts
CHANGED
|
@@ -166,15 +166,18 @@ function hashLit(f: Fnv, lit: LitValue): void {
|
|
|
166
166
|
/** Every synthetic aggregate table `ast` surfaces (recursively, a nested aggregate under a
|
|
167
167
|
* materialized relationship included), as flat table schemas — the twin of Rust
|
|
168
168
|
* `agg_table_schemas`. Columns `[childField…, "count"]`; PK = the leading group columns. */
|
|
169
|
-
export function aggTableSchemas(ast: Ast): NormalizedTableSchema[] {
|
|
169
|
+
export function aggTableSchemas(ast: Ast, isLocal?: (table: string) => boolean): NormalizedTableSchema[] {
|
|
170
170
|
const out: NormalizedTableSchema[] = [];
|
|
171
|
-
collectAggTables(ast, out);
|
|
171
|
+
collectAggTables(ast, out, isLocal);
|
|
172
172
|
return out;
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
function collectAggTables(ast: Ast, out: NormalizedTableSchema[]): void {
|
|
175
|
+
function collectAggTables(ast: Ast, out: NormalizedTableSchema[], isLocal?: (table: string) => boolean): void {
|
|
176
176
|
for (const r of ast.related ?? []) {
|
|
177
177
|
if (r.subquery.aggregate) {
|
|
178
|
+
// L1 (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5.2): a count over a LOCAL child is a native IVM
|
|
179
|
+
// reduce — it has no server-authoritative `__agg_*` base, so emit no synthetic schema for it.
|
|
180
|
+
if (isLocal?.(r.subquery.table)) continue;
|
|
178
181
|
const k = r.correlation.childField.length;
|
|
179
182
|
out.push({
|
|
180
183
|
name: aggTableName(r),
|
|
@@ -182,7 +185,7 @@ function collectAggTables(ast: Ast, out: NormalizedTableSchema[]): void {
|
|
|
182
185
|
primaryKey: Array.from({ length: k }, (_, i) => i),
|
|
183
186
|
});
|
|
184
187
|
} else {
|
|
185
|
-
collectAggTables(r.subquery, out);
|
|
188
|
+
collectAggTables(r.subquery, out, isLocal);
|
|
186
189
|
}
|
|
187
190
|
}
|
|
188
191
|
}
|
|
@@ -193,13 +196,16 @@ function collectAggTables(ast: Ast, out: NormalizedTableSchema[]): void {
|
|
|
193
196
|
* (which would recount the already-aggregated rows). Non-aggregate relationships recurse
|
|
194
197
|
* (a nested aggregate is rewritten too); the parent's frame is otherwise untouched, so the
|
|
195
198
|
* view-schema slot order is preserved. Returns a new AST; the input is not mutated. */
|
|
196
|
-
export function rewriteAggregates(ast: Ast): Ast {
|
|
199
|
+
export function rewriteAggregates(ast: Ast, isLocal?: (table: string) => boolean): Ast {
|
|
197
200
|
if (!ast.related?.length) return ast;
|
|
198
|
-
return { ...ast, related: ast.related.map(rewriteRelationship) };
|
|
201
|
+
return { ...ast, related: ast.related.map((r) => rewriteRelationship(r, isLocal)) };
|
|
199
202
|
}
|
|
200
203
|
|
|
201
|
-
function rewriteRelationship(csq: CorrelatedSubquery): CorrelatedSubquery {
|
|
202
|
-
|
|
204
|
+
function rewriteRelationship(csq: CorrelatedSubquery, isLocal?: (table: string) => boolean): CorrelatedSubquery {
|
|
205
|
+
// L1 (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5.2): a count over a LOCAL child is left as the native
|
|
206
|
+
// IVM reduce (the pre-agg-sync path). The server never ships a count for it, so the precomputed
|
|
207
|
+
// rewrite would point the relationship at an `__agg_*` table that is fed nothing → empty forever.
|
|
208
|
+
if (csq.subquery.aggregate && !isLocal?.(csq.subquery.table)) {
|
|
203
209
|
const subquery: Ast = {
|
|
204
210
|
table: aggTableName(csq),
|
|
205
211
|
aggregate: csq.subquery.aggregate as Aggregate,
|
|
@@ -212,5 +218,5 @@ function rewriteRelationship(csq: CorrelatedSubquery): CorrelatedSubquery {
|
|
|
212
218
|
if (csq.system !== undefined) out.system = csq.system;
|
|
213
219
|
return out;
|
|
214
220
|
}
|
|
215
|
-
return { ...csq, subquery: rewriteAggregates(csq.subquery) };
|
|
221
|
+
return { ...csq, subquery: rewriteAggregates(csq.subquery, isLocal) };
|
|
216
222
|
}
|