From 9f280bd5c4f153f1001c971dd86aef88415cd431 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:07:12 -0500 Subject: [PATCH] [release-11.6.0] Transformations: Fix field naming in Add field from calc (Binary mode) (#102335) Transformations: Fix field naming in Add field from calc (Binary mode) (#102331) (cherry picked from commit 1a6ec718223cd4618294525f8a04e1d14d21f6ac) Co-authored-by: Leon Sorokin --- .../transformers/calculateField.test.ts | 66 +++++++++++++++++++ .../transformers/calculateField.ts | 3 +- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/packages/grafana-data/src/transformations/transformers/calculateField.test.ts b/packages/grafana-data/src/transformations/transformers/calculateField.test.ts index d633dad4db8..0017e07d1b7 100644 --- a/packages/grafana-data/src/transformations/transformers/calculateField.test.ts +++ b/packages/grafana-data/src/transformations/transformers/calculateField.test.ts @@ -15,6 +15,7 @@ import { DataTransformerConfig, LoadingState } from '@grafana/schema'; import { DataFrameView } from '../../dataframe/DataFrameView'; import { toDataFrame } from '../../dataframe/processDataFrame'; +import { cacheFieldDisplayNames } from '../../field/fieldState'; import { DataFrame, FieldType } from '../../types/dataFrame'; import { getDefaultTimeRange } from '../../types/time'; import { BinaryOperationID } from '../../utils/binaryOperators'; @@ -221,6 +222,71 @@ describe('calculateField transformer w/ timeseries', () => { }); }); + it("byType/number: don't inherit original field.state in new fields. don't create duplicate fields.", async () => { + const cfg = { + id: DataTransformerID.calculateField, + options: { + mode: CalculateFieldMode.BinaryOperation, + binary: { + left: { matcher: { id: FieldMatcherID.byType, options: FieldType.number } }, + operator: BinaryOperationID.Add, + right: '2', + }, + replaceFields: false, + }, + }; + + cacheFieldDisplayNames([seriesBC]); + + await expect(transformDataFrame([cfg], [seriesBC])).toEmitValuesWith((received) => { + const data = received[0]; + const filtered = data[0]; + + expect(filtered).toEqual({ + fields: [ + { + name: 'TheTime', + type: 'time', + values: [1000, 2000], + config: {}, + state: { displayName: 'TheTime', multipleFrames: false }, + }, + { + name: 'B', + type: 'number', + values: [2, 200], + config: {}, + state: { displayName: 'B', multipleFrames: false }, + }, + { name: 'B + 2', type: 'number', values: [4, 202], config: {} }, + { + name: 'C', + type: 'number', + values: [3, 300], + config: {}, + state: { displayName: 'C', multipleFrames: false }, + }, + { name: 'C + 2', type: 'number', values: [5, 302], config: {} }, + { + name: 'D', + type: 'string', + values: ['first', 'second'], + config: {}, + state: { displayName: 'D', multipleFrames: false }, + }, + { + name: 'E', + type: 'boolean', + values: [true, false], + config: {}, + state: { displayName: 'E', multipleFrames: false }, + }, + ], + length: 2, + }); + }); + }); + it('multiple queries + field + static number', async () => { const cfg = { id: DataTransformerID.calculateField, diff --git a/packages/grafana-data/src/transformations/transformers/calculateField.ts b/packages/grafana-data/src/transformations/transformers/calculateField.ts index d6ef07c8f5c..c952e10e70c 100644 --- a/packages/grafana-data/src/transformations/transformers/calculateField.ts +++ b/packages/grafana-data/src/transformations/transformers/calculateField.ts @@ -185,7 +185,7 @@ export const calculateFieldTransformer: DataTransformerInfo { - if (!options.replaceFields) { + if (!options.replaceFields && !newFields.includes(field)) { newFields.push(field); } if (field.type === fieldType) { @@ -210,6 +210,7 @@ export const calculateFieldTransformer: DataTransformerInfo