diff options
author | Douwe Maan <douwe@selenight.nl> | 2018-05-14 16:25:10 +0200 |
---|---|---|
committer | Douwe Maan <douwe@selenight.nl> | 2018-05-30 15:58:39 +0200 |
commit | cda2c5e76f18ff773ed0cac548bbf5d62a9adb26 (patch) | |
tree | 5d0df9fa2c890d7cbafc6de6e82ac5f2fa44615f /lib/api/entities.rb | |
parent | 62d96d8854d35121dc5d3b6ff4fe0949be5795d1 (diff) | |
download | gitlab-ce-dm-api-projects-members-preload.tar.gz |
Only preload member records for the relevant projects/groups/user in projects APIdm-api-projects-members-preload
Diffstat (limited to 'lib/api/entities.rb')
-rw-r--r-- | lib/api/entities.rb | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 49cd4fccc63..c4537036a3a 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -832,8 +832,8 @@ module API class ProjectWithAccess < Project expose :permissions do expose :project_access, using: Entities::ProjectAccess do |project, options| - if options.key?(:project_members) - (options[:project_members] || []).find { |member| member.source_id == project.id } + if options[:project_members] + options[:project_members].find { |member| member.source_id == project.id } else project.project_member(options[:current_user]) end @@ -841,8 +841,8 @@ module API expose :group_access, using: Entities::GroupAccess do |project, options| if project.group - if options.key?(:group_members) - (options[:group_members] || []).find { |member| member.source_id == project.namespace_id } + if options[:group_members] + options[:group_members].find { |member| member.source_id == project.namespace_id } else project.group.group_member(options[:current_user]) end @@ -853,13 +853,24 @@ module API def self.preload_relation(projects_relation, options = {}) relation = super(projects_relation, options) - unless options.key?(:group_members) - relation = relation.preload(group: [group_members: [:source, user: [notification_settings: :source]]]) + # MySQL doesn't support LIMIT inside an IN subquery + if Gitlab::Database.mysql? + project_ids = relation.pluck('projects.id') + namespace_ids = relation.pluck(:namespace_id) + else + project_ids = relation.select('projects.id') + namespace_ids = relation.select(:namespace_id) end - unless options.key?(:project_members) - relation = relation.preload(project_members: [:source, user: [notification_settings: :source]]) - end + options[:project_members] = options[:current_user] + .project_members + .where(source_id: project_ids) + .preload(:source, user: [notification_settings: :source]) + + options[:group_members] = options[:current_user] + .group_members + .where(source_id: namespace_ids) + .preload(:source, user: [notification_settings: :source]) relation end |