diff --git a/packages/grafana-ui/src/utils/processTimeSeries.test.ts b/packages/grafana-ui/src/utils/processTimeSeries.test.ts new file mode 100644 index 00000000000..fe291898c55 --- /dev/null +++ b/packages/grafana-ui/src/utils/processTimeSeries.test.ts @@ -0,0 +1,31 @@ +import { toTableData } from './processTimeSeries'; + +describe('toTableData', () => { + it('converts timeseries to table skipping nulls', () => { + const input = { + target: 'Field Name', + datapoints: [[100, 1], [200, 2]], + }; + const data = toTableData([null, input, null, null]); + expect(data.length).toBe(1); + expect(data[0].columns[0].text).toBe(input.target); + expect(data[0].rows).toBe(input.datapoints); + }); + + it('keeps tableData unchanged', () => { + const input = { + columns: [{ text: 'A' }, { text: 'B' }, { text: 'C' }], + rows: [[100, 'A', 1], [200, 'B', 2], [300, 'C', 3]], + }; + const data = toTableData([null, input, null, null]); + expect(data.length).toBe(1); + expect(data[0]).toBe(input); + }); + + it('supports null values OK', () => { + expect(toTableData([null, null, null, null])).toEqual([]); + expect(toTableData(undefined)).toEqual([]); + expect(toTableData((null as unknown) as any[])).toEqual([]); + expect(toTableData([])).toEqual([]); + }); +}); diff --git a/packages/grafana-ui/src/utils/processTimeSeries.ts b/packages/grafana-ui/src/utils/processTimeSeries.ts index e7582c9f13c..112bd67f481 100644 --- a/packages/grafana-ui/src/utils/processTimeSeries.ts +++ b/packages/grafana-ui/src/utils/processTimeSeries.ts @@ -193,35 +193,35 @@ export function processTimeSeries({ data, xColumn, yColumn, nullValueMode }: Opt export const isTableData = (data: any): data is TableData => data && data.hasOwnProperty('columns'); -export const toTableData = (results: any[]): TableData[] => { - const tables: TableData[] = []; - if (results) { - for (let i = 0; i < results.length; i++) { - const data = results[i]; - if (data) { - if (data.hasOwnProperty('columns')) { - tables.push(data as TableData); - } else if (data.hasOwnProperty('datapoints')) { - const ts = data as TimeSeries; - tables.push({ - columns: [ - { - text: ts.target, - unit: ts.unit, - }, - { - text: 'Time', - type: 'time', - }, - ], - rows: ts.datapoints, - } as TableData); - } else { - console.warn('Can not convert', data); - throw new Error('Unsupported data format'); - } - } - } +export const toTableData = (results?: any[]): TableData[] => { + if (!results) { + return []; } - return tables; + + return results + .filter(d => !!d) + .map(data => { + if (data.hasOwnProperty('columns')) { + return data as TableData; + } + if (data.hasOwnProperty('datapoints')) { + const ts = data as TimeSeries; + return { + columns: [ + { + text: ts.target || 'Timeseries', + unit: ts.unit, + }, + { + text: 'Time', + type: 'time', + }, + ], + rows: ts.datapoints, + } as TableData; + } + // TODO, try to convert JSON to table? + console.warn('Can not convert', data); + throw new Error('Unsupported data format'); + }); };