[ARVADOS] updated: 29e5eb86b1dbbb644c244ec6e08e935c06e50d1c

git at public.curoverse.com git at public.curoverse.com
Mon Jul 28 17:10:34 EDT 2014


Summary of changes:
 .../controllers/arvados/v1/groups_controller.rb    | 82 +++++++++++++++-------
 services/api/config/routes.rb                      |  1 +
 .../arvados/v1/groups_controller_test.rb           | 20 ++++++
 3 files changed, 77 insertions(+), 26 deletions(-)

       via  29e5eb86b1dbbb644c244ec6e08e935c06e50d1c (commit)
       via  38deaa21b890f880d415c96534bb6d230bcc87fa (commit)
       via  35e5f5ac9f0dcfe3868e9f31c6500f1af759a1af (commit)
       via  dea31790e175096c0df8f5a395696aab940f39d7 (commit)
      from  b34070ef0ed43062e1e923c8771237575dbb5fa7 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 29e5eb86b1dbbb644c244ec6e08e935c06e50d1c
Merge: b34070e 38deaa2
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon Jul 28 17:10:16 2014 -0400

    Merge branch '3235-all-contents' refs #3235


commit 38deaa21b890f880d415c96534bb6d230bcc87fa
Author: Tom Clegg <tom at curoverse.com>
Date:   Fri Jul 25 13:49:27 2014 -0400

    3235: Add test case.

diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb
index bb74b90..98acbef 100644
--- a/services/api/app/controllers/arvados/v1/groups_controller.rb
+++ b/services/api/app/controllers/arvados/v1/groups_controller.rb
@@ -22,11 +22,13 @@ class Arvados::V1::GroupsController < ApplicationController
     # Set @objects:
     load_searchable_objects(owner_uuid: @object.andand.uuid, include_linked: params[:include_linked])
 
-    @links = Link.where('link_class=? and tail_uuid=?'\
-                        ' and head_uuid in (?)',
-                        'name',
-                        @object.uuid,
-                        @objects.collect(&:uuid))
+    sql = 'link_class=? and head_uuid in (?)'
+    sql_params = ['name', @objects.collect(&:uuid)]
+    if @object
+      sql += ' and tail_uuid=?'
+      sql_params << @object.uuid
+    end
+    @links = Link.where sql, *sql_params
     @object_list = {
       :kind  => "arvados#objectList",
       :etag => "",
diff --git a/services/api/config/routes.rb b/services/api/config/routes.rb
index 7093455..74d2aea 100644
--- a/services/api/config/routes.rb
+++ b/services/api/config/routes.rb
@@ -15,6 +15,7 @@ Server::Application.routes.draw do
         get 'used_by', on: :member
       end
       resources :groups do
+        get 'contents', on: :collection
         get 'contents', on: :member
       end
       resources :humans
diff --git a/services/api/test/functional/arvados/v1/groups_controller_test.rb b/services/api/test/functional/arvados/v1/groups_controller_test.rb
index 0b76029..176e8e1 100644
--- a/services/api/test/functional/arvados/v1/groups_controller_test.rb
+++ b/services/api/test/functional/arvados/v1/groups_controller_test.rb
@@ -83,6 +83,26 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase
     check_project_contents_response
   end
 
+  test 'list objects across multiple projects' do
+    authorize_with :project_viewer
+    get :contents, {
+      format: :json,
+      include_linked: false,
+      filters: [['uuid', 'is_a', 'arvados#specimen']]
+    }
+    assert_response :success
+    found_uuids = json_response['items'].collect { |i| i['uuid'] }
+    [[:in_aproject, true],
+     [:in_asubproject, true],
+     [:owned_by_private_group, false]].each do |specimen_fixture, should_find|
+      if should_find
+        assert_includes found_uuids, specimens(specimen_fixture).uuid, "did not find specimen fixture '#{specimen_fixture}'"
+      else
+        refute_includes found_uuids, specimens(specimen_fixture).uuid, "found specimen fixture '#{specimen_fixture}'"
+      end
+    end
+  end
+
   # Even though the project_viewer tests go through other controllers,
   # I'm putting them here so they're easy to find alongside the other
   # project tests.

commit 35e5f5ac9f0dcfe3868e9f31c6500f1af759a1af
Author: Tom Clegg <tom at curoverse.com>
Date:   Thu Jul 24 22:10:30 2014 -0400

    3235: Fix SQL query.

diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb
index d69cd6c..bb74b90 100644
--- a/services/api/app/controllers/arvados/v1/groups_controller.rb
+++ b/services/api/app/controllers/arvados/v1/groups_controller.rb
@@ -65,9 +65,10 @@ class Arvados::V1::GroupsController < ApplicationController
         cond_params << opts[:owner_uuid]
       end
       if opts[:include_linked]
-        conds << " OR #{klass.table_name}.uuid IN (SELECT head_uuid FROM links WHERE link_class=#{klass.sanitize 'name'} AND links.tail_uuid=#{klass.sanitize @object.uuid})"
+        conds << "#{klass.table_name}.uuid IN (SELECT head_uuid FROM links WHERE link_class=#{klass.sanitize 'name'} AND links.tail_uuid=#{klass.sanitize @object.uuid})"
       end
       if conds.any?
+        cond_sql = '(' + conds.join(') OR (') + ')'
         @objects = @objects.where(cond_sql, *cond_params)
       end
       @objects = @objects.order("#{klass.table_name}.uuid")

commit dea31790e175096c0df8f5a395696aab940f39d7
Author: Tom Clegg <tom at curoverse.com>
Date:   Thu Jul 24 19:03:35 2014 -0400

    3235: Split GroupsController#contents logic out to load_searchable_objects.

diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb
index da82e81..d69cd6c 100644
--- a/services/api/app/controllers/arvados/v1/groups_controller.rb
+++ b/services/api/app/controllers/arvados/v1/groups_controller.rb
@@ -9,9 +9,42 @@ class Arvados::V1::GroupsController < ApplicationController
             })
   end
 
+  def render_404_if_no_object
+    if params[:action] == 'contents' and !params[:uuid]
+      # OK!
+      @object = nil
+    else
+      super
+    end
+  end
+
   def contents
+    # Set @objects:
+    load_searchable_objects(owner_uuid: @object.andand.uuid, include_linked: params[:include_linked])
+
+    @links = Link.where('link_class=? and tail_uuid=?'\
+                        ' and head_uuid in (?)',
+                        'name',
+                        @object.uuid,
+                        @objects.collect(&:uuid))
+    @object_list = {
+      :kind  => "arvados#objectList",
+      :etag => "",
+      :self_link => "",
+      :links => @links.as_api_response(nil),
+      :offset => @offset,
+      :limit => @limit,
+      :items_available => @items_available,
+      :items => @objects.as_api_response(nil)
+    }
+    render json: @object_list
+  end
+
+  protected
+
+  def load_searchable_objects opts
     all_objects = []
-    all_available = 0
+    @items_available = 0
 
     # Trick apply_where_limit_order_params into applying suitable
     # per-table values. *_all are the real ones we'll apply to the
@@ -25,39 +58,33 @@ class Arvados::V1::GroupsController < ApplicationController
      Collection,
      Human, Specimen, Trait].each do |klass|
       @objects = klass.readable_by(*@read_users)
-      cond_sql = "#{klass.table_name}.owner_uuid = ?"
-      cond_params = [@object.uuid]
-      if params[:include_linked]
-        cond_sql += " OR #{klass.table_name}.uuid IN (SELECT head_uuid FROM links WHERE link_class=#{klass.sanitize 'name'} AND links.tail_uuid=#{klass.sanitize @object.uuid})"
+      conds = []
+      cond_params = []
+      if opts[:owner_uuid]
+        conds << "#{klass.table_name}.owner_uuid = ?"
+        cond_params << opts[:owner_uuid]
+      end
+      if opts[:include_linked]
+        conds << " OR #{klass.table_name}.uuid IN (SELECT head_uuid FROM links WHERE link_class=#{klass.sanitize 'name'} AND links.tail_uuid=#{klass.sanitize @object.uuid})"
       end
-      @objects = @objects.where(cond_sql, *cond_params).order("#{klass.table_name}.uuid")
+      if conds.any?
+        @objects = @objects.where(cond_sql, *cond_params)
+      end
+      @objects = @objects.order("#{klass.table_name}.uuid")
       @limit = limit_all - all_objects.count
       apply_where_limit_order_params
-      items_available = @objects.
+      klass_items_available = @objects.
         except(:limit).except(:offset).
         count(:id, distinct: true)
-      all_available += items_available
-      @offset = [@offset - items_available, 0].max
+      @items_available += klass_items_available
+      @offset = [@offset - klass_items_available, 0].max
 
       all_objects += @objects.to_a
     end
-    @objects = all_objects || []
-    @links = Link.where('link_class=? and tail_uuid=?'\
-                        ' and head_uuid in (?)',
-                        'name',
-                        @object.uuid,
-                        @objects.collect(&:uuid))
-    @object_list = {
-      :kind  => "arvados#objectList",
-      :etag => "",
-      :self_link => "",
-      :links => @links.as_api_response(nil),
-      :offset => offset_all,
-      :limit => limit_all,
-      :items_available => all_available,
-      :items => @objects.as_api_response(nil)
-    }
-    render json: @object_list
+
+    @objects = all_objects
+    @limit = limit_all
+    @offset = offset_all
   end
 
 end

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list