From e87652060ce6764b17b46c6ad0dbbea2fbe8b42e Mon Sep 17 00:00:00 2001 From: Kristina Date: Mon, 25 Aug 2025 19:14:04 -0500 Subject: [PATCH] Transformations: Handle special case with nested dataframes/JSON (#109876) * Fix crashes * Remove inline snapshot --- .../groupingToMatrix.test.ts.snap | 33 +++++++++++++++++++ .../transformers/groupingToMatrix.test.ts | 27 +++++++++++++++ .../transformers/groupingToMatrix.ts | 7 ++-- .../components/Table/Cells/JSONViewCell.tsx | 7 +++- 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 packages/grafana-data/src/transformations/transformers/__snapshots__/groupingToMatrix.test.ts.snap diff --git a/packages/grafana-data/src/transformations/transformers/__snapshots__/groupingToMatrix.test.ts.snap b/packages/grafana-data/src/transformations/transformers/__snapshots__/groupingToMatrix.test.ts.snap new file mode 100644 index 00000000000..97177391a02 --- /dev/null +++ b/packages/grafana-data/src/transformations/transformers/__snapshots__/groupingToMatrix.test.ts.snap @@ -0,0 +1,33 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Grouping to Matrix generates Matrix ignoring special value when value type is frame 1`] = ` +[ + { + "config": {}, + "name": "Row\\Column", + "type": "string", + "values": [ + "R1", + "R2", + ], + }, + { + "config": {}, + "name": "C1", + "type": "frame", + "values": [ + {}, + undefined, + ], + }, + { + "config": {}, + "name": "C2", + "type": "frame", + "values": [ + {}, + undefined, + ], + }, +] +`; diff --git a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts index 9b3956a12f2..6b5ab80911f 100644 --- a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts +++ b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts @@ -333,4 +333,31 @@ describe('Grouping to Matrix', () => { `); }); }); + + it('generates Matrix ignoring special value when value type is frame', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.groupingToMatrix, + options: { + columnField: 'Column', + rowField: 'Row', + valueField: 'Temp', + emptyValue: SpecialValue.Zero, + }, + }; + + const seriesA = toDataFrame({ + name: 'C', + fields: [ + { name: 'Column', type: FieldType.string, values: ['C1', 'C1', 'C2'] }, + { name: 'Row', type: FieldType.string, values: ['R1', 'R2', 'R1'] }, + { name: 'Temp', type: FieldType.frame, values: [{}, null, {}] }, + ], + }); + + await expect(transformDataFrame([cfg], [seriesA])).toEmitValuesWith((received) => { + const processed = received[0]; + + expect(processed[0].fields).toMatchSnapshot(); + }); + }); }); diff --git a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts index 39614c52042..4e388bf3257 100644 --- a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts +++ b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts @@ -1,7 +1,7 @@ import { map } from 'rxjs/operators'; import { getFieldDisplayName } from '../../field/fieldState'; -import { DataFrame, Field } from '../../types/dataFrame'; +import { DataFrame, Field, FieldType } from '../../types/dataFrame'; import { SpecialValue, DataTransformerInfo, @@ -114,7 +114,10 @@ export const groupingToMatrixTransformer: DataTransformerInfo