From 3647392b408aaedddc5b1a04a190583ccdf67ddc Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 31 May 2023 07:46:39 -0700 Subject: [PATCH] JoinDataFrames: Keep field name if possible (#69289) --- .../transformers/joinDataFrames.test.ts | 69 ++++++++++++++++++- .../transformers/joinDataFrames.ts | 10 ++- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/packages/grafana-data/src/transformations/transformers/joinDataFrames.test.ts b/packages/grafana-data/src/transformations/transformers/joinDataFrames.test.ts index 6f353f356dd..70dddf23aaa 100644 --- a/packages/grafana-data/src/transformations/transformers/joinDataFrames.test.ts +++ b/packages/grafana-data/src/transformations/transformers/joinDataFrames.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType } from '../../types/dataFrame'; +import { getFieldDisplayName } from '../../field'; +import { DataFrame, FieldType } from '../../types/dataFrame'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { calculateFieldTransformer } from './calculateField'; @@ -266,6 +267,64 @@ describe('align frames', () => { `); }); + it('maintains naming convention after join', () => { + const series1 = toDataFrame({ + name: 'Muta', + fields: [ + { name: 'Time', type: FieldType.time, values: [1000, 2000] }, + { name: 'Value', type: FieldType.number, values: [1, 100] }, + ], + }); + expect(getFieldDisplayNames([series1])).toMatchInlineSnapshot(` + [ + "Time", + "Muta", + ] + `); + expect(getFieldNames([series1])).toMatchInlineSnapshot(` + [ + "Time", + "Value", + ] + `); + + const series2 = toDataFrame({ + name: 'Muta', + fields: [ + { name: 'Time', type: FieldType.time, values: [1000] }, + { name: 'Value', type: FieldType.number, values: [150] }, + ], + }); + expect(getFieldDisplayNames([series2])).toMatchInlineSnapshot(` + [ + "Time", + "Muta", + ] + `); + expect(getFieldNames([series2])).toMatchInlineSnapshot(` + [ + "Time", + "Value", + ] + `); + + const out = joinDataFrames({ frames: [series1, series2] })!; + expect(getFieldDisplayNames([out])).toMatchInlineSnapshot(` + [ + "Time", + "Muta 1", + "Muta 2", + ] + `); + expect(getFieldNames([out])).toMatchInlineSnapshot(` + [ + "Time", + "Muta", + "Muta", + ] + `); + }); + it('supports duplicate times', () => { //---------- // NOTE!!! @@ -357,3 +416,11 @@ describe('align frames', () => { }); }); }); + +function getFieldDisplayNames(data: DataFrame[]): string[] { + return data.flatMap((frame) => frame.fields.map((f) => getFieldDisplayName(f, frame, data))); +} + +function getFieldNames(data: DataFrame[]): string[] { + return data.flatMap((frame) => frame.fields.map((f) => f.name)); +} diff --git a/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts b/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts index 167a3f0ec50..0ab423ad06b 100644 --- a/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts +++ b/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts @@ -1,7 +1,7 @@ import intersect from 'fast_array_intersect'; import { getTimeField, sortDataFrame } from '../../dataframe'; -import { DataFrame, Field, FieldMatcher, FieldType } from '../../types'; +import { DataFrame, Field, FieldMatcher, FieldType, TIME_SERIES_VALUE_FIELD_NAME } from '../../types'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from '../matchers/ids'; @@ -180,12 +180,18 @@ export function joinDataFrames(options: JoinOptions): DataFrame | undefined { nullModesFrame.push(spanNulls === true ? NULL_REMOVE : spanNulls === -1 ? NULL_RETAIN : NULL_EXPAND); let labels = field.labels ?? {}; + let name = field.name; if (frame.name) { - labels = { ...labels, name: frame.name }; + if (field.name === TIME_SERIES_VALUE_FIELD_NAME) { + name = frame.name; + } else { + labels = { ...labels, name: frame.name }; + } } fields.push({ ...field, + name, labels, // add the name label from frame }); }