summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-09-26 19:12:16 +0200
committerRémy Coutable <remy@rymai.me>2016-09-30 12:02:54 +0200
commit383dafdf31adaded392664cba9ba8b7262505dc6 (patch)
tree639d391b5c5d6dc1fbe44cb2c158fcf05d81b464 /app
parent9b361a3f44eec7a301565318ce86742f2f139a9d (diff)
downloadgitlab-ce-383dafdf31adaded392664cba9ba8b7262505dc6.tar.gz
Cache the issuable counters for 2 minutes
Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'app')
-rw-r--r--app/helpers/application_helper.rb23
-rw-r--r--app/helpers/issuables_helper.rb36
-rw-r--r--app/views/shared/issuable/_nav.html.haml10
3 files changed, 41 insertions, 28 deletions
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index bbc037288db..ebd78bf9888 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -280,29 +280,6 @@ module ApplicationHelper
end
end
- def issuables_state_counter_text(state, issuables)
- titles = {
- opened: "Open"
- }
-
- state_title = titles[state] || state.to_s.humanize
-
- count =
- if @issues || @merge_requests
- issuables_finder = @issues ? issues_finder : merge_requests_finder
- issuables_finder.params[:state] = state
- issuables_finder.execute.page(1).total_count
- end
-
- html = content_tag(:span, state_title)
-
- if count.present?
- html << " " << content_tag(:span, number_with_delimiter(count), class: 'badge')
- end
-
- html.html_safe
- end
-
def truncate_first_line(message, length = 50)
truncate(message.each_line.first.chomp, length: length) if message
end
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 5c04bba323f..8aa1ece017c 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -94,6 +94,24 @@ module IssuablesHelper
label_names.join(', ')
end
+ def issuables_state_counter_text(issuable_type, state)
+ titles = {
+ opened: "Open"
+ }
+
+ state_title = titles[state] || state.to_s.humanize
+
+ count =
+ Rails.cache.fetch(issuables_state_counter_cache_key(issuable_type, state), expires_in: 2.minutes) do
+ issuables_count_for_state(issuable_type, state)
+ end
+
+ html = content_tag(:span, state_title)
+ html << " " << content_tag(:span, number_with_delimiter(count), class: 'badge')
+
+ html.html_safe
+ end
+
private
def sidebar_gutter_collapsed?
@@ -111,4 +129,22 @@ module IssuablesHelper
issuable.open? ? :opened : :closed
end
end
+
+ def issuables_count_for_state(issuable_type, state)
+ issuables_finder = public_send("#{issuable_type}_finder")
+ issuables_finder.params[:state] = state
+
+ issuables_finder.execute.page(1).total_count
+ end
+
+ IRRELEVANT_PARAMS_FOR_CACHE_KEY = %w[utf8 sort page]
+ private_constant :IRRELEVANT_PARAMS_FOR_CACHE_KEY
+
+ def issuables_state_counter_cache_key(issuable_type, state)
+ opts = params.dup
+ opts['state'] = state
+ opts.delete_if { |k, v| IRRELEVANT_PARAMS_FOR_CACHE_KEY.include?(k) }
+
+ hexdigest(['issuables_count', issuable_type, opts.sort].flatten.join('-'))
+ end
end
diff --git a/app/views/shared/issuable/_nav.html.haml b/app/views/shared/issuable/_nav.html.haml
index 475b99a2a07..5527a2f889a 100644
--- a/app/views/shared/issuable/_nav.html.haml
+++ b/app/views/shared/issuable/_nav.html.haml
@@ -5,21 +5,21 @@
%ul.nav-links.issues-state-filters
%li{class: ("active" if params[:state] == 'opened')}
= link_to page_filter_path(state: 'opened', label: true), title: "Filter by #{page_context_word} that are currently opened." do
- #{issuables_state_counter_text(:opened, issuables)}
+ #{issuables_state_counter_text(type, :opened)}
- if type == :merge_requests
%li{class: ("active" if params[:state] == 'merged')}
= link_to page_filter_path(state: 'merged', label: true), title: 'Filter by merge requests that are currently merged.' do
- #{issuables_state_counter_text(:merged, issuables)}
+ #{issuables_state_counter_text(type, :merged)}
%li{class: ("active" if params[:state] == 'closed')}
= link_to page_filter_path(state: 'closed', label: true), title: 'Filter by merge requests that are currently closed and unmerged.' do
- #{issuables_state_counter_text(:closed, issuables)}
+ #{issuables_state_counter_text(type, :closed)}
- else
%li{class: ("active" if params[:state] == 'closed')}
= link_to page_filter_path(state: 'closed', label: true), title: 'Filter by issues that are currently closed.' do
- #{issuables_state_counter_text(:closed, issuables)}
+ #{issuables_state_counter_text(type, :closed)}
%li{class: ("active" if params[:state] == 'all')}
= link_to page_filter_path(state: 'all', label: true), title: "Show all #{page_context_word}." do
- #{issuables_state_counter_text(:all, issuables)}
+ #{issuables_state_counter_text(type, :all)}