blob: 139551c91fce6f27e0ec684d3f026b0e3f3626dc [file] [log] [blame]
'use strict';
class MeasurementAdaptor {
constructor(formatMap)
{
var nameMap = {};
formatMap.forEach(function (key, index) {
nameMap[key] = index;
});
this._idIndex = nameMap['id'];
this._commitTimeIndex = nameMap['commitTime'];
this._countIndex = nameMap['iterationCount'];
this._meanIndex = nameMap['mean'];
this._sumIndex = nameMap['sum'];
this._squareSumIndex = nameMap['squareSum'];
this._markedOutlierIndex = nameMap['markedOutlier'];
this._revisionsIndex = nameMap['revisions'];
this._buildIndex = nameMap['build'];
this._buildTimeIndex = nameMap['buildTime'];
this._buildNumberIndex = nameMap['buildNumber'];
this._builderIndex = nameMap['builder'];
this._metricIndex = nameMap['metric'];
this._configTypeIndex = nameMap['configType'];
}
extractId(row)
{
return row[this._idIndex];
}
isOutlier(row)
{
return row[this._markedOutlierIndex];
}
applyToAnalysisResults(row)
{
var adaptedRow = this.applyTo(row);
adaptedRow.metricId = row[this._metricIndex];
adaptedRow.configType = row[this._configTypeIndex];
return adaptedRow;
}
applyTo(row)
{
var id = row[this._idIndex];
var mean = row[this._meanIndex];
var sum = row[this._sumIndex];
var squareSum = row[this._squareSumIndex];
var buildId = row[this._buildIndex];
var builderId = row[this._builderIndex];
var cachedBuild = null;
var cachedInterval = null;
var self = this;
return {
id: id,
markedOutlier: row[this._markedOutlierIndex],
buildId: buildId,
metricId: null,
configType: null,
commitSet: function () { return MeasurementCommitSet.ensureSingleton(id, row[self._revisionsIndex]); },
build: function () {
if (cachedBuild == null && builderId)
cachedBuild = new Build(buildId, Builder.findById(builderId), row[self._buildNumberIndex], row[self._buildTimeIndex]);
return cachedBuild;
},
time: row[this._commitTimeIndex],
value: mean,
sum: sum,
squareSum: squareSum,
iterationCount: row[this._countIndex],
get interval () {
if (cachedInterval == null)
cachedInterval = MeasurementAdaptor.computeConfidenceInterval(row[self._countIndex], mean, sum, squareSum);
return cachedInterval;
}
};
}
static aggregateAnalysisResults(results)
{
var totalSum = 0;
var totalSquareSum = 0;
var totalIterationCount = 0;
var means = [];
for (var result of results) {
means.push(result.value);
totalSum += result.sum;
totalSquareSum += result.squareSum;
totalIterationCount += result.iterationCount;
}
var mean = totalSum / totalIterationCount;
var interval;
try {
interval = this.computeConfidenceInterval(totalIterationCount, mean, totalSum, totalSquareSum)
} catch (error) {
interval = this.computeConfidenceInterval(results.length, mean, Statistics.sum(means), Statistics.squareSum(means));
}
return { value: mean, interval: interval };
}
static computeConfidenceInterval(iterationCount, mean, sum, squareSum)
{
var delta = Statistics.confidenceIntervalDelta(0.95, iterationCount, sum, squareSum);
return isNaN(delta) ? null : [mean - delta, mean + delta];
}
}
if (typeof module != 'undefined')
module.exports.MeasurementAdaptor = MeasurementAdaptor;