end
def self.collection_uuid(uuid)
- m = /^([a-f0-9]{32}(\+[0-9]+)?)(\+.*)?$/.match(uuid.to_s)
+ m = CollectionsHelper.match(uuid)
if m
- #if m[2]
- return m[1]
- #else
+ if m[2]
+ return m[1]+m[2]
+ else
+ return m[1]
+ end
# Collection.where(uuid: ['contains', m[1]]).each do |u|
# puts "fixup #{uuid} to #{u.uuid}"
# return u.uuid
end
def determine_fillcolor(n)
- bgcolor = ""
- case n
- when 1
- bgcolor = "style=filled,fillcolor=\"#88ff88\""
- when 2
- bgcolor = "style=filled,fillcolor=\"#8888ff\""
- when 3
- bgcolor = "style=filled,fillcolor=\"#88ffff\""
- end
- bgcolor
+ fillcolor = %w(aaaaaa aaffaa aaaaff aaaaaa ffaaaa)[n || 0] || 'aaaaaa'
+ "style=filled,fillcolor=\"##{fillcolor}\""
end
def describe_node(uuid)
#"\"#{uuid}\" [label=\"#{rsc}\\n#{uuid}\",href=\"#{href}\"];\n"
if rsc == Collection
+ #puts uuid
+ if uuid == :"d41d8cd98f00b204e9800998ecf8427e+0"
+ # special case
+ #puts "empty!"
+ return "\"#{uuid}\" [label=\"(empty collection)\"];\n"
+ end
if @pdata[uuid]
#puts @pdata[uuid]
if @pdata[uuid][:name]
def script_param_edges(job, prefix, sp)
gr = ""
- if sp and not sp.empty?
- case sp
- when Hash
- sp.each do |k, v|
- if prefix.size > 0
- k = prefix + "::" + k.to_s
- end
- gr += script_param_edges(job, k.to_s, v)
- end
- when Array
- i = 0
- node = ""
- sp.each do |v|
- if GenerateGraph::collection_uuid(v)
- gr += script_param_edges(job, "#{prefix}[#{i}]", v)
- else
- node += "', '" unless node == ""
- node = "['" if node == ""
- node += "#{v}"
- end
- i += 1
- end
- unless node == ""
- node += "']"
- #puts node
- #id = "#{job[:uuid]}_#{prefix}"
- gr += "\"#{node}\" [label=\"#{node}\"];\n"
- gr += edge(job_uuid(job), node, {:label => prefix})
+ case sp
+ when Hash
+ sp.each do |k, v|
+ if prefix.size > 0
+ k = prefix + "::" + k.to_s
end
- else
- m = GenerateGraph::collection_uuid(sp)
- if m
- gr += edge(job_uuid(job), m, {:label => prefix})
- gr += generate_provenance_edges(m)
+ gr += script_param_edges(job, k.to_s, v)
+ end
+ when Array
+ i = 0
+ node = ""
+ sp.each do |v|
+ if GenerateGraph::collection_uuid(v)
+ gr += script_param_edges(job, "#{prefix}[#{i}]", v)
elsif @opts[:all_script_parameters]
- #id = "#{job[:uuid]}_#{prefix}"
- gr += "\"#{sp}\" [label=\"#{sp}\"];\n"
- gr += edge(job_uuid(job), sp, {:label => prefix})
+ node += "', '" unless node == ""
+ node = "['" if node == ""
+ node += "#{v}"
end
+ i += 1
+ end
+ unless node == ""
+ node += "']"
+ #puts node
+ #id = "#{job[:uuid]}_#{prefix}"
+ gr += "\"#{node}\" [label=\"#{node}\"];\n"
+ gr += edge(job_uuid(job), node, {:label => prefix})
+ end
+ when String
+ return '' if sp.empty?
+ m = GenerateGraph::collection_uuid(sp)
+ #puts "#{m} pdata is #{@pdata[m.intern]}"
+ if m and (@pdata[m.intern] or (not @opts[:pdata_only]))
+ gr += edge(job_uuid(job), m, {:label => prefix})
+ gr += generate_provenance_edges(m)
+ elsif @opts[:all_script_parameters]
+ #id = "#{job[:uuid]}_#{prefix}"
+ gr += "\"#{sp}\" [label=\"#{sp}\"];\n"
+ gr += edge(job_uuid(job), sp, {:label => prefix})
end
end
gr
# uuid is a collection
gr += describe_node(uuid)
+ if m == :"d41d8cd98f00b204e9800998ecf8427e+0"
+ # empty collection, don't follow any further
+ return gr
+ end
+
@pdata.each do |k, job|
if job[:output] == uuid.to_s
gr += edge(uuid, job_uuid(job), {:label => "output"})
end
- def self.create_provenance_graph(pdata, opts={})
+ def self.create_provenance_graph(pdata, svgId, opts={})
if pdata.is_a? Array or pdata.is_a? ArvadosResourceList
p2 = {}
pdata.each do |k|
end
gr = """strict digraph {
-node [fontsize=8,shape=box];
-edge [fontsize=8];
+node [fontsize=10,shape=box];
+edge [fontsize=10];
"""
if opts[:direction] == :bottom_up
svg = svg.sub(/<\?xml.*?\?>/m, "")
svg = svg.sub(/<!DOCTYPE.*?>/m, "")
+ svg = svg.sub(/<svg /, "<svg id=\"#{svgId}\" ")
end
def self.find_collections(sp)
c = []
- if sp and not sp.empty?
- case sp
- when Hash
- sp.each do |k, v|
- c.concat(find_collections(v))
- end
- when Array
- sp.each do |v|
- c.concat(find_collections(v))
- end
- else
+ case sp
+ when Hash
+ sp.each do |k, v|
+ c.concat(find_collections(v))
+ end
+ when Array
+ sp.each do |v|
+ c.concat(find_collections(v))
+ end
+ when String
+ if !sp.empty?
m = GenerateGraph::collection_uuid(sp)
if m
c << m