diff options
author | Sean McGivern <sean@mcgivern.me.uk> | 2017-09-05 14:51:19 +0000 |
---|---|---|
committer | Sean McGivern <sean@mcgivern.me.uk> | 2017-09-05 14:51:19 +0000 |
commit | 8813089a6477090e2a9422c20432756c96d527be (patch) | |
tree | 8f2351f7a1434b48f822c09f9e3893f8718c4657 /lib | |
parent | 7b40d9bf51985ec22969a92248b03ed10f78c567 (diff) | |
parent | 42062a454a650d81d9fe6dddde7b39b056ec0a88 (diff) | |
download | gitlab-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.rb | 50 |
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 |