Commit 9df17fa4c57e1025160ec271fb47e509d8bc2dcb
Exists in
master
and in
4 other branches
Merge pull request #2438 from cvut/query-perf
Optimize query for keys of repository members
Showing
1 changed file
with
13 additions
and
9 deletions
Show diff stats
app/roles/authority.rb
| @@ -25,21 +25,25 @@ module Authority | @@ -25,21 +25,25 @@ module Authority | ||
| 25 | end | 25 | end |
| 26 | 26 | ||
| 27 | def repository_readers | 27 | def repository_readers |
| 28 | - keys = Key.joins({user: :users_projects}). | ||
| 29 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER) | ||
| 30 | - keys.map(&:identifier) + deploy_keys.map(&:identifier) | 28 | + repository_members[UsersProject::REPORTER] |
| 31 | end | 29 | end |
| 32 | 30 | ||
| 33 | def repository_writers | 31 | def repository_writers |
| 34 | - keys = Key.joins({user: :users_projects}). | ||
| 35 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER) | ||
| 36 | - keys.map(&:identifier) | 32 | + repository_members[UsersProject::DEVELOPER] |
| 37 | end | 33 | end |
| 38 | 34 | ||
| 39 | def repository_masters | 35 | def repository_masters |
| 40 | - keys = Key.joins({user: :users_projects}). | ||
| 41 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER) | ||
| 42 | - keys.map(&:identifier) | 36 | + repository_members[UsersProject::MASTER] |
| 37 | + end | ||
| 38 | + | ||
| 39 | + def repository_members | ||
| 40 | + keys = Hash.new {|h,k| h[k] = [] } | ||
| 41 | + UsersProject.select("keys.identifier, project_access"). | ||
| 42 | + joins(user: :keys).where(project_id: id). | ||
| 43 | + each {|row| keys[row.project_access] << [row.identifier] } | ||
| 44 | + | ||
| 45 | + keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier) | ||
| 46 | + keys | ||
| 43 | end | 47 | end |
| 44 | 48 | ||
| 45 | def allow_read_for?(user) | 49 | def allow_read_for?(user) |