Skip to content
Snippets Groups Projects

Improve performance of the global search for issuables

Compare and Show latest version
15 files
+ 190
110
Compare changes
  • Side-by-side
  • Inline
Files
15
@@ -29,6 +29,7 @@
@@ -29,6 +29,7 @@
# updated_after: datetime
# updated_after: datetime
# updated_before: datetime
# updated_before: datetime
# attempt_group_search_optimizations: boolean
# attempt_group_search_optimizations: boolean
 
# attempt_project_search_optimizations: boolean
#
#
class IssuableFinder
class IssuableFinder
prepend FinderWithCrossProjectAccess
prepend FinderWithCrossProjectAccess
@@ -184,7 +185,6 @@ def project
@@ -184,7 +185,6 @@ def project
@project = project
@project = project
end
end
# rubocop: disable CodeReuse/ActiveRecord
def projects
def projects
return @projects if defined?(@projects)
return @projects if defined?(@projects)
@@ -194,15 +194,27 @@ def projects
@@ -194,15 +194,27 @@ def projects
if current_user && params[:authorized_only].presence && !current_user_related?
if current_user && params[:authorized_only].presence && !current_user_related?
current_user.authorized_projects(min_access_level)
current_user.authorized_projects(min_access_level)
elsif group
elsif group
finder_options = { include_subgroups: params[:include_subgroups], only_owned: true }
find_group_projects
GroupProjectsFinder.new(group: group, current_user: current_user, options: finder_options, params: { min_access_level: min_access_level }).execute # rubocop: disable CodeReuse/Finder
else
else
ProjectsFinder.new(current_user: current_user, params: { min_access_level: min_access_level }).execute # rubocop: disable CodeReuse/Finder
find_projects
end
end
@projects = projects.with_feature_available_for_user(klass, current_user).reorder(nil)
@projects = projects.with_feature_available_for_user(klass, current_user)
 
end
 
 
def find_group_projects
 
return Project.none unless group
 
 
GroupProjectsFinder.new(group: group, # rubocop: disable CodeReuse/Finder
 
current_user: current_user,
 
options: { include_subgroups: params[:include_subgroups], only_owned: true },
 
params: { min_access_level: min_access_level }).execute
 
end
 
 
def find_projects
 
ProjectsFinder.new(current_user: current_user, # rubocop: disable CodeReuse/Finder
 
params: { public_or_min_access_level: min_access_level }).execute
end
end
# rubocop: enable CodeReuse/ActiveRecord
def search
def search
params[:search].presence
params[:search].presence
@@ -318,8 +330,7 @@ def use_cte_for_search?
@@ -318,8 +330,7 @@ def use_cte_for_search?
next false if params[:sort].present? && !params[:sort].in?(klass.simple_sorts.keys)
next false if params[:sort].present? && !params[:sort].in?(klass.simple_sorts.keys)
attempt_group_search_optimizations? ||
attempt_group_search_optimizations? ||
attempt_project_search_optimizations? ||
attempt_project_search_optimizations?
attempt_global_search_optimizations?
end
end
end
end
@@ -338,11 +349,6 @@ def attempt_group_search_optimizations?
@@ -338,11 +349,6 @@ def attempt_group_search_optimizations?
Feature.enabled?(:attempt_group_search_optimizations, default_enabled: true)
Feature.enabled?(:attempt_group_search_optimizations, default_enabled: true)
end
end
def attempt_global_search_optimizations?
params[:attempt_global_search_optimizations] &&
Feature.enabled?(:attempt_global_search_optimizations, default_enabled: true)
end
def attempt_project_search_optimizations?
def attempt_project_search_optimizations?
params[:attempt_project_search_optimizations] &&
params[:attempt_project_search_optimizations] &&
Feature.enabled?(:attempt_project_search_optimizations)
Feature.enabled?(:attempt_project_search_optimizations)
@@ -422,7 +428,7 @@ def by_project(items)
@@ -422,7 +428,7 @@ def by_project(items)
def by_search(items)
def by_search(items)
return items unless search
return items unless search
if use_cte_for_search?
if use_cte_for_search? && items != ApplicationRecord.none
cte = Gitlab::SQL::RecursiveCTE.new(klass.table_name)
cte = Gitlab::SQL::RecursiveCTE.new(klass.table_name)
cte << items
cte << items
Loading