fix multiple agg functions handling, closes #530
This commit is contained in:
@@ -107,7 +107,7 @@ function groupByWrapper(interval, groupFunc, datapoints) {
|
|||||||
|
|
||||||
function aggregateByWrapper(interval, aggregateFunc, datapoints) {
|
function aggregateByWrapper(interval, aggregateFunc, datapoints) {
|
||||||
// Flatten all points in frame and then just use groupBy()
|
// Flatten all points in frame and then just use groupBy()
|
||||||
const flattenedPoints = _.flatten(datapoints, true);
|
const flattenedPoints = ts.flattenDatapoints(datapoints);
|
||||||
// groupBy_perf works with sorted series only
|
// groupBy_perf works with sorted series only
|
||||||
const sortedPoints = ts.sortByTime(flattenedPoints);
|
const sortedPoints = ts.sortByTime(flattenedPoints);
|
||||||
let groupByCallback = aggregationFunctions[aggregateFunc];
|
let groupByCallback = aggregationFunctions[aggregateFunc];
|
||||||
@@ -115,14 +115,14 @@ function aggregateByWrapper(interval, aggregateFunc, datapoints) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function aggregateWrapper(groupByCallback, interval, datapoints) {
|
function aggregateWrapper(groupByCallback, interval, datapoints) {
|
||||||
var flattenedPoints = _.flatten(datapoints, true);
|
var flattenedPoints = ts.flattenDatapoints(datapoints);
|
||||||
// groupBy_perf works with sorted series only
|
// groupBy_perf works with sorted series only
|
||||||
const sortedPoints = ts.sortByTime(flattenedPoints);
|
const sortedPoints = ts.sortByTime(flattenedPoints);
|
||||||
return groupBy(sortedPoints, interval, groupByCallback);
|
return groupBy(sortedPoints, interval, groupByCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
function percentil(interval, n, datapoints) {
|
function percentil(interval, n, datapoints) {
|
||||||
var flattenedPoints = _.flatten(datapoints, true);
|
var flattenedPoints = ts.flattenDatapoints(datapoints);
|
||||||
var groupByCallback = _.partial(PERCENTIL, n);
|
var groupByCallback = _.partial(PERCENTIL, n);
|
||||||
return groupBy(flattenedPoints, interval, groupByCallback);
|
return groupBy(flattenedPoints, interval, groupByCallback);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,4 +138,31 @@ describe('Utils', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getArrayDepth()', () => {
|
||||||
|
it('should calculate proper array depth', () => {
|
||||||
|
const test_cases = [
|
||||||
|
{
|
||||||
|
array: [],
|
||||||
|
depth: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
array: [1, 2, 3],
|
||||||
|
depth: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
array: [[1, 2], [3, 4]],
|
||||||
|
depth: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
array: [ [[1, 2], [3, 4]], [[1, 2], [3, 4]] ],
|
||||||
|
depth: 3
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const test_case of test_cases) {
|
||||||
|
expect(utils.getArrayDepth(test_case.array)).toBe(test_case.depth);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -478,6 +478,15 @@ function findNearestLeft(series, pointIndex) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function flattenDatapoints(datapoints) {
|
||||||
|
const depth = utils.getArrayDepth(datapoints);
|
||||||
|
if (depth <= 2) {
|
||||||
|
// Don't process if datapoints already flattened
|
||||||
|
return datapoints;
|
||||||
|
}
|
||||||
|
return _.flatten(datapoints);
|
||||||
|
}
|
||||||
|
|
||||||
////////////
|
////////////
|
||||||
// Export //
|
// Export //
|
||||||
////////////
|
////////////
|
||||||
@@ -501,7 +510,8 @@ const exportedFunctions = {
|
|||||||
MAX,
|
MAX,
|
||||||
MEDIAN,
|
MEDIAN,
|
||||||
PERCENTIL,
|
PERCENTIL,
|
||||||
sortByTime
|
sortByTime,
|
||||||
|
flattenDatapoints,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default exportedFunctions;
|
export default exportedFunctions;
|
||||||
|
|||||||
@@ -265,6 +265,17 @@ export function compactQuery(query) {
|
|||||||
return query.replace(/\s+/g, ' ').trim();
|
return query.replace(/\s+/g, ' ').trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getArrayDepth(a, level = 0) {
|
||||||
|
if (a.length === 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const elem = a[0];
|
||||||
|
if (_.isArray(elem)) {
|
||||||
|
return getArrayDepth(elem, level + 1);
|
||||||
|
}
|
||||||
|
return level + 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Fix for backward compatibility with lodash 2.4
|
// Fix for backward compatibility with lodash 2.4
|
||||||
if (!_.includes) {
|
if (!_.includes) {
|
||||||
_.includes = _.contains;
|
_.includes = _.contains;
|
||||||
|
|||||||
Reference in New Issue
Block a user