From 04cdd8c9292523aaca50ff6f41791ea54ee91e3b Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Wed, 30 Jul 2014 15:01:33 -0400 Subject: [PATCH] 3235: Make collections show up in search results. --- .../app/assets/javascripts/select_modal.js | 7 ++-- .../app/controllers/search_controller.rb | 13 ++++++- .../arvados/v1/groups_controller.rb | 26 ++++++++------ .../arvados/v1/groups_controller_test.rb | 34 ++++++++++--------- 4 files changed, 50 insertions(+), 30 deletions(-) diff --git a/apps/workbench/app/assets/javascripts/select_modal.js b/apps/workbench/app/assets/javascripts/select_modal.js index ee33b54a62..1fec3dcb95 100644 --- a/apps/workbench/app/assets/javascripts/select_modal.js +++ b/apps/workbench/app/assets/javascripts/select_modal.js @@ -72,11 +72,14 @@ $(document).on('click', '.selectable', function() { }); }).on('click', '.chooser-show-project', function() { var params = {}; + var project_uuid = $(this).attr('data-project-uuid'); $(this).attr('href', '#'); // Skip normal click handler - if ($(this).attr('data-project-uuid')) { + if (project_uuid) { params = {'filters[]': JSON.stringify(['owner_uuid', '=', - $(this).attr('data-project-uuid')])}; + project_uuid]), + project_uuid: project_uuid + }; } // Use current selection as dropdown button label $(this). diff --git a/apps/workbench/app/controllers/search_controller.rb b/apps/workbench/app/controllers/search_controller.rb index 2b0ad7e57a..31c66638db 100644 --- a/apps/workbench/app/controllers/search_controller.rb +++ b/apps/workbench/app/controllers/search_controller.rb @@ -1,6 +1,17 @@ class SearchController < ApplicationController def find_objects_for_index - @objects = Group.contents(limit: @limit, offset: @offset, filters: @filters) + search_what = Group + if params[:project_uuid] + # Special case for "search all things in project": + @filters = @filters.select do |attr, operator, operand| + not (attr == 'owner_uuid' and operator == '=') + end + search_what = Group.find(params[:project_uuid]) + end + @objects = search_what.contents(limit: @limit, + offset: @offset, + filters: @filters, + include_linked: true) super end diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb index 6b214034fa..4dc5c9be13 100644 --- a/services/api/app/controllers/arvados/v1/groups_controller.rb +++ b/services/api/app/controllers/arvados/v1/groups_controller.rb @@ -23,8 +23,8 @@ class Arvados::V1::GroupsController < ApplicationController def contents # Set @objects: - load_searchable_objects(owner_uuid: @object.andand.uuid, include_linked: params[:include_linked]) - + load_searchable_objects(owner_uuid: @object.andand.uuid, + include_linked: params[:include_linked]) sql = 'link_class=? and head_uuid in (?)' sql_params = ['name', @objects.collect(&:uuid)] if @object @@ -66,19 +66,23 @@ class Arvados::V1::GroupsController < ApplicationController if klass == Group @objects = @objects.where('group_class = ?', 'project') end - conds = [] - cond_params = [] if opts[:owner_uuid] + conds = [] + cond_params = [] conds << "#{klass.table_name}.owner_uuid = ?" cond_params << opts[:owner_uuid] + if opts[:include_linked] + haslink = "#{klass.table_name}.uuid IN (SELECT head_uuid FROM links WHERE link_class=#{klass.sanitize 'name'}" + haslink += " AND links.tail_uuid=#{klass.sanitize opts[:owner_uuid]}" + haslink += ")" + conds << haslink + end + if conds.any? + cond_sql = '(' + conds.join(') OR (') + ')' + @objects = @objects.where(cond_sql, *cond_params) + end end - if opts[:include_linked] - 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") @limit = limit_all - all_objects.count apply_where_limit_order_params 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 d6ac3cee14..0110e65db1 100644 --- a/services/api/test/functional/arvados/v1/groups_controller_test.rb +++ b/services/api/test/functional/arvados/v1/groups_controller_test.rb @@ -90,22 +90,24 @@ 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}'" + [false, true].each do |include_linked| + test 'list objects across multiple projects' do + authorize_with :project_viewer + get :contents, { + format: :json, + include_linked: include_linked, + 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 end -- 2.39.5