From 6b7c47d4702bc5c36c829a015618309d439fbd1c Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Mon, 6 Nov 2017 16:23:44 +0100 Subject: [PATCH 1/3] [webui] Exclude subprojects from autocomplete to limit the number of suggestions. Fix #610. --- src/api/app/models/project.rb | 2 +- .../webui/project_controller_spec.rb | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/api/app/models/project.rb b/src/api/app/models/project.rb index 02583f70736..de2a04e375c 100644 --- a/src/api/app/models/project.rb +++ b/src/api/app/models/project.rb @@ -210,7 +210,7 @@ def config end def self.autocomplete(search) - projects = Project.where(["lower(name) like lower(?)", "#{search}%"]) + projects = Project.where("lower(name) like lower(?)", "#{search}%").where.not("lower(name) like lower(?)", "#{search}%:%") if search.to_s =~ /home:./ projects.home else diff --git a/src/api/spec/controllers/webui/project_controller_spec.rb b/src/api/spec/controllers/webui/project_controller_spec.rb index 591b188f4fa..52ab2f25b02 100644 --- a/src/api/spec/controllers/webui/project_controller_spec.rb +++ b/src/api/spec/controllers/webui/project_controller_spec.rb @@ -140,6 +140,28 @@ it { expect(@json_response).not_to include(apache_maintenance_incident_project.name) } it { expect(@json_response).not_to include(openSUSE_project.name) } end + + context 'with a subprojects' do + let!(:apache_subproject) { create(:project, name: "Apache:subproject")} + + context 'and searching for parent project' do + before do + get :autocomplete_projects, params: { term: 'Apache' } + @json_response = JSON.parse(response.body) + end + + it { expect(@json_response).not_to include(apache_subproject.name) } + end + + context 'and searching for parent project' do + before do + get :autocomplete_projects, params: { term: 'Apache:' } + @json_response = JSON.parse(response.body) + end + + it { expect(@json_response).to include(apache_subproject.name) } + end + end end describe 'GET #autocomplete_incidents' do From b61b2c7c7066bb53687ff40b6ce8ddc600a6b914 Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Mon, 6 Nov 2017 16:24:56 +0100 Subject: [PATCH 2/3] [webui] Remove not_home / home scope from autocomplete as it does not improve performance. Tested with an Explain on build.o.o. --- src/api/app/models/project.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/api/app/models/project.rb b/src/api/app/models/project.rb index de2a04e375c..d92a1220b74 100644 --- a/src/api/app/models/project.rb +++ b/src/api/app/models/project.rb @@ -210,12 +210,7 @@ def config end def self.autocomplete(search) - projects = Project.where("lower(name) like lower(?)", "#{search}%").where.not("lower(name) like lower(?)", "#{search}%:%") - if search.to_s =~ /home:./ - projects.home - else - projects.not_home - end + Project.where("lower(name) like lower(?)", "#{search}%").where.not("lower(name) like lower(?)", "#{search}%:%") end def self.deleted_instance From 39dd9b7329dc3e4701ff6cce41938ed5ca22b1ab Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Mon, 6 Nov 2017 16:27:26 +0100 Subject: [PATCH 3/3] [webui] Move autocomplete class method into a scope --- src/api/app/models/project.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/api/app/models/project.rb b/src/api/app/models/project.rb index d92a1220b74..b665cac2dbe 100644 --- a/src/api/app/models/project.rb +++ b/src/api/app/models/project.rb @@ -105,6 +105,9 @@ def autocomplete(search) where.not("name rlike ?", ::Configuration.unlisted_projects_filter) if ::Configuration.unlisted_projects_filter.present? } scope :remote, -> { where('NOT ISNULL(projects.remoteurl)') } + scope :autocomplete, lambda { |search| + where("lower(name) like lower(?)", "#{search}%").where.not("lower(name) like lower(?)", "#{search}%:%") + } # will return all projects with attribute 'OBS:ImageTemplates' scope :local_image_templates, lambda { @@ -209,10 +212,6 @@ def config @config ||= ProjectConfigFile.new(project_name: name) end - def self.autocomplete(search) - Project.where("lower(name) like lower(?)", "#{search}%").where.not("lower(name) like lower(?)", "#{search}%:%") - end - def self.deleted_instance project = Project.find_by(name: 'deleted') unless project