2871: add helper method to get "n" number of objects of specific dataclass
authorradhika <radhika@curoverse.com>
Tue, 3 Jun 2014 18:44:32 +0000 (14:44 -0400)
committerradhika <radhika@curoverse.com>
Tue, 3 Jun 2014 18:44:32 +0000 (14:44 -0400)
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/helpers/application_helper.rb

index 786479cc0ded746047a92dd06d27c1e21559f21d..a559b01c7b4e1a532ce48b3d163cc71a59304eca 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,50 @@ 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([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 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 && @objects_map[dataclass] && @objects_map[size_key] &&
+        (@objects_map[size_key] >= size)
+      return @objects_map[dataclass] 
+    end
+
+    @objects_map = {}
+    @objects_map[dataclass] = dataclass.limit(size)
+    @objects_map[size_key] = size
+
+    return @objects_map[dataclass]
+  end
+
 end
index f236f8ce37c2cae6109527efdbaec5fdefd5dc1a..b03b1093acf5a4d5ed57081990c4bc671006b00c 100644 (file)
@@ -245,7 +245,8 @@ module ApplicationHelper
 
     attrtext = attrvalue
     if dataclass and dataclass.is_a? Class
-      dataclass.limit(10).each do |item|
+      objects = get_objects_of_type dataclass, 10
+      objects.each do |item|
         items << item
         preload_uuids << item.uuid
       end
@@ -255,7 +256,6 @@ module ApplicationHelper
       preload_links_for_objects preload_uuids
 
       if attrvalue and !attrvalue.empty?
-        #Link.where(head_uuid: attrvalue, link_class: ["tag", "identifier"]).each do |tag|
         links_for_object(attrvalue).each do |link|
           if link.link_class.in? ["tag", "identifier"]
             attrtext += " [#{tag.name}]"
@@ -263,16 +263,12 @@ module ApplicationHelper
         end
         selectables.append({name: attrtext, uuid: attrvalue, type: dataclass.to_s})
       end
-      #dataclass.where(uuid: attrvalue).each do |item|
-      #  selectables.append({name: item.uuid, uuid: item.uuid, type: dataclass.to_s})
-      #end
       itemuuids = []
       items.each do |item|
         itemuuids << item.uuid
         selectables.append({name: item.uuid, uuid: item.uuid, type: dataclass.to_s})
       end
       
-      #Link.where(head_uuid: itemuuids, link_class: ["tag", "identifier"]).each do |tag|
       itemuuids.each do |itemuuid|
         links_for_object(itemuuid).each do |link|
           if link.link_class.in? ["tag", "identifier"]