Browse Source

Don't mutate seriesList parameter in mergeSeriesByTime (#15619)

* do not mutate seriesList in mergeSeriesByTime

* extendedseriesList -> extendedDatapointsList

* remove toString() from datapoints, since the value can be null
parry 7 years ago
parent
commit
25b09168eb
2 changed files with 24 additions and 13 deletions
  1. 10 0
      public/app/core/specs/file_export.test.ts
  2. 14 13
      public/app/core/utils/file_export.ts

+ 10 - 0
public/app/core/specs/file_export.test.ts

@@ -60,6 +60,16 @@ describe('file_export', () => {
 
       expect(text).toBe(expectedText);
     });
+
+    it('should not modify series.datapoints', () => {
+      const expectedSeries1DataPoints = ctx.seriesList[0].datapoints.slice();
+      const expectedSeries2DataPoints = ctx.seriesList[1].datapoints.slice();
+
+      fileExport.convertSeriesListToCsvColumns(ctx.seriesList, ctx.timeFormat);
+
+      expect(expectedSeries1DataPoints).toEqual(ctx.seriesList[0].datapoints);
+      expect(expectedSeries2DataPoints).toEqual(ctx.seriesList[1].datapoints);
+    });
   });
 
   describe('when exporting table data to csv', () => {

+ 14 - 13
public/app/core/utils/file_export.ts

@@ -88,18 +88,18 @@ export function convertSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAU
       )
     );
   // process data
-  seriesList = mergeSeriesByTime(seriesList);
+  const extendedDatapointsList = mergeSeriesByTime(seriesList);
 
   // make text
-  for (let i = 0; i < seriesList[0].datapoints.length; i += 1) {
-    const timestamp = moment(seriesList[0].datapoints[i][POINT_TIME_INDEX]).format(dateTimeFormat);
+  for (let i = 0; i < extendedDatapointsList[0].length; i += 1) {
+    const timestamp = moment(extendedDatapointsList[0][i][POINT_TIME_INDEX]).format(dateTimeFormat);
     text += formatRow(
       [timestamp].concat(
-        seriesList.map(series => {
-          return series.datapoints[i][POINT_VALUE_INDEX];
+        extendedDatapointsList.map(datapoints => {
+          return datapoints[i][POINT_VALUE_INDEX];
         })
       ),
-      i < seriesList[0].datapoints.length - 1
+      i < extendedDatapointsList[0].length - 1
     );
   }
 
@@ -120,22 +120,23 @@ function mergeSeriesByTime(seriesList) {
   }
   timestamps = sortedUniq(timestamps.sort());
 
+  const result = [];
   for (let i = 0; i < seriesList.length; i++) {
     const seriesPoints = seriesList[i].datapoints;
     const seriesTimestamps = seriesPoints.map(p => p[POINT_TIME_INDEX]);
-    const extendedSeries = [];
-    let pointIndex;
+    const extendedDatapoints = [];
     for (let j = 0; j < timestamps.length; j++) {
-      pointIndex = sortedIndexOf(seriesTimestamps, timestamps[j]);
+      const timestamp = timestamps[j];
+      const pointIndex = sortedIndexOf(seriesTimestamps, timestamp);
       if (pointIndex !== -1) {
-        extendedSeries.push(seriesPoints[pointIndex]);
+        extendedDatapoints.push(seriesPoints[pointIndex]);
       } else {
-        extendedSeries.push([null, timestamps[j]]);
+        extendedDatapoints.push([null, timestamp]);
       }
     }
-    seriesList[i].datapoints = extendedSeries;
+    result.push(extendedDatapoints);
   }
-  return seriesList;
+  return result;
 }
 
 export function exportSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {