From c27a21eb46019875f5872be6447b8fb021529884 Mon Sep 17 00:00:00 2001 From: William Lachance Date: Thu, 31 Mar 2016 16:51:09 -0400 Subject: [PATCH] Bug 1261176 - Simplify client-side getSeriesList API Let's have it get the option collection map, if necessary, instead of forcing the consumer to grab it every time. --- ui/js/controllers/perf/compare.js | 218 +++++++++++------------- ui/js/controllers/perf/e10s.js | 273 +++++++++++++++--------------- ui/js/controllers/perf/graphs.js | 174 +++++++++---------- ui/js/perf.js | 16 +- 4 files changed, 323 insertions(+), 358 deletions(-) diff --git a/ui/js/controllers/perf/compare.js b/ui/js/controllers/perf/compare.js index c681bfc93d4..65255f9ab0c 100644 --- a/ui/js/controllers/perf/compare.js +++ b/ui/js/controllers/perf/compare.js @@ -153,12 +153,12 @@ perf.controller('CompareChooserCtrl', [ perf.controller('CompareResultsCtrl', [ '$state', '$stateParams', '$scope', '$rootScope', '$location', - 'thServiceDomain', 'ThOptionCollectionModel', 'ThRepositoryModel', + 'thServiceDomain', 'ThRepositoryModel', 'ThResultSetModel', '$http', '$q', '$timeout', 'PhFramework', 'PhSeries', 'math', 'phTimeRanges', 'PhCompare', function CompareResultsCtrl($state, $stateParams, $scope, $rootScope, $location, - thServiceDomain, ThOptionCollectionModel, + thServiceDomain, ThRepositoryModel, ThResultSetModel, $http, $q, $timeout, PhFramework, PhSeries, math, phTimeRanges, @@ -177,8 +177,7 @@ perf.controller('CompareResultsCtrl', [ PhSeries.getSeriesList( $scope.originalProject.name, - { interval: timeRange, subtests: 0 }, - optionCollectionMap).then( + { interval: timeRange, subtests: 0 }).then( function(originalSeriesList) { $scope.platformList = _.uniq( _.map(originalSeriesList, 'platform')); @@ -200,8 +199,7 @@ perf.controller('CompareResultsCtrl', [ PhSeries.getSeriesList( $scope.newProject.name, - { interval: timeRange, subtests: 0 }, - optionCollectionMap).then( + { interval: timeRange, subtests: 0 }).then( function(newSeriesList) { $scope.platformList = _.union( $scope.platformList, @@ -304,17 +302,12 @@ perf.controller('CompareResultsCtrl', [ $scope.dataLoading = true; $scope.getCompareClasses = PhCompare.getCompareClasses; - var optionCollectionMap = {}; var loadRepositories = ThRepositoryModel.load(); - var loadOptions = ThOptionCollectionModel.getMap().then( - function(_optionCollectionMap) { - optionCollectionMap = _optionCollectionMap; - }); var loadFrameworks = PhFramework.getFrameworkList().then( function(frameworks) { $scope.frameworks = frameworks.data; }); - $q.all([loadRepositories, loadOptions, loadFrameworks]).then(function() { + $q.all([loadRepositories, loadFrameworks]).then(function() { $scope.errors = PhCompare.validateInput($stateParams.originalProject, $stateParams.newProject, $stateParams.originalRevision, @@ -374,12 +367,11 @@ perf.controller('CompareResultsCtrl', [ perf.controller('CompareSubtestResultsCtrl', [ '$state', '$stateParams', '$scope', '$rootScope', '$location', - 'thServiceDomain', 'ThOptionCollectionModel', 'ThRepositoryModel', + 'thServiceDomain', 'ThRepositoryModel', 'ThResultSetModel', '$http', '$q', '$timeout', 'PhSeries', 'math', 'PhCompare', function CompareSubtestResultsCtrl($state, $stateParams, $scope, $rootScope, $location, thServiceDomain, - ThOptionCollectionModel, ThRepositoryModel, ThResultSetModel, $http, $q, $timeout, PhSeries, math, PhCompare) { @@ -485,122 +477,110 @@ perf.controller('CompareSubtestResultsCtrl', [ $scope.dataLoading = true; $scope.getCompareClasses = PhCompare.getCompareClasses; - var optionCollectionMap = {}; - var loadRepositories = ThRepositoryModel.load(); - var loadOptions = ThOptionCollectionModel.getMap().then( - function(_optionCollectionMap) { - optionCollectionMap = _optionCollectionMap; - }); - $q.all([loadRepositories, loadOptions]).then( - function() { - $scope.errors = PhCompare.validateInput($stateParams.originalProject, - $stateParams.newProject, - $stateParams.originalRevision, - $stateParams.newRevision, - $stateParams.originalSignature, - $stateParams.newSignature); - - if ($scope.errors.length > 0) { - $scope.dataLoading = false; - return; - } + ThRepositoryModel.load().then(function() { + $scope.errors = PhCompare.validateInput($stateParams.originalProject, + $stateParams.newProject, + $stateParams.originalRevision, + $stateParams.newRevision, + $stateParams.originalSignature, + $stateParams.newSignature); - $scope.originalProject = ThRepositoryModel.getRepo( - $stateParams.originalProject); - $scope.newProject = ThRepositoryModel.getRepo( - $stateParams.newProject); - $scope.newRevision = $stateParams.newRevision; - $scope.originalRevision = $stateParams.originalRevision; - $scope.originalSignature = $stateParams.originalSignature; - $scope.newSignature = $stateParams.newSignature; + if ($scope.errors.length > 0) { + $scope.dataLoading = false; + return; + } - verifyRevision($scope.originalProject, $scope.originalRevision, "original").then(function () { - verifyRevision($scope.newProject, $scope.newRevision, "new").then(function () { - $scope.pageList = []; + $scope.originalProject = ThRepositoryModel.getRepo( + $stateParams.originalProject); + $scope.newProject = ThRepositoryModel.getRepo( + $stateParams.newProject); + $scope.newRevision = $stateParams.newRevision; + $scope.originalRevision = $stateParams.originalRevision; + $scope.originalSignature = $stateParams.originalSignature; + $scope.newSignature = $stateParams.newSignature; - if ($scope.errors.length > 0) { - $scope.dataLoading = false; - return; - } + verifyRevision($scope.originalProject, $scope.originalRevision, "original").then(function () { + verifyRevision($scope.newProject, $scope.newRevision, "new").then(function () { + $scope.pageList = []; - var timeRange = PhCompare.getInterval($scope.originalResultSet.push_timestamp, $scope.newResultSet.push_timestamp); - var resultSetIds = [$scope.originalResultSet.id]; + if ($scope.errors.length > 0) { + $scope.dataLoading = false; + return; + } - // Optimization - if old/new branches are the same collect data in one pass - if ($scope.originalProject == $scope.newProject) { - resultSetIds = [$scope.originalResultSet.id, $scope.newResultSet.id]; - } + var timeRange = PhCompare.getInterval($scope.originalResultSet.push_timestamp, $scope.newResultSet.push_timestamp); + var resultSetIds = [$scope.originalResultSet.id]; + + // Optimization - if old/new branches are the same collect data in one pass + if ($scope.originalProject == $scope.newProject) { + resultSetIds = [$scope.originalResultSet.id, $scope.newResultSet.id]; + } + + $q.all([PhSeries.getSeriesList( + $scope.originalProject.name, + { signature: $scope.originalSignature }).then(function(originalSeries) { + $scope.testList = [originalSeries[0].name]; + return undefined; + }), + PhSeries.getSeriesList( + $scope.originalProject.name, + { parent_signature: $scope.originalSignature }).then(function(originalSubtestList) { + $scope.pageList = _.map(originalSubtestList, 'name'); + $scope.platformList = _.uniq(_.map(originalSubtestList, 'platform')); + return PhCompare.getResultsMap($scope.originalProject.name, + originalSubtestList, + resultSetIds); + }) + ]).then(function(results) { + var originalSeriesMap = results[1][$scope.originalResultSet.id]; + var newSeriesMap = results[1][$scope.newResultSet.id]; + [originalSeriesMap, newSeriesMap].forEach(function(seriesMap) { + // If there is no data for a given signature, handle it gracefully + if (seriesMap) { + Object.keys(seriesMap).forEach(function(series) { + if (!_.contains($scope.pageList, seriesMap[series].name)) { + $scope.pageList.push(seriesMap[series].name); + } + }); + } + }); - $q.all([PhSeries.getSeriesList( - $scope.originalProject.name, - { signature: $scope.originalSignature }, - optionCollectionMap).then(function(originalSeries) { - console.log(originalSeries); - $scope.testList = [originalSeries[0].name]; - return undefined; - }), - PhSeries.getSeriesList( - $scope.originalProject.name, - { parent_signature: $scope.originalSignature }, - optionCollectionMap).then(function(originalSubtestList) { - $scope.pageList = _.map(originalSubtestList, 'name'); - $scope.platformList = _.uniq(_.map(originalSubtestList, 'platform')); - return PhCompare.getResultsMap($scope.originalProject.name, - originalSubtestList, - resultSetIds); - }) - ]).then(function(results) { - var originalSeriesMap = results[1][$scope.originalResultSet.id]; - var newSeriesMap = results[1][$scope.newResultSet.id]; - [originalSeriesMap, newSeriesMap].forEach(function(seriesMap) { - // If there is no data for a given signature, handle it gracefully - if (seriesMap) { - Object.keys(seriesMap).forEach(function(series) { - if (!_.contains($scope.pageList, seriesMap[series].name)) { - $scope.pageList.push(seriesMap[series].name); + // Optimization- collect all data in a single pass + if (newSeriesMap) { + $scope.dataLoading = false; + displayResults(originalSeriesMap, newSeriesMap); + return; + } + + PhSeries.getSeriesList( + $scope.newProject.name, { parent_signature: $scope.newSignature }).then(function(newSeriesList) { + $scope.platformList = _.uniq(_.union( + $scope.platformList, + _.map(newSeriesList, 'platform'))); + $scope.testList = _.uniq(_.union( + $scope.testList, + _.map(newSeriesList, 'name'))); + + return PhCompare.getResultsMap($scope.newProject.name, + newSeriesList, + [$scope.newResultSet.id]); + }).then(function(newSeriesMaps) { + var newSeriesMap = newSeriesMaps[$scope.newResultSet.id]; + // There is a chance that we haven't received data for the given signature/resultSet yet + if (newSeriesMap) { + Object.keys(newSeriesMap).forEach(function(series) { + if (!_.contains($scope.pageList, newSeriesMap[series].name)) { + $scope.pageList.push(newSeriesMap[series].name); } }); + } else { + newSeriesMap = {}; } - }); - - // Optimization- collect all data in a single pass - if (newSeriesMap) { $scope.dataLoading = false; displayResults(originalSeriesMap, newSeriesMap); - return; - } - - PhSeries.getSeriesList( - $scope.newProject.name, - { parent_signature: $scope.newSignature }, - optionCollectionMap).then(function(newSeriesList) { - $scope.platformList = _.uniq(_.union( - $scope.platformList, - _.map(newSeriesList, 'platform'))); - $scope.testList = _.uniq(_.union( - $scope.testList, - _.map(newSeriesList, 'name'))); - - return PhCompare.getResultsMap($scope.newProject.name, - newSeriesList, - [$scope.newResultSet.id]); - }).then(function(newSeriesMaps) { - var newSeriesMap = newSeriesMaps[$scope.newResultSet.id]; - // There is a chance that we haven't received data for the given signature/resultSet yet - if (newSeriesMap) { - Object.keys(newSeriesMap).forEach(function(series) { - if (!_.contains($scope.pageList, newSeriesMap[series].name)) { - $scope.pageList.push(newSeriesMap[series].name); - } - }); - } else { - newSeriesMap = {}; - } - $scope.dataLoading = false; - displayResults(originalSeriesMap, newSeriesMap); - }); - }); - }); + }); + }); }); }); + }); }]); diff --git a/ui/js/controllers/perf/e10s.js b/ui/js/controllers/perf/e10s.js index b7a8c372e99..b00578ace66 100644 --- a/ui/js/controllers/perf/e10s.js +++ b/ui/js/controllers/perf/e10s.js @@ -4,12 +4,11 @@ perf.value('e10sDefaultTimeRange', 86400 * 2); perf.controller('e10sCtrl', [ '$state', '$stateParams', '$scope', '$rootScope', '$q', '$http', - 'ThRepositoryModel', 'ThOptionCollectionModel', 'PhSeries', 'PhCompare', + 'ThRepositoryModel', 'PhSeries', 'PhCompare', 'thServiceDomain', 'thDefaultRepo', 'phTimeRanges', 'e10sDefaultTimeRange', function e10sCtrl($state, $stateParams, $scope, $rootScope, $q, $http, - ThRepositoryModel, ThOptionCollectionModel, PhSeries, - PhCompare, thServiceDomain, thDefaultRepo, phTimeRanges, - e10sDefaultTimeRange) { + ThRepositoryModel, PhSeries, PhCompare, thServiceDomain, + thDefaultRepo, phTimeRanges, e10sDefaultTimeRange) { var blockers = { "cart summary": 2.0, "damp summary": 2.0, @@ -54,88 +53,85 @@ perf.controller('e10sCtrl', [ $scope.compareResults = {}; $scope.titles = {}; - ThOptionCollectionModel.getMap().then(function(optionCollectionMap) { - PhSeries.getSeriesList( - $scope.selectedRepo.name, - { interval: $scope.selectedTimeRange.value, subtests: 0 }, - optionCollectionMap).then(function(seriesList) { - var seriesToMeasure = _.filter(seriesList, function(series) { - return series.options.indexOf('pgo') >= 0 || - (series.platform === 'osx-10-10' && - series.options.indexOf('opt') >= 0); - }); - $scope.platformList = _.uniq(_.map(seriesToMeasure, 'platform')); - // we just use the unadorned suite name to distinguish tests in this view - // (so we can mash together pgo and opt) - $scope.testList = _.uniq(_.map(seriesToMeasure, 'testName')); + PhSeries.getSeriesList( + $scope.selectedRepo.name, + { interval: $scope.selectedTimeRange.value, subtests: 0 }).then(function(seriesList) { + var seriesToMeasure = _.filter(seriesList, function(series) { + return series.options.indexOf('pgo') >= 0 || + (series.platform === 'osx-10-10' && + series.options.indexOf('opt') >= 0); + }); + $scope.platformList = _.uniq(_.map(seriesToMeasure, 'platform')); + // we just use the unadorned suite name to distinguish tests in this view + // (so we can mash together pgo and opt) + $scope.testList = _.uniq(_.map(seriesToMeasure, 'testName')); - $q.all(_.chunk(seriesToMeasure, 20).map(function(seriesChunk) { - var url = thServiceDomain + '/api/project/' + $scope.selectedRepo.name + - '/performance/data/?interval=' + $scope.selectedTimeRange.value + - _.map(seriesChunk, function(series) { - return "&signatures=" + series.signature; - }).join(""); - return $http.get(url).then(function(response) { - _.forIn(response.data, function(data, signature) { - var series = _.find(seriesChunk, { signature: signature }); - var type = (series.options.indexOf('e10s') >= 0) ? 'e10s' : 'base'; - resultsMap[type][signature] = { - platform: series.platform, - name: series.testName, - lowerIsBetter: series.lowerIsBetter, - hasSubTests: series.hasSubtests, - values: _.map(data, 'value') - }; - }); + $q.all(_.chunk(seriesToMeasure, 20).map(function(seriesChunk) { + var url = thServiceDomain + '/api/project/' + $scope.selectedRepo.name + + '/performance/data/?interval=' + $scope.selectedTimeRange.value + + _.map(seriesChunk, function(series) { + return "&signatures=" + series.signature; + }).join(""); + return $http.get(url).then(function(response) { + _.forIn(response.data, function(data, signature) { + var series = _.find(seriesChunk, { signature: signature }); + var type = (series.options.indexOf('e10s') >= 0) ? 'e10s' : 'base'; + resultsMap[type][signature] = { + platform: series.platform, + name: series.testName, + lowerIsBetter: series.lowerIsBetter, + hasSubTests: series.hasSubtests, + values: _.map(data, 'value') + }; }); - })).then(function() { - $scope.dataLoading = false; - $scope.testList.forEach(function(testName) { - $scope.titles[testName] = testName; - $scope.platformList.forEach(function(platform) { - var baseSig = _.find(Object.keys(resultsMap['base']), function(sig) { - return resultsMap['base'][sig].name === testName && - resultsMap['base'][sig].platform === platform; - }); - var e10sSig = _.find(Object.keys(resultsMap['e10s']), function(sig) { - return resultsMap['e10s'][sig].name === testName && - resultsMap['e10s'][sig].platform === platform; - }); - if (e10sSig && baseSig) { - var cmap = PhCompare.getCounterMap( - testName, resultsMap['base'][baseSig], - resultsMap['e10s'][e10sSig], blockers); - cmap.name = platform + ' ' + (platform === 'osx-10-10' ? 'opt' : 'pgo'); - cmap.links = [{ - title: 'graph', - href: 'perf.html#/graphs?' + _.map([baseSig, e10sSig], - function(sig) { - return 'series=[' + [ $scope.selectedRepo.name, sig, 1 ]; - }).join('&') + ']' - }]; - if (resultsMap['base'][baseSig].hasSubTests) { - var params = _.map([ - ['baseSignature', baseSig], - ['e10sSignature', e10sSig], - ['repo', $scope.selectedRepo.name], - ['timerange', $scope.selectedTimeRange.value] - ], function(kv) { return kv[0] + '=' + kv[1]; }).join('&'); - cmap.links.push({ - title: 'subtests', - href: 'perf.html#/e10s_comparesubtest?' + params - }); - } - if (!$scope.compareResults[testName]) { - $scope.compareResults[testName] = [cmap]; - } else { - $scope.compareResults[testName].push(cmap); - } - } + }); + })).then(function() { + $scope.dataLoading = false; + $scope.testList.forEach(function(testName) { + $scope.titles[testName] = testName; + $scope.platformList.forEach(function(platform) { + var baseSig = _.find(Object.keys(resultsMap['base']), function(sig) { + return resultsMap['base'][sig].name === testName && + resultsMap['base'][sig].platform === platform; }); + var e10sSig = _.find(Object.keys(resultsMap['e10s']), function(sig) { + return resultsMap['e10s'][sig].name === testName && + resultsMap['e10s'][sig].platform === platform; + }); + if (e10sSig && baseSig) { + var cmap = PhCompare.getCounterMap( + testName, resultsMap['base'][baseSig], + resultsMap['e10s'][e10sSig], blockers); + cmap.name = platform + ' ' + (platform === 'osx-10-10' ? 'opt' : 'pgo'); + cmap.links = [{ + title: 'graph', + href: 'perf.html#/graphs?' + _.map([baseSig, e10sSig], + function(sig) { + return 'series=[' + [ $scope.selectedRepo.name, sig, 1 ]; + }).join('&') + ']' + }]; + if (resultsMap['base'][baseSig].hasSubTests) { + var params = _.map([ + ['baseSignature', baseSig], + ['e10sSignature', e10sSig], + ['repo', $scope.selectedRepo.name], + ['timerange', $scope.selectedTimeRange.value] + ], function(kv) { return kv[0] + '=' + kv[1]; }).join('&'); + cmap.links.push({ + title: 'subtests', + href: 'perf.html#/e10s_comparesubtest?' + params + }); + } + if (!$scope.compareResults[testName]) { + $scope.compareResults[testName] = [cmap]; + } else { + $scope.compareResults[testName].push(cmap); + } + } }); }); }); - }); + }); } // set filter options @@ -194,10 +190,10 @@ perf.controller('e10sCtrl', [ perf.controller('e10sSubtestCtrl', [ '$state', '$stateParams', '$scope', '$rootScope', '$q', '$http', - 'ThRepositoryModel', 'ThOptionCollectionModel', 'PhSeries', 'PhCompare', + 'ThRepositoryModel', 'PhSeries', 'PhCompare', 'thServiceDomain', 'thDefaultRepo', 'phTimeRanges', 'e10sDefaultTimeRange', function($state, $stateParams, $scope, $rootScope, $q, $http, - ThRepositoryModel, ThOptionCollectionModel, PhSeries, PhCompare, thServiceDomain, + ThRepositoryModel, PhSeries, PhCompare, thServiceDomain, thDefaultRepo, phTimeRanges, e10sDefaultTimeRange) { var baseSignature = $stateParams.baseSignature; @@ -219,67 +215,66 @@ perf.controller('e10sSubtestCtrl', [ e10s: {}, base: {} }; - ThOptionCollectionModel.getMap().then(function(optionCollectionMap) { - // get base data - PhSeries.getSeriesList($scope.selectedRepo.name, { signature: baseSignature }, optionCollectionMap).then(function(seriesList) { - var summaryTestName = seriesList[0].platform + ": " + seriesList[0].test; - $scope.testList = [summaryTestName]; - $scope.titles[summaryTestName] = summaryTestName; - PhSeries.getSeriesList($scope.selectedRepo.name, { - interval: $scope.selectedTimeRange.value, - parent_signature: [ baseSignature, e10sSignature ] - }, optionCollectionMap).then(function(seriesList) { - return $q.all(_.chunk(seriesList, 20).map(function(seriesChunk) { - var url = thServiceDomain + '/api/project/' + $scope.selectedRepo.name + - '/performance/data/?interval=' + $scope.selectedTimeRange.value + - _.map(seriesChunk, function(series) { - return "&signatures=" + series.signature; - }).join(""); - return $http.get(url).then(function(response) { - _.forIn(response.data, function(data, signature) { - var series = _.find(seriesList, { signature: signature }); - var type = (series.options.indexOf('e10s') >= 0) ? 'e10s' : 'base'; - resultsMap[type][signature] = { - platform: series.platform, - suite: series.suite, - name: PhSeries.getTestName(series), - lowerIsBetter: series.lowerIsBetter, - values: _.map(data, 'value') - }; - }); + // get base data + PhSeries.getSeriesList($scope.selectedRepo.name, { signature: baseSignature }).then(function(seriesList) { + var summaryTestName = seriesList[0].platform + ": " + seriesList[0].test; + $scope.testList = [summaryTestName]; + $scope.titles[summaryTestName] = summaryTestName; + + PhSeries.getSeriesList($scope.selectedRepo.name, { + interval: $scope.selectedTimeRange.value, + parent_signature: [ baseSignature, e10sSignature ] + }).then(function(seriesList) { + return $q.all(_.chunk(seriesList, 20).map(function(seriesChunk) { + var url = thServiceDomain + '/api/project/' + $scope.selectedRepo.name + + '/performance/data/?interval=' + $scope.selectedTimeRange.value + + _.map(seriesChunk, function(series) { + return "&signatures=" + series.signature; + }).join(""); + return $http.get(url).then(function(response) { + _.forIn(response.data, function(data, signature) { + var series = _.find(seriesList, { signature: signature }); + var type = (series.options.indexOf('e10s') >= 0) ? 'e10s' : 'base'; + resultsMap[type][signature] = { + platform: series.platform, + suite: series.suite, + name: PhSeries.getTestName(series), + lowerIsBetter: series.lowerIsBetter, + values: _.map(data, 'value') + }; }); - })).then(function() { - $scope.dataLoading = false; - var subtestNames = _.map(resultsMap['base'], function(results, signature) { - return results.name; + }); + })).then(function() { + $scope.dataLoading = false; + var subtestNames = _.map(resultsMap['base'], function(results, signature) { + return results.name; + }); + _.forEach(subtestNames, function(subtestName) { + var baseSig = _.find(Object.keys(resultsMap['base']), function (sig) { + return resultsMap['base'][sig].name === subtestName; }); - _.forEach(subtestNames, function(subtestName) { - var baseSig = _.find(Object.keys(resultsMap['base']), function (sig) { - return resultsMap['base'][sig].name === subtestName; - }); - var e10sSig = _.find(Object.keys(resultsMap['e10s']), function (sig) { - return resultsMap['e10s'][sig].name === subtestName; - }); - if (e10sSig && baseSig) { - var cmap = PhCompare.getCounterMap( - subtestName, resultsMap['base'][baseSig], - resultsMap['e10s'][e10sSig]); - cmap.name = subtestName; - cmap.links = [{ - title: 'graph', - href: 'perf.html#/graphs?' + _.map([baseSig, e10sSig], - function(sig) { - return 'series=[' + [ $scope.selectedRepo.name, sig, 1 ]; - }).join('&') + ']' - }]; - if (!$scope.compareResults[summaryTestName]) { - $scope.compareResults[summaryTestName] = [cmap]; - } else { - $scope.compareResults[summaryTestName].push(cmap); - } - } + var e10sSig = _.find(Object.keys(resultsMap['e10s']), function (sig) { + return resultsMap['e10s'][sig].name === subtestName; }); + if (e10sSig && baseSig) { + var cmap = PhCompare.getCounterMap( + subtestName, resultsMap['base'][baseSig], + resultsMap['e10s'][e10sSig]); + cmap.name = subtestName; + cmap.links = [{ + title: 'graph', + href: 'perf.html#/graphs?' + _.map([baseSig, e10sSig], + function(sig) { + return 'series=[' + [ $scope.selectedRepo.name, sig, 1 ]; + }).join('&') + ']' + }]; + if (!$scope.compareResults[summaryTestName]) { + $scope.compareResults[summaryTestName] = [cmap]; + } else { + $scope.compareResults[summaryTestName].push(cmap); + } + } }); }); }); diff --git a/ui/js/controllers/perf/graphs.js b/ui/js/controllers/perf/graphs.js index 52ade6626bc..61f8b03f4ee 100644 --- a/ui/js/controllers/perf/graphs.js +++ b/ui/js/controllers/perf/graphs.js @@ -3,12 +3,11 @@ perf.controller('GraphsCtrl', [ '$state', '$stateParams', '$scope', '$rootScope', '$location', '$uibModal', 'thServiceDomain', '$http', '$q', '$timeout', 'PhSeries', 'PhAlerts', - 'ThRepositoryModel', 'ThOptionCollectionModel', 'ThResultSetModel', - 'phTimeRanges', 'phDefaultTimeRangeValue', + 'ThRepositoryModel', 'ThResultSetModel', 'phTimeRanges', 'phDefaultTimeRangeValue', function GraphsCtrl($state, $stateParams, $scope, $rootScope, $location, $uibModal, thServiceDomain, $http, $q, $timeout, PhSeries, - PhAlerts, ThRepositoryModel, ThOptionCollectionModel, - ThResultSetModel, phTimeRanges, phDefaultTimeRangeValue) { + PhAlerts, ThRepositoryModel, ThResultSetModel, + phTimeRanges, phDefaultTimeRangeValue) { var availableColors = [ 'red', 'green', 'blue', 'orange', 'purple' ]; $scope.highlightedRevisions = [ undefined, undefined ]; @@ -587,34 +586,30 @@ perf.controller('GraphsCtrl', [ function addSeriesList(partialSeriesList) { var propsHash = {}; - return ThOptionCollectionModel.getMap().then(function(optionCollectionMap) { - return $q.all(partialSeriesList.map(function(partialSeries) { - return PhSeries.getSeriesList( - partialSeries.project, - { signature: partialSeries.signature }, - optionCollectionMap).then(function(seriesList) { - console.log(seriesList); - if (!seriesList.length) { - return $q.reject("Signature `" + partialSeries.signature + - "` not found for " + partialSeries.project); - } - var seriesSummary = seriesList[0]; - seriesSummary.projectName = partialSeries.project; - seriesSummary.visible = partialSeries.visible; - seriesSummary.color = availableColors.pop(); - seriesSummary.highlighted = partialSeries.highlighted; - $scope.seriesList.push(seriesSummary); - }); - })).then(function() { - $q.all($scope.seriesList.map(getSeriesData)).then(function() { - plotGraph(); - updateDocumentTitle(); - if ($scope.selectedDataPoint) { - showTooltip($scope.selectedDataPoint); + return $q.all(partialSeriesList.map(function(partialSeries) { + return PhSeries.getSeriesList( + partialSeries.project, + { signature: partialSeries.signature }).then(function(seriesList) { + if (!seriesList.length) { + return $q.reject("Signature `" + partialSeries.signature + + "` not found for " + partialSeries.project); } + var seriesSummary = seriesList[0]; + seriesSummary.projectName = partialSeries.project; + seriesSummary.visible = partialSeries.visible; + seriesSummary.color = availableColors.pop(); + seriesSummary.highlighted = partialSeries.highlighted; + $scope.seriesList.push(seriesSummary); }); - }, function(error) { - alert("Error loading performance signature\n\n" + error); + }, function(error) { + alert("Error loading performance signature\n\n" + error); + })).then(function() { + $q.all($scope.seriesList.map(getSeriesData)).then(function() { + plotGraph(); + updateDocumentTitle(); + if ($scope.selectedDataPoint) { + showTooltip($scope.selectedDataPoint); + } }); }, function(error) { if (error.statusText) { @@ -749,68 +744,64 @@ perf.controller('GraphsCtrl', [ }; $scope.selectedDataPoint = (tooltipString) ? tooltip : null; } - ThOptionCollectionModel.getMap().then(function(optionCollectionMap) { - $scope.addTestData = function(option, seriesSignature) { - var defaultProjectName, defaultPlatform; - var options = {}; - if ($scope.seriesList.length > 0) { - var lastSeries = $scope.seriesList.slice(-1)[0]; - defaultProjectName = lastSeries.projectName; - defaultPlatform = lastSeries.platform; - } - if (option !== undefined) { - var series = _.findWhere($scope.seriesList, {"signature": seriesSignature}); - options = { option: option, relatedSeries: series }; + $scope.addTestData = function(option, seriesSignature) { + var defaultProjectName, defaultPlatform; + var options = {}; + if ($scope.seriesList.length > 0) { + var lastSeries = $scope.seriesList.slice(-1)[0]; + defaultProjectName = lastSeries.projectName; + defaultPlatform = lastSeries.platform; + } + + if (option !== undefined) { + var series = _.findWhere($scope.seriesList, {"signature": seriesSignature}); + options = { option: option, relatedSeries: series }; + } + + var modalInstance = $uibModal.open({ + templateUrl: 'partials/perf/testdatachooser.html', + controller: 'TestChooserCtrl', + size: 'lg', + resolve: { + projects: function() { + return $rootScope.repos; + }, + timeRange: function() { + return $scope.myTimerange.value; + }, + testsDisplayed: function() { + return $scope.seriesList; + }, + defaultProjectName: function() { return defaultProjectName; }, + defaultPlatform: function() { return defaultPlatform; }, + options: function() { return options; } } + }); - var modalInstance = $uibModal.open({ - templateUrl: 'partials/perf/testdatachooser.html', - controller: 'TestChooserCtrl', - size: 'lg', - resolve: { - projects: function() { - return $rootScope.repos; - }, - optionCollectionMap: function() { - return optionCollectionMap; - }, - timeRange: function() { - return $scope.myTimerange.value; - }, - testsDisplayed: function() { - return $scope.seriesList; - }, - defaultProjectName: function() { return defaultProjectName; }, - defaultPlatform: function() { return defaultPlatform; }, - options: function() { return options; } - } - }); + modalInstance.opened.then(function () { + window.setTimeout(function () { modalInstance.updateTestInput(); }, 0); + }); - modalInstance.opened.then(function () { - window.setTimeout(function () { modalInstance.updateTestInput(); }, 0); + modalInstance.result.then(function(seriesList) { + seriesList.forEach(function(series) { + series.hightlightedPoints = []; + series.visible = true; + series.color = availableColors.pop(); + $scope.seriesList.push(series); }); - - modalInstance.result.then(function(seriesList) { - seriesList.forEach(function(series) { - series.hightlightedPoints = []; - series.visible = true; - series.color = availableColors.pop(); - $scope.seriesList.push(series); - }); - if (!$scope.highlightedRevision) { - $scope.highlightedRevision = ''; - } - if (!$scope.zoom) { - $scope.zoom = {}; - } - updateDocument(); - $q.all($scope.seriesList.map(getSeriesData)).then(function() { - plotGraph(); - }); + if (!$scope.highlightedRevision) { + $scope.highlightedRevision = ''; + } + if (!$scope.zoom) { + $scope.zoom = {}; + } + updateDocument(); + $q.all($scope.seriesList.map(getSeriesData)).then(function() { + plotGraph(); }); - }; - }); + }); + }; }); }]); @@ -834,8 +825,7 @@ perf.filter('testNameContainsWords', function() { }); perf.controller('TestChooserCtrl', function($scope, $uibModalInstance, $http, - projects, optionCollectionMap, - timeRange, thServiceDomain, + projects, timeRange, thServiceDomain, thDefaultRepo, PhSeries, defaultProjectName, defaultPlatform, $q, testsDisplayed, options, thPerformanceBranches) { @@ -911,8 +901,7 @@ perf.controller('TestChooserCtrl', function($scope, $uibModalInstance, $http, var loadingExtraDataPromise = $q.defer(); var addRelatedPlatforms = function(originalSeries) { PhSeries.getSeriesList( - originalSeries.projectName, { interval: $scope.timeRange }, - optionCollectionMap).then(function(seriesList) { + originalSeries.projectName, { interval: $scope.timeRange }).then(function(seriesList) { $scope.testsToAdd = _.clone(_.filter(seriesList, function(series) { return series.platform !== originalSeries.platform && series.name === originalSeries.name; @@ -937,7 +926,7 @@ perf.controller('TestChooserCtrl', function($scope, $uibModalInstance, $http, return PhSeries.getSeriesList(project.name, { interval: $scope.timeRange, signature: originalSeries.signature - }, optionCollectionMap); + }); })).then(function(series) { if (series.length > 0) { $scope.testToAdd.push(_.clone(series[0])); @@ -988,8 +977,7 @@ perf.controller('TestChooserCtrl', function($scope, $uibModalInstance, $http, } PhSeries.getSeriesList( $scope.selectedProject.name, - { interval: $scope.timeRange, platform: $scope.selectedPlatform }, - optionCollectionMap).then(function(seriesList) { + { interval: $scope.timeRange, platform: $scope.selectedPlatform }).then(function(seriesList) { $scope.unselectedTestList = _.sortBy( _.filter(seriesList, { platform: $scope.selectedPlatform }), 'name'); diff --git a/ui/js/perf.js b/ui/js/perf.js index 49c9a434868..db9adefa1e2 100644 --- a/ui/js/perf.js +++ b/ui/js/perf.js @@ -2,7 +2,7 @@ var perf = angular.module("perf", ['ui.router', 'ui.bootstrap', 'treeherder']); -treeherder.factory('PhSeries', ['$http', 'thServiceDomain', function($http, thServiceDomain) { +treeherder.factory('PhSeries', ['$http', 'thServiceDomain', 'ThOptionCollectionModel', function($http, thServiceDomain, ThOptionCollectionModel) { var _getTestName = function(signatureProps, displayOptions) { var suiteName = signatureProps.suite; @@ -92,12 +92,14 @@ treeherder.factory('PhSeries', ['$http', 'thServiceDomain', function($http, thSe return { getTestName: _getTestName, getSeriesName: _getSeriesName, - getSeriesList: function(projectName, filterOptions, optionMap) { - return _getSignatures(projectName, filterOptions).then(function(response) { - return _.map(response.data, function(signatureProps, signature) { - return _getSeriesSummary(projectName, signature, - signatureProps, - optionMap); + getSeriesList: function(projectName, filterOptions) { + return ThOptionCollectionModel.getMap().then(function(optionCollectionMap) { + return _getSignatures(projectName, filterOptions).then(function(response) { + return _.map(response.data, function(signatureProps, signature) { + return _getSeriesSummary(projectName, signature, + signatureProps, + optionCollectionMap); + }); }); }); },