summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2017-11-24 16:10:53 +0000
committerSean McGivern <sean@mcgivern.me.uk>2017-11-24 16:10:53 +0000
commit7230a344537f653747b23ce467851e342e8de5e6 (patch)
tree295a508257920f405f6164da6c6b6f755a026184 /app
parent882dac685cd643755d733ab947d347e346488c73 (diff)
parent8041a87288906e4b10b86a9a2ab9039036243a5d (diff)
downloadgitlab-ce-7230a344537f653747b23ce467851e342e8de5e6.tar.gz
Merge branch 'dm-project-search-performance' into 'master'
Drastically improve project search performance by no longer searching namespace name Closes #40510 and #39623 See merge request gitlab-org/gitlab-ce!15590
Diffstat (limited to 'app')
-rw-r--r--app/models/project.rb30
1 files changed, 8 insertions, 22 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index 43a4d86c138..e276bd2422d 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -18,6 +18,7 @@ class Project < ActiveRecord::Base
include SelectForProjectAuthorization
include Routable
include GroupDescendant
+ include Gitlab::SQL::Pattern
extend Gitlab::ConfigHelper
extend Gitlab::CurrentSettings
@@ -424,32 +425,17 @@ class Project < ActiveRecord::Base
#
# query - The search query as a String.
def search(query)
- ptable = arel_table
- ntable = Namespace.arel_table
- pattern = "%#{query}%"
-
- # unscoping unnecessary conditions that'll be applied
- # when executing `where("projects.id IN (#{union.to_sql})")`
- projects = unscoped.select(:id).where(
- ptable[:path].matches(pattern)
- .or(ptable[:name].matches(pattern))
- .or(ptable[:description].matches(pattern))
- )
-
- namespaces = unscoped.select(:id)
- .joins(:namespace)
- .where(ntable[:name].matches(pattern))
-
- union = Gitlab::SQL::Union.new([projects, namespaces])
+ pattern = to_pattern(query)
- where("projects.id IN (#{union.to_sql})") # rubocop:disable GitlabSecurity/SqlInjection
+ where(
+ arel_table[:path].matches(pattern)
+ .or(arel_table[:name].matches(pattern))
+ .or(arel_table[:description].matches(pattern))
+ )
end
def search_by_title(query)
- pattern = "%#{query}%"
- table = Project.arel_table
-
- non_archived.where(table[:name].matches(pattern))
+ non_archived.where(arel_table[:name].matches(to_pattern(query)))
end
def visibility_levels