[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