@noy-db/hub 0.1.0-pre.9 → 0.2.0-pre.10
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/aggregate/index.cjs +100 -36
- package/dist/aggregate/index.cjs.map +1 -1
- package/dist/aggregate/index.d.cts +2 -2
- package/dist/aggregate/index.d.ts +2 -2
- package/dist/aggregate/index.js +16 -9
- package/dist/aggregate/index.js.map +1 -1
- package/dist/attestation/index.cjs +305 -0
- package/dist/attestation/index.cjs.map +1 -0
- package/dist/attestation/index.d.cts +52 -0
- package/dist/attestation/index.d.ts +52 -0
- package/dist/attestation/index.js +36 -0
- package/dist/attestation/index.js.map +1 -0
- package/dist/blobs/index.cjs.map +1 -1
- package/dist/blobs/index.d.cts +7 -6
- package/dist/blobs/index.d.ts +7 -6
- package/dist/blobs/index.js +10 -8
- package/dist/blobs/index.js.map +1 -1
- package/dist/bundle/index.cjs +19121 -60
- package/dist/bundle/index.cjs.map +1 -1
- package/dist/bundle/index.d.cts +175 -6
- package/dist/bundle/index.d.ts +175 -6
- package/dist/bundle/index.js +543 -4
- package/dist/bundle/index.js.map +1 -1
- package/dist/chunk-26NK23DZ.js +296 -0
- package/dist/chunk-26NK23DZ.js.map +1 -0
- package/dist/{chunk-TDR6T5CJ.js → chunk-2LPPNWF6.js} +91 -132
- package/dist/chunk-2LPPNWF6.js.map +1 -0
- package/dist/{chunk-PTVMYYON.js → chunk-2N62W5YP.js} +3 -3
- package/dist/{chunk-QGZRWRSL.js → chunk-3LPV6BXR.js} +4 -4
- package/dist/{chunk-QAVUREFT.js → chunk-4CLICFEY.js} +12 -6
- package/dist/chunk-4CLICFEY.js.map +1 -0
- package/dist/chunk-4USCAEDT.js +10529 -0
- package/dist/chunk-4USCAEDT.js.map +1 -0
- package/dist/chunk-5IXJGFF2.js +83 -0
- package/dist/chunk-5IXJGFF2.js.map +1 -0
- package/dist/chunk-5OEJ6GOT.js +124 -0
- package/dist/chunk-5OEJ6GOT.js.map +1 -0
- package/dist/{chunk-4PWAI7Q4.js → chunk-5OX6XVNS.js} +5 -5
- package/dist/{chunk-2CSJGFCB.js → chunk-6EOXTJS2.js} +6 -229
- package/dist/chunk-6EOXTJS2.js.map +1 -0
- package/dist/chunk-6T2UDBKG.js +53 -0
- package/dist/chunk-6T2UDBKG.js.map +1 -0
- package/dist/{chunk-GOUT6DND.js → chunk-6YLPHBKR.js} +382 -95
- package/dist/chunk-6YLPHBKR.js.map +1 -0
- package/dist/chunk-7CEGU63S.js +179 -0
- package/dist/chunk-7CEGU63S.js.map +1 -0
- package/dist/chunk-A3JMGXPG.js +125 -0
- package/dist/chunk-A3JMGXPG.js.map +1 -0
- package/dist/chunk-BB27JMWB.js +795 -0
- package/dist/chunk-BB27JMWB.js.map +1 -0
- package/dist/{chunk-SCZXXXU4.js → chunk-BDV7INMP.js} +7 -32
- package/dist/chunk-BDV7INMP.js.map +1 -0
- package/dist/chunk-C3WE6UJY.js +19 -0
- package/dist/chunk-C3WE6UJY.js.map +1 -0
- package/dist/chunk-CH22FZHT.js +96 -0
- package/dist/chunk-CH22FZHT.js.map +1 -0
- package/dist/chunk-CXFOITNS.js +34 -0
- package/dist/chunk-CXFOITNS.js.map +1 -0
- package/dist/chunk-CXJG63MA.js +109 -0
- package/dist/chunk-CXJG63MA.js.map +1 -0
- package/dist/chunk-DAP2XL7Q.js +51 -0
- package/dist/chunk-DAP2XL7Q.js.map +1 -0
- package/dist/{chunk-AVVPZ4BC.js → chunk-DJRWA3Q5.js} +4 -4
- package/dist/chunk-DRXIZOFV.js +233 -0
- package/dist/chunk-DRXIZOFV.js.map +1 -0
- package/dist/chunk-FO3UEG4S.js +313 -0
- package/dist/chunk-FO3UEG4S.js.map +1 -0
- package/dist/chunk-GAUEWM7D.js +147 -0
- package/dist/chunk-GAUEWM7D.js.map +1 -0
- package/dist/{chunk-MDDTIZUO.js → chunk-GNHAC43Q.js} +218 -119
- package/dist/chunk-GNHAC43Q.js.map +1 -0
- package/dist/chunk-HHOO7HGH.js +57 -0
- package/dist/chunk-HHOO7HGH.js.map +1 -0
- package/dist/{chunk-WDM5XGGS.js → chunk-HQSQC2XL.js} +182 -12
- package/dist/chunk-HQSQC2XL.js.map +1 -0
- package/dist/chunk-IMYKDWB4.js +139 -0
- package/dist/chunk-IMYKDWB4.js.map +1 -0
- package/dist/{chunk-M62XNWRA.js → chunk-LSTBFLL2.js} +2 -2
- package/dist/{chunk-ACLDOTNQ.js → chunk-O6EJ6WTI.js} +436 -3
- package/dist/chunk-O6EJ6WTI.js.map +1 -0
- package/dist/chunk-PC6ZEDRL.js +71 -0
- package/dist/chunk-PC6ZEDRL.js.map +1 -0
- package/dist/chunk-PM3QYWUU.js +251 -0
- package/dist/chunk-PM3QYWUU.js.map +1 -0
- package/dist/chunk-PVUUIWHY.js +73 -0
- package/dist/chunk-PVUUIWHY.js.map +1 -0
- package/dist/chunk-PXTQPZO4.js +830 -0
- package/dist/chunk-PXTQPZO4.js.map +1 -0
- package/dist/{chunk-ZFKD4QMV.js → chunk-QSOYKKMD.js} +4 -4
- package/dist/chunk-QSOYKKMD.js.map +1 -0
- package/dist/{chunk-MR4424N3.js → chunk-R233SLY3.js} +2 -2
- package/dist/chunk-RC6SU5NO.js +36 -0
- package/dist/chunk-RC6SU5NO.js.map +1 -0
- package/dist/{chunk-USKYUS74.js → chunk-RRNA5GKT.js} +2 -2
- package/dist/{chunk-R36SIKES.js → chunk-RYIL3PI2.js} +2 -2
- package/dist/chunk-STNPB3UM.js +9 -0
- package/dist/chunk-STNPB3UM.js.map +1 -0
- package/dist/{chunk-M5INGEFC.js → chunk-TV3YZ35S.js} +7 -1
- package/dist/chunk-TV3YZ35S.js.map +1 -0
- package/dist/chunk-TY32C732.js +59 -0
- package/dist/chunk-TY32C732.js.map +1 -0
- package/dist/chunk-UMLVJTYV.js +20 -0
- package/dist/chunk-UMLVJTYV.js.map +1 -0
- package/dist/{chunk-NPC4LFV5.js → chunk-WIBHRONM.js} +2 -2
- package/dist/chunk-WIBHRONM.js.map +1 -0
- package/dist/{chunk-RKJ6OL7K.js → chunk-WIRRPTFH.js} +1 -1
- package/dist/chunk-WIRRPTFH.js.map +1 -0
- package/dist/{chunk-VQBTTTUN.js → chunk-Y26YV5R3.js} +4 -4
- package/dist/{chunk-VQBTTTUN.js.map → chunk-Y26YV5R3.js.map} +1 -1
- package/dist/{chunk-NXFEYLVG.js → chunk-YM7LFCG7.js} +5 -4
- package/dist/{chunk-NXFEYLVG.js.map → chunk-YM7LFCG7.js.map} +1 -1
- package/dist/{chunk-CIMZBAZB.js → chunk-Z6FNBOTC.js} +1 -1
- package/dist/chunk-Z6FNBOTC.js.map +1 -0
- package/dist/chunk-ZROPXHJY.js +82 -0
- package/dist/chunk-ZROPXHJY.js.map +1 -0
- package/dist/consent/index.cjs.map +1 -1
- package/dist/consent/index.d.cts +7 -6
- package/dist/consent/index.d.ts +7 -6
- package/dist/consent/index.js +3 -3
- package/dist/{crypto-IVKU7YTT.js → crypto-2CRLG4F4.js} +3 -3
- package/dist/{delegation-2DBS2EOH.js → delegation-ZTRT2PRV.js} +5 -4
- package/dist/derivations/index.cjs +368 -0
- package/dist/derivations/index.cjs.map +1 -0
- package/dist/derivations/index.d.cts +72 -0
- package/dist/derivations/index.d.ts +72 -0
- package/dist/derivations/index.js +27 -0
- package/dist/{dev-unlock-Da1B0TIK.d.cts → dev-unlock-AglVnkPY.d.cts} +1 -1
- package/dist/{dev-unlock-BdPp68qn.d.ts → dev-unlock-BOEYl1xl.d.ts} +1 -1
- package/dist/discriminant-BN9REW3o.d.cts +60 -0
- package/dist/discriminant-BN9REW3o.d.ts +60 -0
- package/dist/executor-S76VN45G.js +8 -0
- package/dist/executor-UCXLIGLW.js +11 -0
- package/dist/executor-UCXLIGLW.js.map +1 -0
- package/dist/executor-ZCNZJMGR.js +8 -0
- package/dist/executor-ZCNZJMGR.js.map +1 -0
- package/dist/fanout-sidecar-OKPMMPLG.js +51 -0
- package/dist/fanout-sidecar-OKPMMPLG.js.map +1 -0
- package/dist/guards/index.cjs +322 -0
- package/dist/guards/index.cjs.map +1 -0
- package/dist/guards/index.d.cts +31 -0
- package/dist/guards/index.d.ts +31 -0
- package/dist/guards/index.js +29 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/{hash-lsoL3eEW.d.ts → hash-B9m3_fhj.d.ts} +1 -1
- package/dist/{hash-BEfzPKwo.d.cts → hash-RVqz2zi8.d.cts} +1 -1
- package/dist/history/index.cjs +9 -2
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.d.cts +8 -7
- package/dist/history/index.d.ts +8 -7
- package/dist/history/index.js +6 -6
- package/dist/i18n/index.cjs +368 -27
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.d.cts +7 -6
- package/dist/i18n/index.d.ts +7 -6
- package/dist/i18n/index.js +34 -6
- package/dist/i18n/index.js.map +1 -1
- package/dist/{index-DJTf9yxn.d.ts → index-B8bjExET.d.cts} +508 -14
- package/dist/{index-6xNpPsxR.d.cts → index-DfUbNad8.d.ts} +508 -14
- package/dist/index.cjs +8779 -1260
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +231 -19
- package/dist/index.d.ts +231 -19
- package/dist/index.js +311 -7370
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.cjs +7 -1
- package/dist/indexing/index.cjs.map +1 -1
- package/dist/indexing/index.d.cts +3 -3
- package/dist/indexing/index.d.ts +3 -3
- package/dist/indexing/index.js +4 -4
- package/dist/issue-3W6IVLKH.js +12 -0
- package/dist/issue-3W6IVLKH.js.map +1 -0
- package/dist/{lazy-builder-BwEoBQZ9.d.ts → lazy-builder-Ci5_YG73.d.cts} +2 -2
- package/dist/{lazy-builder-CZVLKh0Z.d.cts → lazy-builder-D5GU14TS.d.ts} +2 -2
- package/dist/{ledger-QZTTHQAQ.js → ledger-O7FXOG3D.js} +6 -6
- package/dist/ledger-O7FXOG3D.js.map +1 -0
- package/dist/materialized-views/index.cjs +856 -0
- package/dist/materialized-views/index.cjs.map +1 -0
- package/dist/materialized-views/index.d.cts +186 -0
- package/dist/materialized-views/index.d.ts +186 -0
- package/dist/materialized-views/index.js +45 -0
- package/dist/materialized-views/index.js.map +1 -0
- package/dist/noydb-YAZNH5TI.js +34 -0
- package/dist/noydb-YAZNH5TI.js.map +1 -0
- package/dist/overlay-views/index.cjs +369 -0
- package/dist/overlay-views/index.cjs.map +1 -0
- package/dist/overlay-views/index.d.cts +82 -0
- package/dist/overlay-views/index.d.ts +82 -0
- package/dist/overlay-views/index.js +25 -0
- package/dist/overlay-views/index.js.map +1 -0
- package/dist/periods/index.cjs +7 -1
- package/dist/periods/index.cjs.map +1 -1
- package/dist/periods/index.d.cts +7 -6
- package/dist/periods/index.d.ts +7 -6
- package/dist/periods/index.js +6 -6
- package/dist/{predicate-SBHmi6D0.d.cts → predicate-Bt5ft-9c.d.cts} +51 -2
- package/dist/{predicate-SBHmi6D0.d.ts → predicate-Bt5ft-9c.d.ts} +51 -2
- package/dist/{public-envelope-6JTACYJV.js → public-envelope-HMYHZIRH.js} +4 -4
- package/dist/public-envelope-HMYHZIRH.js.map +1 -0
- package/dist/query/index.cjs +555 -128
- package/dist/query/index.cjs.map +1 -1
- package/dist/query/index.d.cts +3 -3
- package/dist/query/index.d.ts +3 -3
- package/dist/query/index.js +32 -11
- package/dist/read-only-facade-ITU6L7BL.js +7 -0
- package/dist/read-only-facade-ITU6L7BL.js.map +1 -0
- package/dist/registry-DKEXOJVO.js +7 -0
- package/dist/registry-DKEXOJVO.js.map +1 -0
- package/dist/registry-ST2VNFZC.js +10 -0
- package/dist/registry-ST2VNFZC.js.map +1 -0
- package/dist/registry-UFIK7CSR.js +8 -0
- package/dist/registry-UFIK7CSR.js.map +1 -0
- package/dist/registry-ZGYYSM5I.js +8 -0
- package/dist/registry-ZGYYSM5I.js.map +1 -0
- package/dist/revoke-S6JMSLUN.js +17 -0
- package/dist/revoke-S6JMSLUN.js.map +1 -0
- package/dist/session/index.cjs +7 -1
- package/dist/session/index.cjs.map +1 -1
- package/dist/session/index.d.cts +8 -7
- package/dist/session/index.d.ts +8 -7
- package/dist/session/index.js +10 -3
- package/dist/session/index.js.map +1 -1
- package/dist/shadow/index.cjs.map +1 -1
- package/dist/shadow/index.d.cts +7 -6
- package/dist/shadow/index.d.ts +7 -6
- package/dist/shadow/index.js +2 -2
- package/dist/signer-7NPTB3SQ.js +18 -0
- package/dist/signer-7NPTB3SQ.js.map +1 -0
- package/dist/snapshots/index.cjs +937 -0
- package/dist/snapshots/index.cjs.map +1 -0
- package/dist/snapshots/index.d.cts +28 -0
- package/dist/snapshots/index.d.ts +28 -0
- package/dist/snapshots/index.js +152 -0
- package/dist/snapshots/index.js.map +1 -0
- package/dist/stale-VKXSXJF4.js +13 -0
- package/dist/stale-VKXSXJF4.js.map +1 -0
- package/dist/store/index.cjs +14 -0
- package/dist/store/index.cjs.map +1 -1
- package/dist/store/index.d.cts +7 -6
- package/dist/store/index.d.ts +7 -6
- package/dist/store/index.js +5 -2
- package/dist/{strategy-D-SrOLCl.d.ts → strategy-CT2LCKAX.d.cts} +84 -19
- package/dist/{strategy-D-SrOLCl.d.cts → strategy-CT2LCKAX.d.ts} +84 -19
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +6 -5
- package/dist/sync/index.d.ts +6 -5
- package/dist/sync/index.js +4 -4
- package/dist/team/index.cjs +1554 -2
- package/dist/team/index.cjs.map +1 -1
- package/dist/team/index.d.cts +7 -6
- package/dist/team/index.d.ts +7 -6
- package/dist/team/index.js +77 -8
- package/dist/tx/index.cjs +375 -43
- package/dist/tx/index.cjs.map +1 -1
- package/dist/tx/index.d.cts +8 -7
- package/dist/tx/index.d.ts +8 -7
- package/dist/tx/index.js +56 -3
- package/dist/tx/index.js.map +1 -1
- package/dist/{types-Bo7NSXJr.d.ts → types-CaNQm4i8.d.ts} +3902 -614
- package/dist/{types-Bnb82f5R.d.cts → types-n2_IfwlQ.d.cts} +3902 -614
- package/dist/{index-CywCC1qZ.d.cts → ulid-B9SMWj5i.d.ts} +216 -27
- package/dist/{index-8QDuznDr.d.ts → ulid-CLMjmyhG.d.cts} +216 -27
- package/dist/util/index.cjs +7 -0
- package/dist/util/index.cjs.map +1 -1
- package/dist/util/index.d.cts +2 -0
- package/dist/util/index.d.ts +2 -0
- package/dist/util/index.js +5 -1
- package/dist/util/index.js.map +1 -1
- package/dist/with-derivation-CVIOPTUf.d.ts +13 -0
- package/dist/with-derivation-aKrtS7Jj.d.cts +13 -0
- package/dist/with-guard-DZQbPzoP.d.cts +18 -0
- package/dist/with-guard-DseETUrF.d.ts +18 -0
- package/dist/with-materialized-view-C1eA1_T_.d.cts +27 -0
- package/dist/with-materialized-view-DaYaE8-Q.d.ts +27 -0
- package/dist/with-overlayed-view-DQsh2p8H.d.ts +13 -0
- package/dist/with-overlayed-view-DleJfKcV.d.cts +13 -0
- package/package.json +77 -3
- package/dist/chunk-2CSJGFCB.js.map +0 -1
- package/dist/chunk-ACLDOTNQ.js.map +0 -1
- package/dist/chunk-BTDCBVJW.js +0 -160
- package/dist/chunk-BTDCBVJW.js.map +0 -1
- package/dist/chunk-CIMZBAZB.js.map +0 -1
- package/dist/chunk-EXHNQEV4.js +0 -392
- package/dist/chunk-EXHNQEV4.js.map +0 -1
- package/dist/chunk-GOUT6DND.js.map +0 -1
- package/dist/chunk-M5INGEFC.js.map +0 -1
- package/dist/chunk-MDDTIZUO.js.map +0 -1
- package/dist/chunk-NPC4LFV5.js.map +0 -1
- package/dist/chunk-QAVUREFT.js.map +0 -1
- package/dist/chunk-RKJ6OL7K.js.map +0 -1
- package/dist/chunk-SCZXXXU4.js.map +0 -1
- package/dist/chunk-TDR6T5CJ.js.map +0 -1
- package/dist/chunk-WDM5XGGS.js.map +0 -1
- package/dist/chunk-ZFKD4QMV.js.map +0 -1
- /package/dist/{chunk-PTVMYYON.js.map → chunk-2N62W5YP.js.map} +0 -0
- /package/dist/{chunk-QGZRWRSL.js.map → chunk-3LPV6BXR.js.map} +0 -0
- /package/dist/{chunk-4PWAI7Q4.js.map → chunk-5OX6XVNS.js.map} +0 -0
- /package/dist/{chunk-AVVPZ4BC.js.map → chunk-DJRWA3Q5.js.map} +0 -0
- /package/dist/{chunk-M62XNWRA.js.map → chunk-LSTBFLL2.js.map} +0 -0
- /package/dist/{chunk-MR4424N3.js.map → chunk-R233SLY3.js.map} +0 -0
- /package/dist/{chunk-USKYUS74.js.map → chunk-RRNA5GKT.js.map} +0 -0
- /package/dist/{chunk-R36SIKES.js.map → chunk-RYIL3PI2.js.map} +0 -0
- /package/dist/{crypto-IVKU7YTT.js.map → crypto-2CRLG4F4.js.map} +0 -0
- /package/dist/{delegation-2DBS2EOH.js.map → delegation-ZTRT2PRV.js.map} +0 -0
- /package/dist/{ledger-QZTTHQAQ.js.map → derivations/index.js.map} +0 -0
- /package/dist/{public-envelope-6JTACYJV.js.map → executor-S76VN45G.js.map} +0 -0
package/dist/aggregate/index.cjs
CHANGED
|
@@ -25,6 +25,7 @@ __export(aggregate_exports, {
|
|
|
25
25
|
GROUPBY_WARN_CARDINALITY: () => GROUPBY_WARN_CARDINALITY,
|
|
26
26
|
GroupedAggregation: () => GroupedAggregation,
|
|
27
27
|
GroupedQuery: () => GroupedQuery,
|
|
28
|
+
GroupedQueryN: () => GroupedQueryN,
|
|
28
29
|
avg: () => avg,
|
|
29
30
|
buildLiveAggregation: () => buildLiveAggregation,
|
|
30
31
|
count: () => count,
|
|
@@ -176,6 +177,18 @@ function readPath(record, path) {
|
|
|
176
177
|
return cursor;
|
|
177
178
|
}
|
|
178
179
|
|
|
180
|
+
// src/aggregate/canonical-key.ts
|
|
181
|
+
function canonicalGroupKey(fields, row) {
|
|
182
|
+
const sorted = [...fields].sort();
|
|
183
|
+
const parts = [];
|
|
184
|
+
for (const name of sorted) {
|
|
185
|
+
const v = row[name];
|
|
186
|
+
const serialised = v === void 0 ? "undefined" : JSON.stringify(v);
|
|
187
|
+
parts.push(`${name}=${serialised}`);
|
|
188
|
+
}
|
|
189
|
+
return parts.join("|");
|
|
190
|
+
}
|
|
191
|
+
|
|
179
192
|
// src/errors.ts
|
|
180
193
|
var NoydbError = class extends Error {
|
|
181
194
|
/** Machine-readable error code. Stable across library versions. */
|
|
@@ -209,27 +222,37 @@ var GroupCardinalityError = class extends NoydbError {
|
|
|
209
222
|
var GROUPBY_WARN_CARDINALITY = 1e4;
|
|
210
223
|
var GROUPBY_MAX_CARDINALITY = 1e5;
|
|
211
224
|
var warnedCardinalityFields = /* @__PURE__ */ new Set();
|
|
212
|
-
function warnCardinalityApproaching(
|
|
213
|
-
|
|
214
|
-
warnedCardinalityFields.
|
|
225
|
+
function warnCardinalityApproaching(fields, observed) {
|
|
226
|
+
const key = JSON.stringify([...fields].sort());
|
|
227
|
+
if (warnedCardinalityFields.has(key)) return;
|
|
228
|
+
warnedCardinalityFields.add(key);
|
|
229
|
+
const label = `[${fields.join(", ")}]`;
|
|
215
230
|
console.warn(
|
|
216
|
-
`[noy-db] .groupBy(
|
|
231
|
+
`[noy-db] .groupBy(${label}) produced ${observed} distinct groups, ${Math.round(observed / GROUPBY_MAX_CARDINALITY * 100)}% of the ${GROUPBY_MAX_CARDINALITY}-group ceiling. Narrow the query with .where() before grouping, or switch to a lower-cardinality field.`
|
|
217
232
|
);
|
|
218
233
|
}
|
|
219
234
|
function resetGroupByWarnings() {
|
|
220
235
|
warnedCardinalityFields.clear();
|
|
221
236
|
}
|
|
222
|
-
var
|
|
223
|
-
constructor(executeRecords,
|
|
237
|
+
var GroupedQueryBase = class {
|
|
238
|
+
constructor(executeRecords, fieldOrFields, upstreams, dictLabelResolver) {
|
|
224
239
|
this.executeRecords = executeRecords;
|
|
225
|
-
this.field = field;
|
|
226
240
|
this.upstreams = upstreams;
|
|
227
241
|
this.dictLabelResolver = dictLabelResolver;
|
|
242
|
+
this.fields = typeof fieldOrFields === "string" ? [fieldOrFields] : [...fieldOrFields];
|
|
228
243
|
}
|
|
229
244
|
executeRecords;
|
|
230
|
-
field;
|
|
231
245
|
upstreams;
|
|
232
246
|
dictLabelResolver;
|
|
247
|
+
/**
|
|
248
|
+
* Field set this grouped query buckets on. Stored in declaration
|
|
249
|
+
* order — the same order is preserved on every result row by
|
|
250
|
+
* `groupAndReduce`. For the single-field constructor, this is
|
|
251
|
+
* `[field]`.
|
|
252
|
+
*/
|
|
253
|
+
fields;
|
|
254
|
+
};
|
|
255
|
+
var GroupedQuery = class extends GroupedQueryBase {
|
|
233
256
|
/**
|
|
234
257
|
* Build a grouped aggregation. Returns a `GroupedAggregation`
|
|
235
258
|
* with `.run()`, `.runAsync()`, and `.live()` terminals — same shape
|
|
@@ -239,70 +262,93 @@ var GroupedQuery = class {
|
|
|
239
262
|
aggregate(spec) {
|
|
240
263
|
return new GroupedAggregation(
|
|
241
264
|
this.executeRecords,
|
|
242
|
-
this.
|
|
265
|
+
this.fields,
|
|
266
|
+
spec,
|
|
267
|
+
this.upstreams,
|
|
268
|
+
this.dictLabelResolver
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
var GroupedQueryN = class extends GroupedQueryBase {
|
|
273
|
+
aggregate(spec) {
|
|
274
|
+
return new GroupedAggregation(
|
|
275
|
+
this.executeRecords,
|
|
276
|
+
this.fields,
|
|
243
277
|
spec,
|
|
244
278
|
this.upstreams,
|
|
245
279
|
this.dictLabelResolver
|
|
246
280
|
);
|
|
247
281
|
}
|
|
248
282
|
};
|
|
249
|
-
function groupAndReduce(records,
|
|
283
|
+
function groupAndReduce(records, fieldOrFields, spec) {
|
|
284
|
+
const fields = typeof fieldOrFields === "string" ? [fieldOrFields] : fieldOrFields;
|
|
285
|
+
if (fields.length === 0) {
|
|
286
|
+
throw new Error(".groupBy() requires at least one field");
|
|
287
|
+
}
|
|
250
288
|
const buckets = /* @__PURE__ */ new Map();
|
|
289
|
+
const fieldLabel = fields.length === 1 ? fields[0] : `[${fields.join(", ")}]`;
|
|
251
290
|
for (const record of records) {
|
|
252
|
-
const
|
|
253
|
-
|
|
291
|
+
const keyValues = {};
|
|
292
|
+
for (const f of fields) {
|
|
293
|
+
keyValues[f] = readPath(record, f);
|
|
294
|
+
}
|
|
295
|
+
const dedupKey = canonicalGroupKey(fields, keyValues);
|
|
296
|
+
let bucket = buckets.get(dedupKey);
|
|
254
297
|
if (bucket === void 0) {
|
|
255
298
|
if (buckets.size >= GROUPBY_MAX_CARDINALITY) {
|
|
256
299
|
throw new GroupCardinalityError(
|
|
257
|
-
|
|
300
|
+
fieldLabel,
|
|
258
301
|
buckets.size + 1,
|
|
259
302
|
GROUPBY_MAX_CARDINALITY
|
|
260
303
|
);
|
|
261
304
|
}
|
|
262
|
-
bucket = [];
|
|
263
|
-
buckets.set(
|
|
305
|
+
bucket = { keyValues, records: [] };
|
|
306
|
+
buckets.set(dedupKey, bucket);
|
|
264
307
|
}
|
|
265
|
-
bucket.push(record);
|
|
308
|
+
bucket.records.push(record);
|
|
266
309
|
}
|
|
267
310
|
if (buckets.size >= GROUPBY_WARN_CARDINALITY) {
|
|
268
|
-
warnCardinalityApproaching(
|
|
311
|
+
warnCardinalityApproaching(fields, buckets.size);
|
|
269
312
|
}
|
|
270
|
-
const
|
|
313
|
+
const reducerKeys = Object.keys(spec);
|
|
271
314
|
const out = [];
|
|
272
|
-
for (const
|
|
315
|
+
for (const bucket of buckets.values()) {
|
|
273
316
|
const state = {};
|
|
274
|
-
for (const
|
|
275
|
-
state[
|
|
317
|
+
for (const rk of reducerKeys) {
|
|
318
|
+
state[rk] = spec[rk].init();
|
|
276
319
|
}
|
|
277
|
-
for (const record of
|
|
278
|
-
for (const
|
|
279
|
-
state[
|
|
320
|
+
for (const record of bucket.records) {
|
|
321
|
+
for (const rk of reducerKeys) {
|
|
322
|
+
state[rk] = spec[rk].step(state[rk], record);
|
|
280
323
|
}
|
|
281
324
|
}
|
|
282
|
-
const row = {
|
|
283
|
-
for (const
|
|
284
|
-
row[
|
|
325
|
+
const row = {};
|
|
326
|
+
for (const f of fields) {
|
|
327
|
+
row[f] = bucket.keyValues[f];
|
|
328
|
+
}
|
|
329
|
+
for (const rk of reducerKeys) {
|
|
330
|
+
row[rk] = spec[rk].finalize(state[rk]);
|
|
285
331
|
}
|
|
286
332
|
out.push(row);
|
|
287
333
|
}
|
|
288
334
|
return out;
|
|
289
335
|
}
|
|
290
336
|
var GroupedAggregation = class {
|
|
291
|
-
constructor(executeRecords,
|
|
337
|
+
constructor(executeRecords, fields, spec, upstreams, dictLabelResolver) {
|
|
292
338
|
this.executeRecords = executeRecords;
|
|
293
|
-
this.field = field;
|
|
294
339
|
this.spec = spec;
|
|
295
340
|
this.upstreams = upstreams;
|
|
296
341
|
this.dictLabelResolver = dictLabelResolver;
|
|
342
|
+
this.fields = typeof fields === "string" ? [fields] : [...fields];
|
|
297
343
|
}
|
|
298
344
|
executeRecords;
|
|
299
|
-
field;
|
|
300
345
|
spec;
|
|
301
346
|
upstreams;
|
|
302
347
|
dictLabelResolver;
|
|
348
|
+
fields;
|
|
303
349
|
/** Execute the query, group, reduce, and return an array of rows. */
|
|
304
350
|
run() {
|
|
305
|
-
return groupAndReduce(this.executeRecords(), this.
|
|
351
|
+
return groupAndReduce(this.executeRecords(), this.fields, this.spec);
|
|
306
352
|
}
|
|
307
353
|
/**
|
|
308
354
|
* Execute the query, group, reduce, and resolve `<field>Label` for
|
|
@@ -312,17 +358,22 @@ var GroupedAggregation = class {
|
|
|
312
358
|
*
|
|
313
359
|
* The `<field>Label` field is appended to each row. Rows whose group
|
|
314
360
|
* key has no dictionary entry get `<field>Label: undefined`.
|
|
361
|
+
*
|
|
362
|
+
* Dict-label resolution is single-field only — multi-key groupings
|
|
363
|
+
* do not produce a `<field>Label`. The resolver is only attached
|
|
364
|
+
* by the builder when `fields.length === 1`.
|
|
315
365
|
*/
|
|
316
366
|
async runAsync(opts) {
|
|
317
|
-
const rows = groupAndReduce(this.executeRecords(), this.
|
|
318
|
-
if (!opts?.locale || !this.dictLabelResolver) return rows;
|
|
367
|
+
const rows = groupAndReduce(this.executeRecords(), this.fields, this.spec);
|
|
368
|
+
if (!opts?.locale || !this.dictLabelResolver || this.fields.length !== 1) return rows;
|
|
319
369
|
const resolve = this.dictLabelResolver;
|
|
320
370
|
const locale = opts.locale;
|
|
321
371
|
const fallback = opts.fallback;
|
|
322
|
-
const
|
|
372
|
+
const field = this.fields[0];
|
|
373
|
+
const labelKey = `${field}Label`;
|
|
323
374
|
return Promise.all(
|
|
324
375
|
rows.map(async (row) => {
|
|
325
|
-
const key = row[
|
|
376
|
+
const key = row[field];
|
|
326
377
|
if (typeof key !== "string") return row;
|
|
327
378
|
const label = await resolve(key, locale, fallback);
|
|
328
379
|
return { ...row, [labelKey]: label };
|
|
@@ -346,7 +397,7 @@ var GroupedAggregation = class {
|
|
|
346
397
|
* Always call `live.stop()` when finished.
|
|
347
398
|
*/
|
|
348
399
|
live() {
|
|
349
|
-
const recompute = () => groupAndReduce(this.executeRecords(), this.
|
|
400
|
+
const recompute = () => groupAndReduce(this.executeRecords(), this.fields, this.spec);
|
|
350
401
|
return buildLiveAggregation(recompute, this.upstreams);
|
|
351
402
|
}
|
|
352
403
|
};
|
|
@@ -360,6 +411,9 @@ function withAggregate() {
|
|
|
360
411
|
groupBy(executeRecords, field, upstreams, dictLabelResolver) {
|
|
361
412
|
return new GroupedQuery(executeRecords, field, upstreams, dictLabelResolver);
|
|
362
413
|
},
|
|
414
|
+
groupByN(executeRecords, fields, upstreams) {
|
|
415
|
+
return new GroupedQueryN(executeRecords, fields, upstreams);
|
|
416
|
+
},
|
|
363
417
|
async scanAggregate(iter, spec) {
|
|
364
418
|
const collected = [];
|
|
365
419
|
for await (const record of iter) collected.push(record);
|
|
@@ -373,6 +427,7 @@ function count(opts) {
|
|
|
373
427
|
const _seed = opts?.seed;
|
|
374
428
|
void _seed;
|
|
375
429
|
return {
|
|
430
|
+
op: "count",
|
|
376
431
|
init: () => 0,
|
|
377
432
|
step: (state) => state + 1,
|
|
378
433
|
remove: (state) => state - 1,
|
|
@@ -383,6 +438,8 @@ function sum(field, opts) {
|
|
|
383
438
|
const _seed = opts?.seed;
|
|
384
439
|
void _seed;
|
|
385
440
|
return {
|
|
441
|
+
op: "sum",
|
|
442
|
+
field,
|
|
386
443
|
init: () => 0,
|
|
387
444
|
step: (state, record) => state + readNumber(record, field),
|
|
388
445
|
remove: (state, record) => state - readNumber(record, field),
|
|
@@ -393,6 +450,8 @@ function avg(field, opts) {
|
|
|
393
450
|
const _seed = opts?.seed;
|
|
394
451
|
void _seed;
|
|
395
452
|
return {
|
|
453
|
+
op: "avg",
|
|
454
|
+
field,
|
|
396
455
|
init: () => ({ sum: 0, count: 0 }),
|
|
397
456
|
step: (state, record) => ({
|
|
398
457
|
sum: state.sum + readNumber(record, field),
|
|
@@ -419,6 +478,8 @@ function min(field, opts) {
|
|
|
419
478
|
const _seed = opts?.seed;
|
|
420
479
|
void _seed;
|
|
421
480
|
return {
|
|
481
|
+
op: "min",
|
|
482
|
+
field,
|
|
422
483
|
init: () => ({ values: [] }),
|
|
423
484
|
step: (state, record) => pushValue(state, readNumber(record, field)),
|
|
424
485
|
remove: (state, record) => removeValue(state, readNumber(record, field)),
|
|
@@ -437,6 +498,8 @@ function max(field, opts) {
|
|
|
437
498
|
const _seed = opts?.seed;
|
|
438
499
|
void _seed;
|
|
439
500
|
return {
|
|
501
|
+
op: "max",
|
|
502
|
+
field,
|
|
440
503
|
init: () => ({ values: [] }),
|
|
441
504
|
step: (state, record) => pushValue(state, readNumber(record, field)),
|
|
442
505
|
remove: (state, record) => removeValue(state, readNumber(record, field)),
|
|
@@ -462,6 +525,7 @@ function readNumber(record, field) {
|
|
|
462
525
|
GROUPBY_WARN_CARDINALITY,
|
|
463
526
|
GroupedAggregation,
|
|
464
527
|
GroupedQuery,
|
|
528
|
+
GroupedQueryN,
|
|
465
529
|
avg,
|
|
466
530
|
buildLiveAggregation,
|
|
467
531
|
count,
|