X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/4e92e5890ae7b44545052db029863e886a36cc79..324dc9f33d95cdeacf23c0570607900be945d20f:/apps/workbench/app/controllers/pipeline_instances_controller.rb diff --git a/apps/workbench/app/controllers/pipeline_instances_controller.rb b/apps/workbench/app/controllers/pipeline_instances_controller.rb index 507131f8eb..42cb2e9d44 100644 --- a/apps/workbench/app/controllers/pipeline_instances_controller.rb +++ b/apps/workbench/app/controllers/pipeline_instances_controller.rb @@ -3,6 +3,66 @@ class PipelineInstancesController < ApplicationController before_filter :find_objects_by_uuid, only: :compare include PipelineInstancesHelper + def graph(pipelines) + count = {} + provenance = {} + pips = {} + n = 1 + + pipelines.each do |p| + collections = [] + + p.components.each do |k, v| + j = v[:job] || next + + uuid = j[:uuid].intern + provenance[uuid] = j + pips[uuid] = 0 unless pips[uuid] != nil + pips[uuid] |= n + + collections << j[:output] + ProvenanceHelper::find_collections(j[:script_parameters]).each do |k| + collections << k + end + + uuid = j[:script_version].intern + provenance[uuid] = {:uuid => uuid} + pips[uuid] = 0 unless pips[uuid] != nil + pips[uuid] |= n + end + + Collection.where(uuid: collections.compact).each do |c| + uuid = c.uuid.intern + provenance[uuid] = c + pips[uuid] = 0 unless pips[uuid] != nil + pips[uuid] |= n + end + + n = n << 1 + end + + return provenance, pips + end + + def show + @pipelines = [@object] + + if params[:compare] + PipelineInstance.where(uuid: params[:compare]).each do |p| + @pipelines << p + end + end + + provenance, pips = graph(@pipelines) + + @prov_svg = ProvenanceHelper::create_provenance_graph provenance, "provenance_svg", { + :all_script_parameters => true, + :combine_jobs => :script_and_version, + :script_version_nodes => true, + :pips => pips } + super + end + def compare @breadcrumb_page_name = 'compare' @@ -35,10 +95,11 @@ class PipelineInstancesController < ApplicationController highscore = {} # attr => how common "normal" is score = {} # attr => { value => how common } row[:components].each do |pj| + next if pj.nil? pj.each do |k,v| vstr = for_comparison v score[k] ||= {} - score[k][vstr] = (score[k][vstr.to_s] || 0) + 1 + score[k][vstr] = (score[k][vstr] || 0) + 1 highscore[k] ||= 0 if score[k][vstr] == highscore[k] # tie for first place = no "normal" @@ -53,14 +114,33 @@ class PipelineInstancesController < ApplicationController # Add a hash in component[:is_normal]: { attr => is_the_value_normal? } row[:components].each do |pj| + next if pj.nil? pj[:is_normal] = {} pj.each do |k,v| pj[:is_normal][k] = (normal.has_key?(k) && normal[k] == for_comparison(v)) end end end + + provenance, pips = graph(@objects) + + @pipelines = @objects + + @prov_svg = ProvenanceHelper::create_provenance_graph provenance, "provenance_svg", { + :all_script_parameters => true, + :combine_jobs => :script_and_version, + :script_version_nodes => true, + :pips => pips } end + def show_pane_list + %w(Components Graph Attributes Metadata JSON API) + end + + def compare_pane_list + %w(Compare Graph) + end + protected def for_comparison v if v.is_a? Hash or v.is_a? Array @@ -71,7 +151,7 @@ class PipelineInstancesController < ApplicationController end def find_objects_by_uuid - @objects = model_class.where(uuid: params[:uuid].split('/')) + @objects = model_class.where(uuid: params[:uuids]) end end