fix sumSeries() function, closes #286
This commit is contained in:
34
src/datasource-zabbix/specs/timeseries_specs.js
Normal file
34
src/datasource-zabbix/specs/timeseries_specs.js
Normal file
@@ -0,0 +1,34 @@
|
||||
// import _ from 'lodash';
|
||||
import ts from '../timeseries';
|
||||
|
||||
describe('timeseries processing functions', () => {
|
||||
|
||||
describe('sumSeries()', () => {
|
||||
it('should properly sum series', (done) => {
|
||||
let series = [
|
||||
[[0, 1], [1, 2], [1, 3]],
|
||||
[[2, 1], [3, 2], [4, 3]]
|
||||
];
|
||||
|
||||
let expected = [[2, 1], [4, 2], [5, 3]];
|
||||
|
||||
let result = ts.sumSeries(series);
|
||||
expect(result).to.eql(expected);
|
||||
done();
|
||||
});
|
||||
|
||||
it('should properly sum series with nulls', (done) => {
|
||||
// issue #286
|
||||
let series = [
|
||||
[[1, 1], [1, 2], [1, 3]],
|
||||
[[3, 2], [4, 3]]
|
||||
];
|
||||
|
||||
let expected = [[1, 1], [4, 2], [5, 3]];
|
||||
|
||||
let result = ts.sumSeries(series);
|
||||
expect(result).to.eql(expected);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -141,6 +141,7 @@ function sumSeries(timeseries) {
|
||||
new_timestamps = _.sortBy(new_timestamps);
|
||||
|
||||
var interpolated_timeseries = _.map(timeseries, function (series) {
|
||||
series = fillZeroes(series, new_timestamps);
|
||||
var timestamps = _.map(series, function (point) {
|
||||
return point[1];
|
||||
});
|
||||
@@ -384,6 +385,30 @@ function sortByTime(series) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill empty front and end of series by zeroes.
|
||||
*
|
||||
* | *** | | *** |
|
||||
* |___ ___| -> |*** ***|
|
||||
* @param {*} series
|
||||
* @param {*} timestamps
|
||||
*/
|
||||
function fillZeroes(series, timestamps) {
|
||||
let prepend = [];
|
||||
let append = [];
|
||||
let new_point;
|
||||
for (let i = 0; i < timestamps.length; i++) {
|
||||
if (timestamps[i] < series[0][POINT_TIMESTAMP]) {
|
||||
new_point = [0, timestamps[i]];
|
||||
prepend.push(new_point);
|
||||
} else if (timestamps[i] > series[series.length - 1][POINT_TIMESTAMP]) {
|
||||
new_point = [0, timestamps[i]];
|
||||
append.push(new_point);
|
||||
}
|
||||
}
|
||||
return _.concat(_.concat(prepend, series), append);
|
||||
}
|
||||
|
||||
/**
|
||||
* Interpolate series with gaps
|
||||
*/
|
||||
@@ -393,8 +418,8 @@ function interpolateSeries(series) {
|
||||
// Interpolate series
|
||||
for (var i = series.length - 1; i >= 0; i--) {
|
||||
if (!series[i][0]) {
|
||||
left = findNearestLeft(series, series[i]);
|
||||
right = findNearestRight(series, series[i]);
|
||||
left = findNearestLeft(series, i);
|
||||
right = findNearestRight(series, i);
|
||||
if (!left) {
|
||||
left = right;
|
||||
}
|
||||
@@ -415,26 +440,22 @@ function linearInterpolation(timestamp, left, right) {
|
||||
}
|
||||
}
|
||||
|
||||
function findNearestRight(series, point) {
|
||||
var point_index = _.indexOf(series, point);
|
||||
var nearestRight;
|
||||
for (var i = point_index; i < series.length; i++) {
|
||||
function findNearestRight(series, pointIndex) {
|
||||
for (var i = pointIndex; i < series.length; i++) {
|
||||
if (series[i][0] !== null) {
|
||||
return series[i];
|
||||
}
|
||||
}
|
||||
return nearestRight;
|
||||
return null;
|
||||
}
|
||||
|
||||
function findNearestLeft(series, point) {
|
||||
var point_index = _.indexOf(series, point);
|
||||
var nearestLeft;
|
||||
for (var i = point_index; i > 0; i--) {
|
||||
function findNearestLeft(series, pointIndex) {
|
||||
for (var i = pointIndex; i > 0; i--) {
|
||||
if (series[i][0] !== null) {
|
||||
return series[i];
|
||||
}
|
||||
}
|
||||
return nearestLeft;
|
||||
return null;
|
||||
}
|
||||
|
||||
////////////
|
||||
|
||||
Reference in New Issue
Block a user