Skip to content

objectui: DatasetReportRenderer 的 pivot bucket id 用空串 join 维度值、cell key 用空格拼接 —— 与 #5473 同族,且更早合并 #5665

Description

@yinlianghui

实现 objectstack#5473(objectui PR #3414,修 plugin-dashboard/DatasetWidget.tsx 的 cell key)时,按「规则消费半径」清扫同名 testid 的其它渲染器发现的。属另一个 widget、另一个包,#5473 的文件面不含它,按 Prime Directive #10 单独开单。

位置

packages/plugin-report/src/DatasetReportRenderer.tsx(objectui 仓):

// 742
function bucketId(dims: string[], row: Row): string {
  return dims.map((d) => String(row[d] ?? EMPTY)).join('');   // 空串
}

// 818(pivot useMemo 内)
const rid = bucketId(rows, r);
const cid = bucketId(columnsAcross, r);
cells.set(`${rid} ${cid}`, { row: r, index });                  // 空格

已核对字节:742 行的 join('')真空串,不是被显示吞掉的控制字符(cat -A 确认,该文件全文无 [\x00-\x08\x0b\x0c\x0e-\x1f])。

两个缺陷

  1. 多维度 bucket 之间完全没有边界bucketId(['region','segment'], …)x + yzxy + z 都产出 xyz —— 两个不同的行(或列)桶合并成一个,后写覆盖先写。这比 objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 修掉的那个更早触发:objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 里 row id 至少还有一个分隔字符,这里一个都没有。DatasetWidget 的旧用例注释里写的「an empty (or absent) separator collapses these into ONE row header」正是这里的现状。
  2. cell key 用普通空格拼接 rid/cid —— 与 objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 完全同形:维度值含空格(New York / In Progress / Closed Won)时,两行可落进同一个 key。

cells 的 value 同时带 index,而 drill-through 用它读原始行,所以和 #5473 一样,串格的同时会钻到另一行的记录。全程无报错。

为什么现有用例照不到

packages/plugin-report/src/__tests__/DatasetReportRenderer.test.tsx 的 pivot fixture 与 dashboard 侧同病:行/列维度各只有一个,值也不含空格。单维度时 join('') 与任何分隔符恰好等价,所以缺陷 1 从未被跑到;缺陷 2 需要值含空格,也从未被跑到。

建议方向

#5473 / PR objectui#3414 同形:bucket id 与 cell key 都走 JSON.stringify(该 PR 里落成 pivotRowId / pivotCellKey 两个 helper),不再依赖「数据不会包含的字符」。注意这里 bucketId 同时被 rowTotalById(863 行)使用 —— 与 dashboard 侧不同,它三处用的是同一个 encoder,所以换编码时必须整体换,否则会把 dashboard 侧刚修掉的「表头与小计各用一套编码」的问题引进来。用例同步扩到多维度 + 含空格的值。

两处是否合并成一个共享 helper(pivot 编码只此一家),请 triage 时一并裁定 —— 两个包各写一份是这次两边同时出问题的根因。

发现来源:objectstack#5473 / PR objectui#3414。严重度按贵重口径判,我按发现原样记。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions