Skip to content

fix(pivot-table): exclude rollup totals from conditional formatting scale - #43308

Closed
aminghadersohi wants to merge 6 commits into
apache:masterfrom
aminghadersohi:aminghadersohi/pivot-table-conditional-formatting-totals
Closed

fix(pivot-table): exclude rollup totals from conditional formatting scale#43308
aminghadersohi wants to merge 6 commits into
apache:masterfrom
aminghadersohi:aminghadersohi/pivot-table-conditional-formatting-totals

Conversation

@aminghadersohi

@aminghadersohi aminghadersohi commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

SUMMARY

Pivot table conditional formatting produced washed-out cells once Show rows total / Show column total were enabled.

transformProps built the color scale from mainQuery.data, i.e. the raw chart-data response. Since #41184 (SIP-216), a chart with a non-additive metric (a saved-metric reference, AVG, COUNT_DISTINCT, or any SQL/adhoc metric — see isAdditiveMetric) issues one GROUPING SETS query whose result carries every rollup level alongside the leaf rows. Turning on a totals toggle adds the corresponding collapsed level to grouping_sets, so the subtotals and the grand total end up in that response — and therefore in the color domain.

Those aggregates are sums of the very cells being shaded, so they dominate Math.max(...allValues) and compress every real cell toward transparent. With the four-cell example in the new test (leaf max 40, grand total 100), the largest detail cell rendered at alpha 0x6E (~43%) instead of fully saturated. Disabling the totals was the only workaround, which matches the reported behaviour: the totals levels are simply not queried in that case.

The fix threads a single colorScaleRows variable out of the two branches that already split the response, so the domain spans only the leaf (detail) cells:

  • non-additive — take the leaf level out of the split GROUPING SETS result, identified as the level that groups every dimension (the same definition splitGroupingSetsResult itself uses).
  • additive — keep using the raw leaf query rows. That query returns leaf rows only, so no totals can leak in, and this path is therefore completely unchanged.

Totals cells themselves are unaffected — the renderer never colors them (TableRenderers.tsx deliberately omits getCellColor on pvtTotal).

Known limitation / scope: this corrects the domain only. It does not start coloring the totals cells; they are intentionally uncolored today and changing that is a separate design question.

BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF

No screenshots. I don't have a running instance with the sample dataset in this environment, so rather than post a mock-up I captured the regression as an exact color assertion instead — the observable symptom is the alpha channel of the cell background:

largest detail cell (leaf max 40, grand total 100)
Before #ACE1C46E — ~43% opacity, visibly unshaded
After #ACE1C4FF — fully saturated

TESTING INSTRUCTIONS

Two tests in superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts:

  • conditional formatting scales over leaf cells only, not rollup totals — feeds a realistic GROUPING SETS response (leaf cells + row totals + column totals + grand total, with __superset_grouping markers) and asserts the largest leaf cell is fully saturated. Fails on master with #ACE1C46E, passes with this change.
  • conditional formatting on the additive path uses the raw leaf query rows — the additive counterpart, pinning that domain to the leaf max. Passes both before and after, documenting that the additive path is untouched.
npx jest plugins/plugin-chart-pivot-table
# 9 suites, 109 tests passed

Manual:

  1. Pivot table on a dataset with a non-additive metric — a saved metric, or AVG(...)/COUNT_DISTINCT(...).
  2. Put a dimension on rows and another on columns.
  3. Enable Show rows total and Show column total.
  4. Add conditional formatting metric > 0 with a color and gradient enabled.
  5. Before: cells are barely tinted, and get fainter the more totals are shown. After: the gradient spans the detail cells, with the largest one fully saturated.

Review guidance

One hunk in superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts; read it first, then the tests.

Both review points from the first round are addressed:

  • Additive path semantics (@CodeAnt-AI) — the original patch selected the leaf frame out of the already-split data, which on the additive path meant the synthesized leaf level. synthesizeAdditiveLevels coerces through Number and drops non-numeric values, so that could shift the domain for additive metrics, contradicting my claim that the path was unchanged. It now uses the raw leaf query rows on that branch, so the claim holds by construction rather than by argument. Good catch.
  • Misleading test comment (@Copilot) — reworded to state explicitly that isAdditiveMetric treats any string metric as a non-additive saved-metric reference regardless of its label, which is exactly why a saved metric named SUM(sales) takes this path.

The ?? [] on the non-additive branch only covers a findIndex miss, which buildGroupbyCombinations makes unreachable — the full-length prefix on both axes is always emitted and the combineMetric filters keep it.

Risk & rollback

Frontend-only, no feature flag, no migration. Blast radius is the pivot table's conditional formatting color domain. The only behavioural change is for non-additive metrics with totals enabled, where the current output is wrong. Additive metrics are unchanged. Revert the commits to roll back.

ADDITIONAL INFORMATION

  • Has associated issue:
  • Required feature flags:
  • Changes UI
  • Includes DB Migration (follow approval process in SIP-59)
    • Migration is atomic, supports rollback & is backwards-compatible
    • Confirm DB migration upgrade and downgrade tested
    • Runtime estimates and downtime expectations provided
  • Introduces new feature or API
  • Removes existing feature or API

…cale

The conditional-formatting color scale was derived from the raw query
result. For non-additive metrics that result is a single GROUPING SETS
response carrying the rollup levels alongside the leaf rows, so enabling
"Show rows total"/"Show column total" pulled the subtotals and grand
total into the color domain. Those aggregates dominate the max, leaving
every detail cell nearly unshaded.

Derive the scale from the leaf level instead, so it spans only the cells
being shaded. Additive metrics are unaffected: their query already
returns leaf rows only.
@codecov

codecov Bot commented Aug 18, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.73%. Comparing base (148ffaf) to head (e4e8846).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master   #43308      +/-   ##
==========================================
+ Coverage   66.15%   66.73%   +0.58%     
==========================================
  Files        2876     2876              
  Lines      164228   164194      -34     
  Branches    37891    37887       -4     
==========================================
+ Hits       108640   109578     +938     
+ Misses      53427    52460     -967     
+ Partials     2161     2156       -5     
Flag Coverage Δ
javascript 74.03% <100.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@aminghadersohi
aminghadersohi marked this pull request as ready for review August 19, 2026 03:39
@aminghadersohi
aminghadersohi requested a lite review from Copilot August 19, 2026 03:39
@dosubot dosubot Bot added the viz:charts:pivot Related to the Pivot Table charts label Aug 19, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes Pivot Table conditional formatting gradients becoming washed out when row/column totals are enabled for non-additive metrics (where the backend returns leaf rows plus rollup totals in a single GROUPING SETS result). The color domain is now derived from the leaf-level frame in transformProps, ensuring the scale reflects only detail cells (the ones actually shaded).

Changes:

  • Compute conditional formatting color scales from the leaf-level QueryData frame (highest groupby dimensionality), instead of mainQuery.data which may include rollup totals.
  • Add a regression test that simulates a GROUPING SETS response containing leaf cells + row/column totals + grand total and asserts the leaf max is fully saturated.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts Build conditional-formatting color domain from leaf-level split/synthesized data to exclude rollup totals.
superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts Add regression test ensuring conditional formatting scales over leaf cells only (not totals in the query response).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@bito-code-review

Copy link
Copy Markdown
Contributor

The suggestion to reword the comment or use a generic metric name like 'm' is appropriate. Using 'SUM(sales)' in the test code can indeed be misleading, as it implies an additive metric, whereas the test is specifically validating behavior for non-additive metrics (where the rollup levels are included in the query result). Updating the test to use a more generic identifier would better align the test code with the intent of the comment and the behavior being verified.

superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts

// A saved-metric reference is non-additive, so buildQuery issues a single
  // GROUPING SETS query whose result carries the rollup levels alongside the
  // leaf rows. Both totals toggles are on, so the grand total (100) is part of
  // that result.

@aminghadersohi
aminghadersohi requested review from kgabryje and removed request for michael-s-molina August 19, 2026 03:43
@bito-code-review

bito-code-review Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Review Agent Run #9367ef

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: 69b45e7..ad8f74e
    • superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts
    • superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers a full AI review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

Address review feedback:

- The additive fast path now feeds conditional formatting the raw leaf
  query rows again instead of the synthesized leaf level. The synthesis
  coerces values through Number and drops non-numeric ones, so routing
  the additive path through it could shift the color domain -- the
  additive path is now provably untouched, matching the claim made for
  it. Its query returns leaf rows only, so no totals can leak in.
- Select the non-additive leaf level by the level that groups every
  dimension (the splitter's own definition) rather than by counting
  dimensions.
- Clarify in the regression test that a string metric is a saved-metric
  reference treated as non-additive whatever its label, so "SUM(sales)"
  is not mistaken for an additive adhoc metric.
- Add the additive counterpart test pinning its domain to the leaf max.
@pull-request-size pull-request-size Bot added size/L and removed size/M labels Aug 19, 2026
@bito-code-review

bito-code-review Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Review Agent Run #ab5661

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: ad8f74e..0089b20
    • superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts
    • superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers a full AI review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@aminghadersohi
aminghadersohi requested review from gabotorresruiz and rusackas and removed request for kgabryje and rusackas August 20, 2026 18:35
@aminghadersohi aminghadersohi closed this by deleting the head repository Aug 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

plugins size/L viz:charts:pivot Related to the Pivot Table charts

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants