fparodimoraes opened a new issue, #43728:
URL: https://github.com/apache/superset/issues/43728

   ### Bug description
   
   PR #32290 (fix for #32042) changed `PartitionViz.nest_values` 
(`superset/viz.py`) to return `name` as an **array of the full ancestor path** 
for any node at depth ≥ 2 (e.g. `["category_val", "subcategory_val", 
"sub_subcategory_val"]`), instead of a plain string leaf label:
   
   ```python
   return [
       {
           "name": [*dims, i],   # was previously just `i`
           "val": dim_level[i],
           "children": self.nest_values(levels, level + 1, metric, dims + [i]),
       }
       for i in ...
   ]
   ```
   
   That change was necessary and correct on the backend side, but the frontend 
renderer, 
`superset-frontend/plugins/legacy-plugin-chart-partition/src/Partition.ts`, was 
never updated to match. It still treats `node.name` as a plain string 
everywhere it's consumed:
   
   ```ts
   n.name = n.data.name;          // now sometimes an array
   ...
   root.sort((a, b) => {
     ...
     return b.name > a.name ? 1 : -1;   // array > array does string coercion
   });
   ...
   `<td>${n.name}</td>`           // tooltip cell — array gets 
Array.prototype.toString()'d
   ...
   .text(d => d.disp ? `${d.name}: ${d.disp}` : d.name)   // on-chart segment 
label
   ...
   d.color = colorFn(d.name, sliceId);   // categorical color key
   ```
   
   Since JS silently stringifies an array via `Array.prototype.toString()` 
(comma-joined) wherever it's interpolated into a template literal, every node 
at depth ≥ 2 renders its **entire ancestor chain** instead of just its own 
value.
   
   ### How to reproduce the bug
   
   Minimal SQL reproduction (works against any engine — pure literals, no real 
table needed). Register this as a virtual dataset (SQL Lab -> "Save as 
dataset"), then build a Partition Chart on it with metric `SUM(val)` and Levels 
= `category`, `subcategory`, `sub_subcategory`:
   
   ```sql
   SELECT 'B' AS category, 'B1' AS subcategory, NULL AS sub_subcategory, 2 AS 
val
   UNION ALL
   SELECT 'A' AS category, 'A1' AS subcategory, 'A1a' AS sub_subcategory, 1 AS 
val
   UNION ALL
   SELECT 'A' AS category, 'A1' AS subcategory, 'A1b' AS sub_subcategory, 1 AS 
val
   ```
   
   Look at the 3rd-level segments (children of `A1`).
   
   Screenshot from a real Superset instance (6.1.0), built from the exact SQL 
above — note the positioning here is correct (this instance already has a 
separate, unrelated layout bug patched, filed as #43727), but the labels read 
the full ancestor path:
   
   **[screenshot: before, attached below]**
   
   After applying the suggested fix below, the same chart, same data:
   
   **[screenshot: after, attached below]**
   
   ### Expected results
   
   A segment for `sub_subcategory = "A1a"` (under `category = "A"`, 
`subcategory = "A1"`) should be labeled `A1a`.
   
   ### Actual results
   
   The segment is labeled `A,A1,A1a` — the full comma-joined ancestor path. 
With more dimensions this gets long, repetitive, and at a glance looks like 
categories are duplicated or misattributed (it's easy to mistake this for the 
chart mis-nesting categories, since parent names appear to "leak" into every 
descendant's own label).
   
   It also affects sibling sort order (comparing joined-path strings instead of 
each node's own value) and the color key (nodes are now colored by their full 
path rather than their own value, an unintended side effect of the same 
regression).
   
   ### Root cause
   
   `PartitionDataNode.name` is typed as `string` in `Partition.ts`, but the 
backend contract changed to sometimes send `string[]`. No consumer of 
`node.name` in this file was updated to handle both shapes.
   
   ### Suggested fix
   
   Normalize `name` to its own leaf value immediately after it's read from 
`data`, before the sort/tooltip/label/color code runs — a single-point fix that 
corrects all four consumers at once:
   
   ```ts
   root.eachAfter(n => {
     n.disp = n.data.val;
     n.value = n.disp < 0 ? -n.disp : n.disp;
     n.weight = n.value;
     n.name = n.data.name;
     // ... existing date-node handling, unchanged ...
   });
   root.each(n => {
     if (Array.isArray(n.name)) n.name = n.name[n.name.length - 1];
   });
   root.sort((a, b) => { /* unchanged, now compares plain strings again */ });
   ```
   
   We verified this normalization against a real 12,907-node production tree: 
zero arrays remained after the fix, and every node's displayed name matched the 
correct leaf value from the original backend payload.
   
   We already have this patched locally (build-time transform on the compiled 
bundle) and are happy to turn it into a proper PR against `Partition.ts` if 
useful.
   
   ### Superset version
   
   6.1.0 (present in any version that includes PR #32290, i.e. 5.0.0+)
   
   ### Python version
   
   3.12
   
   ### Node version
   
   Not applicable (frontend-only bug)
   
   ### Browser
   
   Chrome
   
   ### Additional context
   
   Related: #32042 / PR #32290, which introduced this regression as a side 
effect of an otherwise-correct backend fix. Separately, we also found and 
reported an unrelated, pre-existing layout/positioning bug in the same chart 
(#43727) that produces a superficially similar "categories look mixed up" 
symptom — worth checking both if you're touching this component.
   
   ### Checklist
   
   - [x] I have searched Superset docs and Slack and didn't find a solution to 
my problem.
   - [x] I have searched the GitHub issue tracker and didn't find a similar bug 
report.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to