From 387914cc8ae9fdf22932081ac6df017fc17ee37f Mon Sep 17 00:00:00 2001
From: Leo Gordon <lg4@ebi.ac.uk>
Date: Wed, 11 Jun 2014 17:04:39 +0100
Subject: [PATCH] attempt to re-introduce the Workers that have never
 specialized and therefore do not have a real analysis_id, yet have claimed
 resources and so should influence the stats

---
 scripts/generate_timeline.pl | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/scripts/generate_timeline.pl b/scripts/generate_timeline.pl
index dcb906cbd..23643b40b 100755
--- a/scripts/generate_timeline.pl
+++ b/scripts/generate_timeline.pl
@@ -135,14 +135,9 @@ sub main {
     }
 
     # Get the info about the analysis
-    my %default_resource_class = ();
-    my %analysis_name = ();
-    {
-        foreach my $analysis (@{$hive_dba->get_AnalysisAdaptor->fetch_all()}) {
-            $analysis_name{$analysis->dbID} = $analysis->logic_name;
-            $default_resource_class{$analysis->dbID} = $analysis->resource_class_id;
-        }
-    }
+    my $analysis_adaptor        = $hive_dba->get_AnalysisAdaptor;
+    my %analysis_name           = %{ $analysis_adaptor->fetch_HASHED_FROM_analysis_id_TO_logic_name() };
+    my %default_resource_class  = %{ $analysis_adaptor->fetch_HASHED_FROM_analysis_id_TO_resource_class_id() };
     warn "default_resource_class: ", Dumper \%default_resource_class if $verbose;
     warn "analysis_name: ", Dumper \%analysis_name if $verbose;
     warn scalar(keys %analysis_name), " analysis\n" if $verbose;
@@ -150,16 +145,23 @@ sub main {
     # Get the events from the database
     my %events = ();
     if ($mode ne 'pending_workers') {
-        my @tmp_dates = @{$dbh->selectall_arrayref('SELECT when_started, when_finished, analysis_id, worker_id FROM role JOIN worker USING (worker_id)')};
+        my @tmp_dates = @{$dbh->selectall_arrayref('SELECT when_started, when_finished, born, died, analysis_id, worker_id, resource_class_id FROM worker LEFT JOIN role USING (worker_id)')};
         warn scalar(@tmp_dates), " events\n" if $verbose;
 
         foreach my $db_entry (@tmp_dates) {
-            my ($when_started, $when_finished, $analysis_id, $worker_id, $resource_class_id) = @$db_entry;
-            $resource_class_id //= $default_resource_class{$analysis_id};
+            my ($when_started, $when_finished, $born, $died, $analysis_id, $worker_id, $resource_class_id) = @$db_entry;
+            unless($analysis_id) {  # in case there was no Role attached to the Worker - i.e. it has never specialized
+                $when_started               = $born;
+                $when_finished              = $died;
+                $analysis_id                = 0;
+                $analysis_name{0}           = 'UNSPECIALIZED';
+                $default_resource_class{0}  = 'UNKNOWN';
+            }
+            $resource_class_id  //= $default_resource_class{$analysis_id};
 
                 # temporary Time::Piece values
-            my $birth_datetime = Time::Piece->strptime( $when_started,  '%Y-%m-%d %H:%M:%S');
-            my $death_datetime = Time::Piece->strptime( $when_finished, '%Y-%m-%d %H:%M:%S');
+            my $birth_datetime = Time::Piece->strptime( $when_started  , '%Y-%m-%d %H:%M:%S');
+            my $death_datetime = Time::Piece->strptime( $when_finished , '%Y-%m-%d %H:%M:%S');
 
                 # string values:
             my $birth_date = $birth_datetime->date . 'T' . $birth_datetime->hms;
@@ -182,11 +184,11 @@ sub main {
                     $offset = ($cpu_resources{$resource_class_id} || $default_cores) - $used_res{$worker_id}->[1];
                 }
             }
-            $events{$birth_date}{$analysis_id} += $offset if $offset > 0;
-            $events{$death_date}{$analysis_id} -= $offset if ($offset > 0) and $death_date;
+            $events{$birth_date}{$analysis_id} += $offset if ($offset > 0);
+            $events{$death_date}{$analysis_id} -= $offset if ($offset > 0 and $when_finished);
         }
     } else {
-        my @tmp_dates = @{$dbh->selectall_arrayref('SELECT min(when_started), pending_sec, analysis_id FROM role JOIN worker_resource_usage USING (worker_id) WHERE pending_sec IS NOT NULL AND pending_sec > 0 GROUP BY worker_id')};
+        my @tmp_dates = @{$dbh->selectall_arrayref('SELECT min(when_started), pending_sec, analysis_id FROM role LEFT JOIN worker_resource_usage USING (worker_id) WHERE pending_sec IS NOT NULL AND pending_sec > 0 GROUP BY worker_id')};
         warn scalar(@tmp_dates), " events\n" if $verbose;
 
         foreach my $db_entry (@tmp_dates) {
-- 
GitLab