summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2017-09-05 14:51:19 +0000
committerSean McGivern <sean@mcgivern.me.uk>2017-09-05 14:51:19 +0000
commit8813089a6477090e2a9422c20432756c96d527be (patch)
tree8f2351f7a1434b48f822c09f9e3893f8718c4657 /lib
parent7b40d9bf51985ec22969a92248b03ed10f78c567 (diff)
parent42062a454a650d81d9fe6dddde7b39b056ec0a88 (diff)
downloadgitlab-ce-8813089a6477090e2a9422c20432756c96d527be.tar.gz
Merge branch 'mr-index-page-performance' into 'master'
Re-use issue/MR counts for the pagination system Closes #27168 See merge request !13805
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/issuables_count_for_state.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/gitlab/issuables_count_for_state.rb b/lib/gitlab/issuables_count_for_state.rb
new file mode 100644
index 00000000000..505810964bc
--- /dev/null
+++ b/lib/gitlab/issuables_count_for_state.rb
@@ -0,0 +1,50 @@
+module Gitlab
+ # Class for counting and caching the number of issuables per state.
+ class IssuablesCountForState
+ # The name of the RequestStore cache key.
+ CACHE_KEY = :issuables_count_for_state
+
+ # The state values that can be safely casted to a Symbol.
+ STATES = %w[opened closed merged all].freeze
+
+ # finder - The finder class to use for retrieving the issuables.
+ def initialize(finder)
+ @finder = finder
+ @cache =
+ if RequestStore.active?
+ RequestStore[CACHE_KEY] ||= initialize_cache
+ else
+ initialize_cache
+ end
+ end
+
+ def for_state_or_opened(state = nil)
+ self[state || :opened]
+ end
+
+ # Returns the count for the given state.
+ #
+ # state - The name of the state as either a String or a Symbol.
+ #
+ # Returns an Integer.
+ def [](state)
+ state = state.to_sym if cast_state_to_symbol?(state)
+
+ cache_for_finder[state] || 0
+ end
+
+ private
+
+ def cache_for_finder
+ @cache[@finder]
+ end
+
+ def cast_state_to_symbol?(state)
+ state.is_a?(String) && STATES.include?(state)
+ end
+
+ def initialize_cache
+ Hash.new { |hash, finder| hash[finder] = finder.count_by_state }
+ end
+ end
+end