2018-10-22 03:00:50 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-10-04 16:26:51 -04:00
|
|
|
module Gitlab
|
|
|
|
class MultiCollectionPaginator
|
|
|
|
attr_reader :first_collection, :second_collection, :per_page
|
|
|
|
|
|
|
|
def initialize(*collections, per_page: nil)
|
2021-05-04 11:10:36 -04:00
|
|
|
raise ArgumentError, 'Only 2 collections are supported' if collections.size != 2
|
2017-10-04 16:26:51 -04:00
|
|
|
|
2018-05-10 22:36:38 -04:00
|
|
|
@per_page = (per_page || Kaminari.config.default_per_page).to_i
|
2017-10-04 16:26:51 -04:00
|
|
|
@first_collection, @second_collection = collections
|
|
|
|
end
|
|
|
|
|
|
|
|
def paginate(page)
|
|
|
|
page = page.to_i
|
|
|
|
paginated_first_collection(page) + paginated_second_collection(page)
|
|
|
|
end
|
|
|
|
|
|
|
|
def total_count
|
|
|
|
@total_count ||= first_collection.size + second_collection.size
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def paginated_first_collection(page)
|
|
|
|
@first_collection_pages ||= Hash.new do |hash, page|
|
|
|
|
hash[page] = first_collection.page(page).per(per_page)
|
|
|
|
end
|
|
|
|
|
|
|
|
@first_collection_pages[page]
|
|
|
|
end
|
|
|
|
|
|
|
|
def paginated_second_collection(page)
|
|
|
|
@second_collection_pages ||= Hash.new do |hash, page|
|
|
|
|
second_collection_page = page - first_collection_page_count
|
|
|
|
|
2020-08-05 11:09:59 -04:00
|
|
|
offset = if second_collection_page < 1 || first_collection_page_count == 0
|
2017-10-04 16:26:51 -04:00
|
|
|
0
|
|
|
|
else
|
|
|
|
per_page - first_collection_last_page_size
|
|
|
|
end
|
2018-01-11 11:34:01 -05:00
|
|
|
|
2017-10-04 16:26:51 -04:00
|
|
|
hash[page] = second_collection.page(second_collection_page)
|
|
|
|
.per(per_page - paginated_first_collection(page).size)
|
|
|
|
.padding(offset)
|
|
|
|
end
|
|
|
|
|
|
|
|
@second_collection_pages[page]
|
|
|
|
end
|
|
|
|
|
|
|
|
def first_collection_page_count
|
|
|
|
return @first_collection_page_count if defined?(@first_collection_page_count)
|
|
|
|
|
|
|
|
first_collection_page = paginated_first_collection(0)
|
|
|
|
@first_collection_page_count = first_collection_page.total_pages
|
|
|
|
end
|
|
|
|
|
|
|
|
def first_collection_last_page_size
|
|
|
|
return @first_collection_last_page_size if defined?(@first_collection_last_page_size)
|
|
|
|
|
2017-11-17 09:55:43 -05:00
|
|
|
@first_collection_last_page_size = paginated_first_collection(first_collection_page_count)
|
|
|
|
.except(:select)
|
|
|
|
.size
|
2017-10-04 16:26:51 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|