ryan 6 лет назад
Родитель
Сommit
229dff757c

+ 31 - 0
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([]);
+  });
+});

+ 30 - 30
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');
+    });
 };