myexperiment-hackers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myexperiment-hackers] [2178] trunk/lib/rest.rb: pagination and multiple


From: noreply
Subject: [myexperiment-hackers] [2178] trunk/lib/rest.rb: pagination and multiple specified types in / search.xml
Date: Mon, 27 Apr 2009 11:15:22 -0400 (EDT)

Revision
2178
Author
dgc
Date
2009-04-27 11:15:22 -0400 (Mon, 27 Apr 2009)

Log Message

pagination and multiple specified types in /search.xml

Modified Paths

Diff

Modified: trunk/lib/rest.rb (2177 => 2178)


--- trunk/lib/rest.rb	2009-04-27 13:28:37 UTC (rev 2177)
+++ trunk/lib/rest.rb	2009-04-27 15:15:22 UTC (rev 2178)
@@ -78,6 +78,12 @@
         doc.root << reason
       end
     end
+
+    if args[:reason]
+      reason = XML::Node.new('reason')
+      reason << args[:reason]
+      doc.root << reason
+    end
   end
 
   render(:xml => doc.to_s, :status => "#{code} #{message}")
@@ -302,17 +308,14 @@
   rest_get_request(ob, params[:uri], user, eval("rest_resource_uri(ob)"), rest_name, query)
 end
 
-def find_all_paginated_auth(model, find_args, num, page, filters, user)
+def find_paginated_auth(args, num, page, filters, user, &blk)
 
-  def aux(model, find_args, num, page, filters, user)
+  def aux(args, num, page, filters, user)
 
-    find_args = find_args.clone
-    find_args[:page] = { :size => num, :current => page }
+    results = yield(args, num, page)
 
-    results = eval(model).find(:all, find_args)
+    return nil if results.nil?
 
-    return nil if results.page > results.page_count
-
     results.select do |result|
       selected = Authorization.is_authorized?('view', nil, result, user)
 
@@ -337,13 +340,13 @@
   # up to possibly fulfil the request
 
   if (page > 1)
-    results = aux(model, find_args, upto, 1, filters, user)
+    results = aux(args, upto, 1, filters, user, &blk)
     current_page = page + 1
   end
 
   while (results.length < upto)
 
-    results_page = aux(model, find_args, num, current_page, filters, user)
+    results_page = aux(args, num, current_page, filters, user, &blk)
 
     if results_page.nil?
       break
@@ -418,18 +421,33 @@
 
     find_args[:conditions] = conditions if conditions
 
-    obs = find_all_paginated_auth(model_name.camelize, find_args, limit, page, filters, user)
+    obs = find_paginated_auth( { :model => model_name.camelize, :find_args => find_args }, limit, page, filters, user) { |args, size, page|
+
+      find_args = args[:find_args].clone
+      find_args[:page] = { :size => size, :current => page }
+
+      results = eval(args[:model]).find(:all, find_args)
+
+      return nil if results.page > results.page_count
+
+      results
+    }
   end
 
-  produce_rest_list(req_uri, rules, query, obs, rest_name.pluralize, user)
+  produce_rest_list(req_uri, rules, query, obs, rest_name.pluralize, [], user)
 end
 
-def produce_rest_list(req_uri, rules, query, obs, tag, user)
+def produce_rest_list(req_uri, rules, query, obs, tag, attributes, user)
 
   root = XML::Node.new(tag)
 
   root['api-version'] = API_VERSION if query['api_version'] == 'yes'
 
+  attributes.each do |k,v|
+    root[k] = v
+    puts "Setting #{k} to #{v}"
+  end
+
   elements = query['elements'] ? query['elements'].split(',') : nil
 
   rest_entity = TABLES['REST'][:data][req_uri]['GET']['REST Entity']
@@ -855,17 +873,27 @@
 
   search_query = query['query']
 
-  models = [User, Workflow, Blob, Network]
+  models = [User, Workflow, Blob, Network, Pack]
 
-  case query['type']
-    when 'user';     models = [User]
-    when 'workflow'; models = [Workflow]
-    when 'file';     models = [Blob]
-    when 'group';    models = [Network]
+  # parse type option
+
+  if query['type']
+
+    models = []
+
+    query['type'].split(',').each do |type|
+      case type
+        when 'user';     models.push(User)
+        when 'workflow'; models.push(Workflow)
+        when 'file';     models.push(Blob)
+        when 'group';    models.push(Network)
+        when 'pack';     models.push(Pack)
+
+        else return rest_response(400, :reason => "Unknown search type '#{type}'")
+      end
+    end
   end
 
-  results = []
-
   num = 25
 
   if query['num']
@@ -875,28 +903,29 @@
   num = 25  if num < 0
   num = 100 if num > 100
 
-  if Conf.solr_enable and not search_query.nil? and search_query != ""
-    results = models[0].multi_solr_search(search_query, :limit => num,
-        :models => models).results
-  end
+  page  = query['page'] ? query['page'].to_i : 1
 
-  root = XML::Node.new('search')
-  root['query'] = search_query
-  root['type' ] = query['type'] if query['type']
+  page = 1 if page < 1
 
-  # filter out ones they are not allowed to get
-  results = results.select do |r|
-    r.respond_to?('contribution') == false or Authorization.is_authorized?('index', nil, r, user)
-  end
+  attributes = {}
+  attributes['query'] = search_query
+  attributes['type'] = query['type'] if models.length == 1
 
-  results.each do |result|
-    root << rest_reference(result, query)
+  obs = []
+
+  if Conf.solr_enable and not query.nil? and query != ""
+
+    obs = find_paginated_auth( { :query => search_query, :models => models }, num, page, [], user) { |args, size, page|
+
+      query  = args[:query]
+      models = args[:models]
+
+      search_result = models[0].multi_solr_search(query, :limit => size, :offset => size * (page - 1), :models => models)
+      search_result.results if search_result.total >= (size * (page - 1))
+    }
   end
 
-  doc = XML::Document.new
-  doc.root = root
-
-  render(:xml => doc.to_s)
+  produce_rest_list(req_uri, rules, query, obs, 'search', attributes, user)
 end
 
 def user_count(req_uri, rules, user, query)
@@ -964,7 +993,7 @@
   # filter out ones they are not allowed to get
   obs = (obs.select do |c| c.respond_to?('contribution') == false or Authorization.is_authorized?("index", nil, c, user) end)
 
-  produce_rest_list("tagged", rules, query, obs, 'tagged', user)
+  produce_rest_list("tagged", rules, query, obs, 'tagged', [], user)
 end
 
 def tag_cloud(req_uri, rules, user, query)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]