From 633e354a76f02c9d8c26e930b30df0676f2fd70f Mon Sep 17 00:00:00 2001 From: Galen Kistler <109082771+gtk-grafana@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:29:10 -0600 Subject: [PATCH] Transformations: Fix converting time fields to number in reduceFields (#81830) * Fix bug converting time fields to number in reduce --------- Co-authored-by: Ryan McKinley --- .../transformers/reduce.test.ts | 30 +++++++++++++++++-- .../transformations/transformers/reduce.ts | 20 +++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/grafana-data/src/transformations/transformers/reduce.test.ts b/packages/grafana-data/src/transformations/transformers/reduce.test.ts index 95c175f66a0..3cb46763a54 100644 --- a/packages/grafana-data/src/transformations/transformers/reduce.test.ts +++ b/packages/grafana-data/src/transformations/transformers/reduce.test.ts @@ -21,7 +21,7 @@ const seriesAWithMultipleFields = toDataFrame({ name: 'A', fields: [ { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, - { name: 'temperature', type: FieldType.number, values: [3, 4, 5, 6] }, + { name: 'temperature', type: FieldType.number, values: [3, 4, 5, 6, 6] }, { name: 'humidity', type: FieldType.number, values: [10000.3, 10000.4, 10000.5, 10000.6] }, ], }); @@ -52,7 +52,14 @@ describe('Reducer Transformer', () => { const cfg = { id: DataTransformerID.reduce, options: { - reducers: [ReducerID.first, ReducerID.min, ReducerID.max, ReducerID.last], + reducers: [ + ReducerID.first, + ReducerID.min, + ReducerID.max, + ReducerID.last, + ReducerID.uniqueValues, + ReducerID.count, + ], }, }; @@ -90,6 +97,25 @@ describe('Reducer Transformer', () => { values: [6, 10000.6, 7, 11000.7], config: {}, }, + { + // expect type other + name: 'All unique values', + type: FieldType.other, + values: [ + [3, 4, 5, 6], + [10000.3, 10000.4, 10000.5, 10000.6], + [1, 3, 5, 7], + [11000.1, 11000.3, 11000.5, 11000.7], + ], + config: {}, + }, + { + // expect type number + name: 'Count', + type: FieldType.number, + values: [5, 4, 4, 4], + config: {}, + }, ]; expect(processed.length).toEqual(1); diff --git a/packages/grafana-data/src/transformations/transformers/reduce.ts b/packages/grafana-data/src/transformations/transformers/reduce.ts index 1294903e83d..f8ba7adddc5 100644 --- a/packages/grafana-data/src/transformations/transformers/reduce.ts +++ b/packages/grafana-data/src/transformations/transformers/reduce.ts @@ -1,6 +1,6 @@ import { map } from 'rxjs/operators'; -import { guessFieldTypeForField, guessFieldTypeFromValue } from '../../dataframe/processDataFrame'; +import { guessFieldTypeForField } from '../../dataframe/processDataFrame'; import { getFieldDisplayName } from '../../field'; import { KeyValue } from '../../types/data'; import { DataFrame, Field, FieldType } from '../../types/dataFrame'; @@ -211,7 +211,6 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId const calculators = fieldReducers.list(reducerId); const reducers = calculators.map((c) => c.id); const processed: DataFrame[] = []; - for (const series of data) { const fields: Field[] = []; for (const field of series.fields) { @@ -224,7 +223,7 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId const value = results[reducer]; const copy = { ...field, - type: guessFieldTypeFromValue(value), + type: getFieldType(reducer, field), values: [value], }; copy.state = undefined; @@ -249,3 +248,18 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId return processed; } + +function getFieldType(reducer: string, field: Field) { + switch (reducer) { + case ReducerID.allValues: + case ReducerID.uniqueValues: + return FieldType.other; + case ReducerID.first: + case ReducerID.firstNotNull: + case ReducerID.last: + case ReducerID.lastNotNull: + return field.type; + default: + return FieldType.number; + } +}