3187: Tested and fixed and time calculation algorithm.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 11 Sep 2014 15:57:12 +0000 (11:57 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 11 Sep 2014 15:57:12 +0000 (11:57 -0400)
apps/workbench/app/helpers/pipeline_instances_helper.rb
apps/workbench/test/controllers/pipeline_instances_controller_test.rb [new file with mode: 0644]
apps/workbench/test/unit/determine_time_test.rb [deleted file]

index 2db463c6cb6be7d217547c4c69cb641a59ad8b41..a17f125aa68fd40082d253348666433a063007fd 100644 (file)
@@ -22,6 +22,56 @@ module PipelineInstancesHelper
     pj
   end
 
+  def merge_range timestamps, started_at, finished_at
+    timestamps.each_index do |i|
+      if started_at
+        if started_at >= timestamps[i][0] and finished_at <= timestamps[i][1]
+          # 'j' started and ended during 'i'
+          return timestamps
+        end
+
+        if started_at < timestamps[i][0] and finished_at >= timestamps[i][0] and finished_at <= timestamps[i][1]
+          # 'j' started before 'i' and finished during 'i'
+          # re-merge range between when 'j' started and 'i' finished
+          finished_at = timestamps[i][1]
+          timestamps.delete_at i
+          return merge_range timestamps, started_at, finished_at
+        end
+
+        if started_at >= timestamps[i][0] and started_at <= timestamps[i][1]
+          # 'j' started during 'i' and finished sometime after
+          # move end time of 'i' back
+          # re-merge range between when 'i' started and 'j' finished
+          started_at = timestamps[i][0]
+          timestamps.delete_at i
+          return merge_range timestamps, started_at, finished_at
+        end
+
+        if finished_at < timestamps[i][0]
+          # 'j' finished before 'i' started, so insert before 'i'
+          timestamps.insert i, [started_at, finished_at]
+          return timestamps
+        end
+      end
+    end
+
+    timestamps << [started_at, finished_at]
+  end
+
+  def determine_wallclock_runtime jobs
+    puts "Begin #{jobs}"
+    timestamps = []
+    jobs.each do |j|
+      insert_at = 0
+      started_at = j[:started_at]
+      finished_at = (if j[:finished_at] then j[:finished_at] else Time.now end)
+      if started_at
+        timestamps = merge_range timestamps, started_at, finished_at
+      end
+    end
+    timestamps.map { |t| t[1] - t[0] }.reduce(:+)
+  end
+
   protected
 
   def pipeline_jobs_newschool object
@@ -186,54 +236,4 @@ module PipelineInstancesHelper
     s
   end
 
-  def determine_wallclock_runtime jobs
-    timestamps = []
-    jobs.each do |j|
-      insert_at = 0
-      timestamps.each_index do |i|
-        if started_at = j[:started_at]
-          finished_at = (if j[:finished_at] then j[:finished_at] else Time.now end)
-
-          if started_at >= timestamps[i][0] and finished_at <= timestamps[i][1]
-            # 'j' started and ended during 'i'
-            insert_at = -1
-            break
-          end
-
-          if started_at < timestamps[i][0] and finished_at >= timestamps[i][0] and finished_at <= timestamps[i][1]
-            # 'j' started before 'i' and ended during 'i'
-            # move start time of 'i' back
-            timestamps[i][0] = started_at
-            insert_at = -1
-            break
-          end
-
-          if started_at >= timestamps[i][0] and started_at <= timestamps[i][1]
-            # 'j' started during 'i'
-            # move end time of 'i' back
-            timestamps[i][1] = finished_at
-            insert_at = -1
-            break
-          end
-
-          if finished_at < timestamps[i][0]
-            # 'j' finished before 'i' started, so insert before 'i'
-            insert_at = i
-            break
-          end
-
-          if started_at > timestamps[i][1]
-            # 'j' started after 'i' finished, so insert after 'i'
-            insert_at = i
-            break
-          end
-
-        end
-      end
-      if insert_at > -1
-        timestamps.insert insert_at, [started_at, finished_at]
-      end
-    end
-    timestamps.map { |t| t[1] - t[0] }.reduce(:+)
-  end
 end
diff --git a/apps/workbench/test/controllers/pipeline_instances_controller_test.rb b/apps/workbench/test/controllers/pipeline_instances_controller_test.rb
new file mode 100644 (file)
index 0000000..d9f915b
--- /dev/null
@@ -0,0 +1,40 @@
+require 'test_helper'
+
+class PipelineInstancesControllerTest < ActionController::TestCase
+  include PipelineInstancesHelper
+
+  test "one" do
+    r = [{started_at: 1, finished_at: 3}]
+    assert_equal 2, determine_wallclock_runtime(r)
+
+    r = [{started_at: 1, finished_at: 5}]
+    assert_equal 4, determine_wallclock_runtime(r)
+
+    r = [{started_at: 1, finished_at: 2}, {started_at: 3, finished_at: 5}]
+    assert_equal 3, determine_wallclock_runtime(r)
+
+    r = [{started_at: 3, finished_at: 5}, {started_at: 1, finished_at: 2}]
+    assert_equal 3, determine_wallclock_runtime(r)
+
+    r = [{started_at: 3, finished_at: 5}, {started_at: 1, finished_at: 2},
+         {started_at: 2, finished_at: 4}]
+    assert_equal 4, determine_wallclock_runtime(r)
+
+    r = [{started_at: 1, finished_at: 5}, {started_at: 2, finished_at: 3}]
+    assert_equal 4, determine_wallclock_runtime(r)
+
+    r = [{started_at: 3, finished_at: 5}, {started_at: 1, finished_at: 4}]
+    assert_equal 4, determine_wallclock_runtime(r)
+
+    r = [{started_at: 1, finished_at: 4}, {started_at: 3, finished_at: 5}]
+    assert_equal 4, determine_wallclock_runtime(r)
+
+    r = [{started_at: 1, finished_at: 4}, {started_at: 3, finished_at: 5},
+         {started_at: 5, finished_at: 8}]
+    assert_equal 7, determine_wallclock_runtime(r)
+
+    r = [{started_at: 1, finished_at: 4}, {started_at: 3, finished_at: 5},
+         {started_at: 6, finished_at: 8}]
+    assert_equal 6, determine_wallclock_runtime(r)
+  end
+end
diff --git a/apps/workbench/test/unit/determine_time_test.rb b/apps/workbench/test/unit/determine_time_test.rb
deleted file mode 100644 (file)
index 1243221..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-require 'test_helper'
-
-class DetermineTimeTest < ActiveSupport::TestCase
-  test "one" do
-    r1 = [{started_at: 1, finished_at: 3}]
-    assert_equal 2, determine_wallclock_runtime(r1)
-  end
-end