Commit 9df17fa4c57e1025160ec271fb47e509d8bc2dcb

Authored by Dmitriy Zaporozhets
2 parents 0a2ac837 a54b2e80

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 25 end
26 26  
27 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 29 end
32 30  
33 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 33 end
38 34  
39 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 47 end
44 48  
45 49 def allow_read_for?(user)
... ...