From a0fc519db4f3664366c356d21a8478495f2ae78b Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Thu, 11 Sep 2014 11:57:12 -0400 Subject: [PATCH] 3187: Tested and fixed and time calculation algorithm. --- .../app/helpers/pipeline_instances_helper.rb | 100 +++++++++--------- .../pipeline_instances_controller_test.rb | 40 +++++++ .../test/unit/determine_time_test.rb | 8 -- 3 files changed, 90 insertions(+), 58 deletions(-) create mode 100644 apps/workbench/test/controllers/pipeline_instances_controller_test.rb delete mode 100644 apps/workbench/test/unit/determine_time_test.rb diff --git a/apps/workbench/app/helpers/pipeline_instances_helper.rb b/apps/workbench/app/helpers/pipeline_instances_helper.rb index 2db463c6cb..a17f125aa6 100644 --- a/apps/workbench/app/helpers/pipeline_instances_helper.rb +++ b/apps/workbench/app/helpers/pipeline_instances_helper.rb @@ -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 index 0000000000..d9f915bc90 --- /dev/null +++ b/apps/workbench/test/controllers/pipeline_instances_controller_test.rb @@ -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 index 1243221997..0000000000 --- a/apps/workbench/test/unit/determine_time_test.rb +++ /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 -- 2.30.2