diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-12-31 00:15:19 -0800 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-12-31 00:15:19 -0800 |
commit | 9df17fa4c57e1025160ec271fb47e509d8bc2dcb (patch) | |
tree | a60c142b259cb03076fe596f0791eaa25b62526c | |
parent | 0a2ac8371d49123baa5d1f601fc24df15d46965a (diff) | |
parent | a54b2e80f80d94bd903df85ac31dc2fd57cd97d0 (diff) | |
download | gitlab-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.rb | 22 |
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) |