Associated commits don't immediately show up on an analysis task page
[WebKit.git] / Websites / perf.webkit.org / public / v3 / models / metric.js
1 'use strict';
2
3 class Metric extends LabeledObject {
4     constructor(id, object)
5     {
6         super(id, object);
7         this._aggregatorName = object.aggregator;
8         object.test.addMetric(this);
9         this._test = object.test;
10         this._platforms = [];
11     }
12
13     aggregatorName() { return this._aggregatorName; }
14
15     test() { return this._test; }
16     platforms() { return this._platforms; }
17
18     addPlatform(platform)
19     {
20         console.assert(platform instanceof Platform);
21         this._platforms.push(platform);
22     }
23
24     childMetrics()
25     {
26         var metrics = [];
27         for (var childTest of this._test.childTests()) {
28             for (var childMetric of childTest.metrics())
29                 metrics.push(childMetric);
30         }
31         return metrics;
32     }
33
34     path() { return this._test.path().concat([this]); }
35
36     fullName()
37     {
38         return this._test.path().map(function (test) { return test.label(); }).join(' \u220B ') + ' : ' + this.label();
39     }
40
41     label()
42     {
43         var suffix = '';
44         switch (this._aggregatorName) {
45         case null:
46             break;
47         case 'Arithmetic':
48             suffix = ' : Arithmetic mean';
49             break;
50         case 'Geometric':
51             suffix = ' : Geometric mean';
52             break;
53         case 'Harmonic':
54             suffix = ' : Harmonic mean';
55             break;
56         case 'Total':
57         default:
58             suffix = ' : ' + this._aggregatorName;
59         }
60         return this.name() + suffix;
61     }
62
63     unit() { return RunsData.unitFromMetricName(this.name()); }
64     isSmallerBetter() { return RunsData.isSmallerBetter(this.unit()); }
65
66     makeFormatter(sigFig, alwaysShowSign)
67     {
68         var unit = this.unit();
69         var isMiliseconds = false;
70         if (unit == 'ms') {
71             isMiliseconds = true;
72             unit = 's';
73         }
74         var divisor = unit == 'B' ? 1024 : 1000;
75
76         var suffix = ['\u03BC', 'm', '', 'K', 'M', 'G', 'T', 'P', 'E'];
77         var threshold = sigFig >= 3 ? divisor : (divisor / 10);
78         return function (value) {
79             var i;
80             var sign = value >= 0 ? (alwaysShowSign ? '+' : '') : '-';
81             value = Math.abs(value);
82             for (i = isMiliseconds ? 1 : 2; value < 1 && i > 0; i--)
83                 value *= divisor;
84             for (; value >= threshold; i++)
85                 value /= divisor;
86             return sign + value.toPrecision(Math.max(2, sigFig)) + ' ' + suffix[i] + (unit || '');
87         }
88     };
89 }
90
91 if (typeof module != 'undefined')
92     module.exports.Metric = Metric;