2871: get collections methods return all collections for the given uuid.
[arvados.git] / apps / workbench / app / controllers / application_controller.rb
index 786479cc0ded746047a92dd06d27c1e21559f21d..e39d7760f45ccbc3a7a0e03a8f43c2b2045300c7 100644 (file)
@@ -191,31 +191,6 @@ class ApplicationController < ActionController::Base
     %w(Attributes Metadata JSON API)
   end
 
-  # helper method to get links for given objects or uuids
-  helper_method :links_for_object
-  def links_for_object object_or_uuid
-    uuid = object_or_uuid.is_a?(String) ? object_or_uuid : object_or_uuid.uuid
-    preload_links_for_objects([uuid])
-    @all_links_for[uuid]
-  end
-
-  helper_method :preload_links_for_objects
-  def preload_links_for_objects objects_and_uuids
-    uuids = objects_and_uuids.collect { |x| x.is_a?(String) ? x : x.uuid }
-    @all_links_for ||= {}
-    if not uuids.select { |x| @all_links_for[x].nil? }.any?
-      # already preloaded for all of these uuids
-      return
-    end
-    uuids.each do |x|
-      @all_links_for[x] = []
-    end
-    # TODO: make sure we get every page of results from API server
-    Link.filter([['head_uuid','in',uuids]]).each do |link|
-      @all_links_for[link.head_uuid] << link
-    end
-  end
-
   protected
 
   def redirect_to_login
@@ -473,4 +448,110 @@ class ApplicationController < ActionController::Base
       root_of[g.uuid] == current_user.uuid
     end
   end
+
+  # helper method to get links for given object or uuid
+  helper_method :links_for_object
+  def links_for_object object_or_uuid
+    uuid = object_or_uuid.is_a?(String) ? object_or_uuid : object_or_uuid.uuid
+    preload_links_for_objects([object_or_uuid])
+    @all_links_for[uuid]
+  end
+
+  # helper method to preload links for given objects and uuids
+  helper_method :preload_links_for_objects
+  def preload_links_for_objects objects_and_uuids
+    uuids = objects_and_uuids.collect { |x| x.is_a?(String) ? x : x.uuid }
+    @all_links_for ||= {}
+    if not uuids.select { |x| @all_links_for[x].nil? }.any?
+      # already preloaded for all of these uuids
+      return
+    end
+    uuids.each do |x|
+      @all_links_for[x] = []
+    end
+    # TODO: make sure we get every page of results from API server
+    Link.filter([['head_uuid','in',uuids]]).each do |link|
+      @all_links_for[link.head_uuid] << link
+    end
+  end
+
+  # helper method to get a certain number of objects of a specific type
+  # this can be used to replace any uses of: "dataclass.limit(n)"
+  helper_method :get_objects_of_type
+  def get_objects_of_type dataclass, size
+    # if the objects_map_for has a value for this dataclass, and the size used
+    # to retrieve those objects is greater than equal to size, return it
+    size_key = "#{dataclass}_size"
+    if @objects_map_for && @objects_map_for[dataclass] && @objects_map_for[size_key] &&
+        (@objects_map_for[size_key] >= size)
+      return @objects_map_for[dataclass] 
+    end
+
+    @objects_map_for = {}
+    @objects_map_for[dataclass] = dataclass.limit(size)
+    @objects_map_for[size_key] = size
+
+    return @objects_map_for[dataclass]
+  end
+
+  # helper method to get collections for the given uuid
+  helper_method :get_collections
+  def get_collections uuid
+    preload_collections([uuid])
+    @all_collections_for[uuid]
+  end
+
+  # helper method to preload collections for the given uuids
+  helper_method :preload_collections
+  def preload_collections uuids
+    @all_collections_for ||= {}
+    if not uuids.select { |x| @all_collections_for[x].nil? }.any?
+      # already preloaded for all of these uuids
+      return
+    end
+
+    uuids.each do |x|
+      @all_collections_for[x] = []
+    end
+
+    # TODO: make sure we get every page of results from API server
+    Collection.where(uuid: uuids).each do |collection|
+      @all_collections_for[collection.uuid] << collection
+    end
+  end
+
+  # helper method to get log collections for the given log
+  helper_method :get_log_collections
+  def get_log_collections log
+    fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(log)
+    uuid = fixup[1]
+    preload_log_collections([uuid])
+    @all_log_collections_for[uuid]
+  end
+
+  # helper method to preload collections for the given uuids
+  helper_method :preload_log_collections
+  def preload_log_collections logs
+    uuids = []
+    logs.each do |log|
+      fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(log)
+      uuids << fixup[1]
+    end
+
+    @all_log_collections_for ||= {}
+    if not uuids.select { |x| @all_log_collections_for[x].nil? }.any?
+      # already preloaded for all of these uuids
+      return
+    end
+
+    uuids.each do |x|
+      @all_log_collections_for[x] = []
+    end
+
+    # TODO: make sure we get every page of results from API server
+    Collection.where(uuid: uuids).each do |collection|
+      @all_log_collections_for[collection.uuid] << collection
+    end
+  end
+
 end