From 25b09168ebeb9678589a6396cc42437958a398dc Mon Sep 17 00:00:00 2001 From: parry <45209+thatsparesh@users.noreply.github.com> Date: Mon, 4 Mar 2019 02:56:47 -0600 Subject: [PATCH] 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 --- public/app/core/specs/file_export.test.ts | 10 +++++++++ public/app/core/utils/file_export.ts | 27 ++++++++++++----------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/public/app/core/specs/file_export.test.ts b/public/app/core/specs/file_export.test.ts index 98f5a5be742..9e2ff0a7ce1 100644 --- a/public/app/core/specs/file_export.test.ts +++ b/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', () => { diff --git a/public/app/core/utils/file_export.ts b/public/app/core/utils/file_export.ts index 1f999da72a5..c59d646839f 100644 --- a/public/app/core/utils/file_export.ts +++ b/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) {