@objectstack/service-analytics 9.1.0 → 9.3.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/dist/index.cjs CHANGED
@@ -1025,6 +1025,33 @@ var DatasetExecutor = class {
1025
1025
  * applied per request (ADR-0021 D-C).
1026
1026
  */
1027
1027
  async execute(compiled, selection, context) {
1028
+ const result = await this.executeSelection(compiled, selection, context);
1029
+ const groupings = selection.totals?.groupings;
1030
+ if (groupings?.length) {
1031
+ const selected = new Set(selection.dimensions ?? []);
1032
+ const totals = [];
1033
+ for (const grouping of groupings) {
1034
+ const unknown = grouping.filter((d) => !selected.has(d));
1035
+ if (unknown.length) {
1036
+ throw new Error(
1037
+ `[dataset-executor] totals grouping [${grouping.join(", ")}] is not a subset of the selected dimensions \u2014 unknown: ${unknown.join(", ")}.`
1038
+ );
1039
+ }
1040
+ const sub = await this.executeSelection(compiled, {
1041
+ ...selection,
1042
+ dimensions: grouping,
1043
+ totals: void 0,
1044
+ order: void 0,
1045
+ limit: void 0,
1046
+ offset: void 0
1047
+ }, context);
1048
+ totals.push({ dimensions: grouping, rows: sub.rows });
1049
+ }
1050
+ result.totals = totals;
1051
+ }
1052
+ return result;
1053
+ }
1054
+ async executeSelection(compiled, selection, context) {
1028
1055
  const derivedByName = new Map(compiled.derived.map((d) => [d.name, d]));
1029
1056
  const selectedDerived = selection.measures.map((m) => derivedByName.get(m)).filter((d) => !!d);
1030
1057
  const baseMeasures = /* @__PURE__ */ new Set();
@@ -1573,6 +1600,12 @@ var AnalyticsService = class {
1573
1600
  if (dims.length) {
1574
1601
  try {
1575
1602
  await resolveDimensionLabels(dataset.object, dims, result.rows, this.labelResolver);
1603
+ for (const total of result.totals ?? []) {
1604
+ const subset = dims.filter((d) => total.dimensions.includes(d.name));
1605
+ if (subset.length) {
1606
+ await resolveDimensionLabels(dataset.object, subset, total.rows, this.labelResolver);
1607
+ }
1608
+ }
1576
1609
  } catch (e) {
1577
1610
  this.logger?.warn?.(`[Analytics] dimension label resolution failed for "${dataset.name}": ${String(e?.message ?? e)}`);
1578
1611
  }