3187: Added algorithm to calculate wall clock run time from a set of overlapping...
authorPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 11 Sep 2014 12:57:55 +0000 (08:57 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 11 Sep 2014 12:57:55 +0000 (08:57 -0400)
apps/workbench/app/helpers/pipeline_instances_helper.rb
apps/workbench/test/unit/determine_time_test.rb [new file with mode: 0644]

index d2b3a850f7d785111f121635fe8618e00255ec97..2db463c6cb6be7d217547c4c69cb641a59ad8b41 100644 (file)
@@ -185,4 +185,55 @@ module PipelineInstancesHelper
     end
     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/unit/determine_time_test.rb b/apps/workbench/test/unit/determine_time_test.rb
new file mode 100644 (file)
index 0000000..1243221
--- /dev/null
@@ -0,0 +1,8 @@
+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