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:
authorSean McGivern <sean@mcgivern.me.uk>2016-12-20 18:15:54 +0300
committerSean McGivern <sean@mcgivern.me.uk>2016-12-20 18:15:54 +0300
commit46920f7e371debe6af526ab9476aef6ca452185b (patch)
tree487f6500bc231b2577afb9af296050fd0d36eb61 /app/models/concerns
parentd84cfeaf21bb60c09061ad6c7bf135c37d063162 (diff)
parent27c936adf9728cd21114aa3f2f9b44deb0296eb4 (diff)
Merge branch 'jej-memoize-milestoneish-visible-to-user' into 'master'
Memoize Milestoneish#issues_visible_to_user to reduce lookups https://gitlab.com/gitlab-org/gitlab-ce/issues/25748 See merge request !8146
Diffstat (limited to 'app/models/concerns')
-rw-r--r--app/models/concerns/milestoneish.rb28
1 files changed, 25 insertions, 3 deletions
diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb
index 4359f1d7b06..8f02c226f0b 100644
--- a/app/models/concerns/milestoneish.rb
+++ b/app/models/concerns/milestoneish.rb
@@ -1,10 +1,15 @@
module Milestoneish
def closed_items_count(user)
- issues_visible_to_user(user).closed.size + merge_requests.closed_and_merged.size
+ memoize_per_user(user, :closed_items_count) do
+ (count_issues_by_state(user)['closed'] || 0) + merge_requests.closed_and_merged.size
+ end
end
def total_items_count(user)
- issues_visible_to_user(user).size + merge_requests.size
+ memoize_per_user(user, :total_items_count) do
+ issues_count = count_issues_by_state(user).values.sum
+ issues_count + merge_requests.size
+ end
end
def complete?(user)
@@ -30,7 +35,10 @@ module Milestoneish
end
def issues_visible_to_user(user)
- IssuesFinder.new(user).execute.where(id: issues)
+ memoize_per_user(user, :issues_visible_to_user) do
+ params = try(:project_id) ? { project_id: project_id } : {}
+ IssuesFinder.new(user, params).execute.where(milestone_id: milestoneish_ids)
+ end
end
def upcoming?
@@ -50,4 +58,18 @@ module Milestoneish
def expired?
due_date && due_date.past?
end
+
+ private
+
+ def count_issues_by_state(user)
+ memoize_per_user(user, :count_issues_by_state) do
+ issues_visible_to_user(user).reorder(nil).group(:state).count
+ end
+ end
+
+ def memoize_per_user(user, method_name)
+ @memoized ||= {}
+ @memoized[method_name] ||= {}
+ @memoized[method_name][user.try!(:id)] ||= yield
+ end
end