summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-12-31 00:15:19 -0800
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-12-31 00:15:19 -0800
commit9df17fa4c57e1025160ec271fb47e509d8bc2dcb (patch)
treea60c142b259cb03076fe596f0791eaa25b62526c
parent0a2ac8371d49123baa5d1f601fc24df15d46965a (diff)
parenta54b2e80f80d94bd903df85ac31dc2fd57cd97d0 (diff)
downloadgitlab-ce-9df17fa4c57e1025160ec271fb47e509d8bc2dcb.tar.gz
Merge pull request #2438 from cvut/query-perf
Optimize query for keys of repository members
-rw-r--r--app/roles/authority.rb22
1 files changed, 13 insertions, 9 deletions
diff --git a/app/roles/authority.rb b/app/roles/authority.rb
index 5e0d61c3e85..77278489cb1 100644
--- a/app/roles/authority.rb
+++ b/app/roles/authority.rb
@@ -25,21 +25,25 @@ module Authority
end
def repository_readers
- keys = Key.joins({user: :users_projects}).
- where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER)
- keys.map(&:identifier) + deploy_keys.map(&:identifier)
+ repository_members[UsersProject::REPORTER]
end
def repository_writers
- keys = Key.joins({user: :users_projects}).
- where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER)
- keys.map(&:identifier)
+ repository_members[UsersProject::DEVELOPER]
end
def repository_masters
- keys = Key.joins({user: :users_projects}).
- where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER)
- keys.map(&:identifier)
+ repository_members[UsersProject::MASTER]
+ end
+
+ def repository_members
+ keys = Hash.new {|h,k| h[k] = [] }
+ UsersProject.select("keys.identifier, project_access").
+ joins(user: :keys).where(project_id: id).
+ each {|row| keys[row.project_access] << [row.identifier] }
+
+ keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier)
+ keys
end
def allow_read_for?(user)