This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new cec033e59c6 fix(table): pick totals query positionally so all_records
percent metrics don't shift it (#42428)
cec033e59c6 is described below
commit cec033e59c6b269888c101938473a038ab85a51c
Author: Evan Rusackas <[email protected]>
AuthorDate: Wed Jul 29 15:47:57 2026 -0700
fix(table): pick totals query positionally so all_records percent metrics
don't shift it (#42428)
Co-authored-by: Claude Opus 4.8 <[email protected]>
---
.../plugin-chart-table/src/transformProps.ts | 19 +++++++-
.../plugin-chart-table/test/TableChart.test.tsx | 55 ++++++++++++++++++++++
2 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
index ee3ee09bab7..e8a15d4a67d 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
@@ -712,12 +712,27 @@ const transformProps = (
let totalQuery;
let rowCount;
if (serverPagination) {
- [baseQuery, countQuery, totalQuery] = queriesData;
+ [baseQuery, countQuery] = queriesData;
rowCount = (countQuery?.data?.[0]?.rowcount as number) ?? 0;
} else {
- [baseQuery, totalQuery] = queriesData;
+ [baseQuery] = queriesData;
rowCount = baseQuery?.rowcount ?? 0;
}
+ // `buildQuery` may prepend an extra query (used to compute percent metrics
+ // against the entire result set when `percent_metric_calculation` is set to
+ // `all_records`) before the totals query. Since the totals query, when
+ // present, is always the last entry in `queriesData`, look it up
positionally
+ // from the end rather than assuming a fixed index. The minimum number of
+ // queries expected without a totals query is 1 (base query), or 2 when
+ // server pagination is enabled (base query + row count query).
+ const minQueriesWithoutTotals = serverPagination ? 2 : 1;
+ if (
+ showTotals &&
+ queryMode === QueryMode.Aggregate &&
+ queriesData.length > minQueriesWithoutTotals
+ ) {
+ totalQuery = queriesData[queriesData.length - 1];
+ }
const data = processDataRecords(baseQuery?.data, columns);
const comparisonData = processComparisonDataRecords(
baseQuery?.data,
diff --git
a/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
b/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
index 9a00bcb72b2..80441dab9c4 100644
--- a/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
@@ -2580,6 +2580,61 @@ describe('plugin-chart-table', () => {
);
expect(screen.queryByText('Search by')).toBeInTheDocument();
});
+
+ test(
+ 'should read the totals row from the correct query when percent metrics ' +
+ 'use the "all records" calculation mode',
+ () => {
+ // When `percent_metric_calculation` is `all_records`, buildQuery adds an
+ // extra query (used to compute percentages against the entire result
set)
+ // *before* the totals query in `queriesData`. Verify totals are still
+ // sourced from the actual totals query and not this preceding query.
+ const props = {
+ ...testData.basic,
+ rawFormData: {
+ ...testData.basic.rawFormData,
+ query_mode: QueryMode.Aggregate,
+ metrics: ['sum__num'],
+ percent_metrics: ['count'],
+ percent_metric_calculation: 'all_records',
+ show_totals: true,
+ column_config: {
+ sum__num: { d3NumberFormat: '.0%' },
+ },
+ },
+ queriesData: [
+ {
+ ...testData.basic.queriesData[0],
+ colnames: ['name', 'sum__num', '%count'],
+ coltypes: [
+ GenericDataType.String,
+ GenericDataType.Numeric,
+ GenericDataType.Numeric,
+ ],
+ data: [{ name: 'Michael', sum__num: 0.1, '%count': 0.05 }],
+ },
+ // extra "all records" query used only to compute percent metrics
+ {
+ ...testData.basic.queriesData[0],
+ colnames: ['count'],
+ coltypes: [GenericDataType.Numeric],
+ data: [{ count: 999 }],
+ },
+ // actual totals query
+ {
+ ...testData.basic.queriesData[0],
+ colnames: ['sum__num'],
+ coltypes: [GenericDataType.Numeric],
+ data: [{ sum__num: 0.27 }],
+ },
+ ],
+ };
+
+ const transformedProps = transformProps(props);
+
+ expect(transformedProps.totals).toEqual({ sum__num: 0.27 });
+ },
+ );
});
/**