summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Edwards-Jones <jedwardsjones@gitlab.com>2016-12-16 15:52:27 +0000
committerJames Edwards-Jones <jedwardsjones@gitlab.com>2016-12-20 12:45:29 +0000
commit27c936adf9728cd21114aa3f2f9b44deb0296eb4 (patch)
treeeee3a69f32c44c3f74d113ef03867b4387d22ba3
parent01adeb17acccab09eb0074725050356d9d431c8a (diff)
downloadgitlab-ce-jej-memoize-milestoneish-visible-to-user.tar.gz
Milestoneish SQL performance partially improved and memoizedjej-memoize-milestoneish-visible-to-user
Memoize Milestoneish#issues_visible_to_user and counts to reduce lookups Milstoneish SQL optimised with project, but still slow on GlobalMilestone
-rw-r--r--app/models/concerns/milestoneish.rb28
-rw-r--r--app/models/global_milestone.rb10
-rw-r--r--app/models/milestone.rb4
-rw-r--r--changelogs/unreleased/jej-memoize-milestoneish-visible-to-user.yml4
4 files changed, 40 insertions, 6 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
diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb
index b01607dcda9..a54e478f5f8 100644
--- a/app/models/global_milestone.rb
+++ b/app/models/global_milestone.rb
@@ -24,12 +24,16 @@ class GlobalMilestone
@first_milestone = milestones.find {|m| m.description.present? } || milestones.first
end
+ def milestoneish_ids
+ milestones.select(:id)
+ end
+
def safe_title
@title.to_slug.normalize.to_s
end
def projects
- @projects ||= Project.for_milestones(milestones.select(:id))
+ @projects ||= Project.for_milestones(milestoneish_ids)
end
def state
@@ -49,11 +53,11 @@ class GlobalMilestone
end
def issues
- @issues ||= Issue.of_milestones(milestones.select(:id)).includes(:project, :assignee, :labels)
+ @issues ||= Issue.of_milestones(milestoneish_ids).includes(:project, :assignee, :labels)
end
def merge_requests
- @merge_requests ||= MergeRequest.of_milestones(milestones.select(:id)).includes(:target_project, :assignee, :labels)
+ @merge_requests ||= MergeRequest.of_milestones(milestoneish_ids).includes(:target_project, :assignee, :labels)
end
def participants
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 45ca97adad1..0dcfec89f14 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -129,6 +129,10 @@ class Milestone < ActiveRecord::Base
self.title
end
+ def milestoneish_ids
+ id
+ end
+
def can_be_closed?
active? && issues.opened.count.zero?
end
diff --git a/changelogs/unreleased/jej-memoize-milestoneish-visible-to-user.yml b/changelogs/unreleased/jej-memoize-milestoneish-visible-to-user.yml
new file mode 100644
index 00000000000..ab7f39a4178
--- /dev/null
+++ b/changelogs/unreleased/jej-memoize-milestoneish-visible-to-user.yml
@@ -0,0 +1,4 @@
+---
+title: Milestoneish SQL performance partially improved and memoized
+merge_request: 8146
+author: