From 6cf4f2ae9f03543e273759c41531bb3faa3585da Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Fri, 18 Dec 2015 17:37:09 -0500 Subject: [PATCH] Properly display missing data in run graphs This commit fixes the display of missing run data on the run stat graphs. Previously d3 would interpolate between any 2 consecutive data points regardless if there were missing samples between them. In an earlier commit we updated the rest api to return an empty list for samples that have no data. This commit builds off of that and treats those empty lists as 0 for all values in that timestamp. Change-Id: I137e4cfa1f22aaf2d932aa3d3420ebd841abca43 --- app/js/controllers/home.js | 20 ++++++++++++++++---- app/js/services/projects.js | 10 ++++++++++ test/unit/controllers/home_spec.js | 3 ++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app/js/controllers/home.js b/app/js/controllers/home.js index 698b9afc..d2e345a2 100644 --- a/app/js/controllers/home.js +++ b/app/js/controllers/home.js @@ -12,10 +12,15 @@ function HomeController(healthService, startDate, projectService) { return project2.metrics.failRate - project1.metrics.failRate; }; + var byDate = function(entryA, entryB) { + return entryA.x - entryB.x; + }; + var processData = function(data) { var projects = projectService.createProjects(data.runs); + var blanks = projectService.findBlanks(data.runs); var dateStats = projectService.getStatsByDate(projects); - var entries = getChartEntries(dateStats); + var entries = getChartEntries(dateStats, blanks); vm.chartData = [ { key: 'Passes', values: entries.passes, color: "blue" }, @@ -27,15 +32,22 @@ function HomeController(healthService, startDate, projectService) { .map(function(project) { return generateGaugeData(project); }); }; - var getChartEntries = function(dateStats) { + var getChartEntries = function(dateStats, blanks) { var entries = { passes: [], failures: [], failRate: [] }; - + angular.forEach(blanks, function(date) { + var tempDate = new Date(date); + entries.passes.push(generateChartData(tempDate, 0)); + entries.failures.push(generateChartData(tempDate, 0)); + entries.failRate.push(generateChartData(tempDate, 0)); + }); angular.forEach(dateStats, function(stats) { entries.passes.push(generateChartData(stats.date, stats.metrics.passes)); entries.failures.push(generateChartData(stats.date, stats.metrics.failures)); entries.failRate.push(generateChartData(stats.date, stats.metrics.failRate)); }); - + entries.passes = entries.passes.sort(byDate); + entries.failures = entries.failures.sort(byDate); + entries.failRate = entries.failRate.sort(byDate); return entries; }; diff --git a/app/js/services/projects.js b/app/js/services/projects.js index 4252c690..81c2f312 100644 --- a/app/js/services/projects.js +++ b/app/js/services/projects.js @@ -26,6 +26,16 @@ var projectService = function(projectFactory, metricsService) { return { date: date, metrics: metricsService.getNewMetrics() }; }; + service.findBlanks = function(runsJson) { + var blanks = []; + angular.forEach(runsJson, function(projectsJson, dateString) { + if (typeof projectsJson == 'undefined' || projectsJson.length == 0) { + blanks.push(dateString); + } + }); + return blanks; + }; + service.createProjects = function(runsJson) { var projects = []; var index = {}; diff --git a/test/unit/controllers/home_spec.js b/test/unit/controllers/home_spec.js index d0bb1f79..a3ec8abd 100644 --- a/test/unit/controllers/home_spec.js +++ b/test/unit/controllers/home_spec.js @@ -31,7 +31,8 @@ describe('HomeController', function() { }; projectService = { createProjects: function() { return []; }, - getStatsByDate: function() { return []; } + getStatsByDate: function() { return []; }, + findBlanks: function() { return []; } }; homeController = $controller('HomeController', {