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:
Diffstat (limited to 'app/models/concerns/milestoneish.rb')
-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