Commit e970635c authored by Adam Hegyi's avatar Adam Hegyi

Merge branch 'improve_limited_counter_with_delimiter' into 'master'

Remove order clauses from the limited counter helper

See merge request gitlab-org/gitlab!33187
parents 4e49092a cb854424
# frozen_string_literal: true # frozen_string_literal: true
module NumbersHelper module NumbersHelper
# rubocop: disable CodeReuse/ActiveRecord
def limited_counter_with_delimiter(resource, **options) def limited_counter_with_delimiter(resource, **options)
limit = options.fetch(:limit, 1000).to_i limit = options.fetch(:limit, 1000).to_i
count = resource.limit(limit + 1).count(:all) count = resource.page.total_count_with_limit(:all, limit: limit)
if count > limit if count > limit
number_with_delimiter(count - 1, options) + '+' number_with_delimiter(count - 1, options) + '+'
else else
number_with_delimiter(count, options) number_with_delimiter(count, options)
end end
end end
# rubocop: enable CodeReuse/ActiveRecord
end end
...@@ -5,9 +5,10 @@ module Kaminari ...@@ -5,9 +5,10 @@ module Kaminari
# This is a modified version of # This is a modified version of
# https://github.com/kaminari/kaminari/blob/c5186f5d9b7f23299d115408e62047447fd3189d/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb#L17-L41 # https://github.com/kaminari/kaminari/blob/c5186f5d9b7f23299d115408e62047447fd3189d/kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb#L17-L41
# that limit the COUNT query to 10,000 to avoid query timeouts. # that limit the COUNT query to a configurable value to avoid query timeouts.
# The default limit value is 10,000 records
# rubocop: disable Gitlab/ModuleWithInstanceVariables # rubocop: disable Gitlab/ModuleWithInstanceVariables
def total_count_with_limit(column_name = :all, _options = nil) #:nodoc: def total_count_with_limit(column_name = :all, options = {}) #:nodoc:
return @total_count if defined?(@total_count) && @total_count return @total_count if defined?(@total_count) && @total_count
# There are some cases that total count can be deduced from loaded records # There are some cases that total count can be deduced from loaded records
...@@ -18,13 +19,14 @@ module Kaminari ...@@ -18,13 +19,14 @@ module Kaminari
return @total_count = (current_page - 1) * limit_value + @records.length if @records.any? && (@records.length < limit_value) return @total_count = (current_page - 1) * limit_value + @records.length if @records.any? && (@records.length < limit_value)
end end
limit = options.fetch(:limit, MAX_COUNT_LIMIT).to_i
# #count overrides the #select which could include generated columns referenced in #order, so skip #order here, where it's irrelevant to the result anyway # #count overrides the #select which could include generated columns referenced in #order, so skip #order here, where it's irrelevant to the result anyway
c = except(:offset, :limit, :order) c = except(:offset, :limit, :order)
# Remove includes only if they are irrelevant # Remove includes only if they are irrelevant
c = c.except(:includes) unless references_eager_loaded_tables? c = c.except(:includes) unless references_eager_loaded_tables?
# .group returns an OrderedHash that responds to #count # .group returns an OrderedHash that responds to #count
# The following line was modified from `c = c.count(:all)` # The following line was modified from `c = c.count(:all)`
c = c.limit(MAX_COUNT_LIMIT + 1).count(column_name) c = c.limit(limit + 1).count(column_name)
@total_count = @total_count =
if c.is_a?(Hash) || c.is_a?(ActiveSupport::OrderedHash) if c.is_a?(Hash) || c.is_a?(ActiveSupport::OrderedHash)
c.count c.count
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment