From e56f97ec71ac560fc31b90d35b9d90a08240aa4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Wed, 26 Jul 2023 14:17:02 +0200 Subject: [PATCH] grafana-data: handle reordering of field.nanos (#72290) * grafana-data: handle reordering of field.nanos * do not add nanos:undefined --- .../src/dataframe/processDataFrame.test.ts | 27 +++++++++++++++++++ .../src/dataframe/processDataFrame.ts | 21 +++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/grafana-data/src/dataframe/processDataFrame.test.ts b/packages/grafana-data/src/dataframe/processDataFrame.test.ts index 4d5c6485004..2e23be6e171 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.test.ts @@ -8,6 +8,7 @@ import { guessFieldTypes, isDataFrame, isTableData, + reverseDataFrame, sortDataFrame, toDataFrame, toLegacyResponseData, @@ -360,19 +361,45 @@ describe('sorted DataFrame', () => { { name: 'fist', type: FieldType.time, values: [1, 2, 3] }, { name: 'second', type: FieldType.string, values: ['a', 'b', 'c'] }, { name: 'third', type: FieldType.number, values: [2000, 3000, 1000] }, + { name: 'fourth', type: FieldType.time, values: [1, 2, 3], nanos: [10, 20, 30] }, ], }); it('Should sort numbers', () => { const sorted = sortDataFrame(frame, 0, true); expect(sorted.length).toEqual(3); expect(sorted.fields[0].values).toEqual([3, 2, 1]); + expect(sorted.fields[0].nanos).toBeUndefined(); expect(sorted.fields[1].values).toEqual(['c', 'b', 'a']); + expect(sorted.fields[1].nanos).toBeUndefined(); + expect(sorted.fields[3].values).toEqual([3, 2, 1]); + expect(sorted.fields[3].nanos).toEqual([30, 20, 10]); }); it('Should sort strings', () => { const sorted = sortDataFrame(frame, 1, true); expect(sorted.length).toEqual(3); expect(sorted.fields[0].values).toEqual([3, 2, 1]); + expect(sorted.fields[0].nanos).toBeUndefined(); expect(sorted.fields[1].values).toEqual(['c', 'b', 'a']); + expect(sorted.fields[1].nanos).toBeUndefined(); + expect(sorted.fields[3].values).toEqual([3, 2, 1]); + expect(sorted.fields[3].nanos).toEqual([30, 20, 10]); + }); +}); + +describe('reverse DataFrame', () => { + const frame = toDataFrame({ + fields: [ + { name: 'fist', type: FieldType.time, values: [1, 2, 3], nanos: [10, 20, 30] }, + { name: 'third', type: FieldType.string, values: ['a', 'b', 'c'] }, + ], + }); + it('should reverse dataframe', () => { + const rev = reverseDataFrame(frame); + expect(rev.length).toEqual(3); + expect(rev.fields[0].values).toEqual([3, 2, 1]); + expect(rev.fields[0].nanos).toEqual([30, 20, 10]); + expect(rev.fields[1].values).toEqual(['c', 'b', 'a']); + expect(rev.fields[1].nanos).toBeUndefined(); }); }); diff --git a/packages/grafana-data/src/dataframe/processDataFrame.ts b/packages/grafana-data/src/dataframe/processDataFrame.ts index 09e67d8349d..402f4962508 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.ts @@ -431,10 +431,17 @@ export function sortDataFrame(data: DataFrame, sortIndex?: number, reverse = fal return { ...data, fields: data.fields.map((f) => { - return { + const newF = { ...f, values: f.values.map((v, i) => f.values[index[i]]), }; + + // only add .nanos if it exists + const { nanos } = f; + if (nanos !== undefined) { + newF.nanos = nanos.map((n, i) => nanos[index[i]]); + } + return newF; }), }; } @@ -448,10 +455,20 @@ export function reverseDataFrame(data: DataFrame): DataFrame { fields: data.fields.map((f) => { const values = [...f.values]; values.reverse(); - return { + + const newF = { ...f, values, }; + + // only add .nanos if it exists + const { nanos } = f; + if (nanos !== undefined) { + const revNanos = [...nanos]; + revNanos.reverse(); + newF.nanos = revNanos; + } + return newF; }), }; }