diff options
author | Patrick Derichs <pderichs@gitlab.com> | 2019-04-11 16:11:06 +0300 |
---|---|---|
committer | Patrick Derichs <pderichs@gitlab.com> | 2019-04-11 16:11:06 +0300 |
commit | 1126b60a86ead5d3dbbf8f697f2d2439713ed435 (patch) | |
tree | 6f1ac042bbb9f766a86024d72cc028c379e26237 | |
parent | 51119395e668d592d69266cf74dcb67b667082a8 (diff) |
Add hash to cache values for max user access in ProjectTeam
-rw-r--r-- | app/models/project_team.rb | 7 | ||||
-rw-r--r-- | spec/models/project_team_spec.rb | 12 |
2 files changed, 18 insertions, 1 deletions
diff --git a/app/models/project_team.rb b/app/models/project_team.rb index aeba2843e5d..820d739fd45 100644 --- a/app/models/project_team.rb +++ b/app/models/project_team.rb @@ -7,6 +7,7 @@ class ProjectTeam def initialize(project) @project = project + @cache_max_member_access_by_user = {} end def add_guest(user, current_user: nil) @@ -175,12 +176,16 @@ class ProjectTeam # # Returns a Hash mapping user ID -> maximum access level. def max_member_access_for_user_ids(user_ids) - max_member_access_for_resource_ids(User, user_ids, project.id) do |user_ids| + unknown_user_ids = user_ids.reject { |id| @cache_max_member_access_by_user.key?(id) } + + unknown_access_values = max_member_access_for_resource_ids(User, unknown_user_ids, project.id) do |user_ids| project.project_authorizations .where(user: user_ids) .group(:user_id) .maximum(:access_level) end + + @cache_max_member_access_by_user.merge!(unknown_access_values) end def max_member_access(user_id) diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb index 77c88a04cde..b5634e5f439 100644 --- a/spec/models/project_team_spec.rb +++ b/spec/models/project_team_spec.rb @@ -35,6 +35,18 @@ describe ProjectTeam do it { expect(project.team.member?(guest, Gitlab::Access::REPORTER)).to be_falsey } it { expect(project.team.member?(nonmember, Gitlab::Access::GUEST)).to be_falsey } end + + describe '#maintainer?' do + it 'does not produce n+1 queries' do + 3.times { project.add_maintainer(create(:user)) } + + queries = ActiveRecord::QueryRecorder.new { project.team.maintainer?(maintainer) } + expect(queries.count).to eq(1) + + queries = ActiveRecord::QueryRecorder.new { project.team.maintainer?(maintainer) } + expect(queries.count).to eq(0) + end + end end context 'group project' do |