Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Derichs <pderichs@gitlab.com>2019-04-11 16:11:06 +0300
committerPatrick Derichs <pderichs@gitlab.com>2019-04-11 16:11:06 +0300
commit1126b60a86ead5d3dbbf8f697f2d2439713ed435 (patch)
tree6f1ac042bbb9f766a86024d72cc028c379e26237
parent51119395e668d592d69266cf74dcb67b667082a8 (diff)
Add hash to cache values for max user access in ProjectTeam
-rw-r--r--app/models/project_team.rb7
-rw-r--r--spec/models/project_team_spec.rb12
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