X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6f6235983d91e0b9fb5660d0a2825f510bbdac73..ff9f9c7e1a664a36bcffd54c7269c08d5bf1d436:/apps/workbench/app/models/arvados_resource_list.rb diff --git a/apps/workbench/app/models/arvados_resource_list.rb b/apps/workbench/app/models/arvados_resource_list.rb index 1e2e720d4e..1a3c6b7e3c 100644 --- a/apps/workbench/app/models/arvados_resource_list.rb +++ b/apps/workbench/app/models/arvados_resource_list.rb @@ -2,7 +2,7 @@ class ArvadosResourceList include ArvadosApiClientHelper include Enumerable - def initialize(resource_class) + def initialize resource_class=nil @resource_class = resource_class end @@ -26,6 +26,17 @@ class ArvadosResourceList self end + def select(columns=nil) + # If no column arguments were given, invoke Enumerable#select. + if columns.nil? + super() + else + @select ||= [] + @select += columns + self + end + end + def filter _filters @filters ||= [] @filters += _filters @@ -64,6 +75,7 @@ class ArvadosResourceList api_params[:eager] = '1' if @eager api_params[:limit] = @limit if @limit api_params[:offset] = @offset if @offset + api_params[:select] = @select if @select api_params[:order] = @orderby_spec if @orderby_spec api_params[:filters] = @filters if @filters res = arvados_api_client.api @resource_class, '', api_params @@ -91,6 +103,12 @@ class ArvadosResourceList self end + def collect + results.collect do |m| + yield m + end + end + def first results.first end @@ -135,4 +153,38 @@ class ArvadosResourceList results.offset if results.respond_to? :offset end + def result_links + results.links if results.respond_to? :links + end + + # Return links provided with API response that point to the + # specified object, and have the specified link_class. If link_class + # is false or omitted, return all links pointing to the specified + # object. + def links_for item_or_uuid, link_class=false + return [] if !result_links + unless @links_for_uuid + @links_for_uuid = {} + result_links.each do |link| + if link.respond_to? :head_uuid + @links_for_uuid[link.head_uuid] ||= [] + @links_for_uuid[link.head_uuid] << link + end + end + end + if item_or_uuid.respond_to? :uuid + uuid = item_or_uuid.uuid + else + uuid = item_or_uuid + end + (@links_for_uuid[uuid] || []).select do |link| + link_class == false or link.link_class == link_class + end + end + + # Note: this arbitrarily chooses one of (possibly) multiple names. + def name_for item_or_uuid + links_for(item_or_uuid, 'name').first.andand.name + end + end