Commit 2e021f9ecd60fc4ca8cd432fbb34dbe67b5ceb1f

Authored by Andrew Kane
1 parent cec64d20

Added max_result_window option - closes #1445

CHANGELOG.md
  1 +## 5.0.4 (unreleased)
  2 +
  3 +- Added `max_result_window` option
  4 +
1 5 ## 5.0.3 (2022-03-13)
2 6  
3 7 - Fixed context for index name for inherited models
... ...
lib/searchkick/index_options.rb
... ... @@ -19,7 +19,7 @@ module Searchkick
19 19 mappings = generate_mappings.deep_symbolize_keys.deep_merge(custom_mappings)
20 20 end
21 21  
22   - set_deep_paging(settings) if options[:deep_paging]
  22 + set_deep_paging(settings) if options[:deep_paging] || options[:max_result_window]
23 23  
24 24 {
25 25 settings: settings,
... ... @@ -525,7 +525,7 @@ module Searchkick
525 525 def set_deep_paging(settings)
526 526 if !settings.dig(:index, :max_result_window) && !settings[:"index.max_result_window"]
527 527 settings[:index] ||= {}
528   - settings[:index][:max_result_window] = 1_000_000_000
  528 + settings[:index][:max_result_window] = options[:max_result_window] || 1_000_000_000
529 529 end
530 530 end
531 531  
... ...
lib/searchkick/model.rb
... ... @@ -5,7 +5,7 @@ module Searchkick
5 5  
6 6 unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :deep_paging, :default_fields,
7 7 :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :language,
8   - :locations, :mappings, :match, :merge_mappings, :routing, :searchable, :search_synonyms, :settings, :similarity,
  8 + :locations, :mappings, :match, :max_result_window, :merge_mappings, :routing, :searchable, :search_synonyms, :settings, :similarity,
9 9 :special_characters, :stem, :stemmer, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end,
10 10 :text_middle, :text_start, :unscope, :word, :word_end, :word_middle, :word_start]
11 11 raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any?
... ...
lib/searchkick/query.rb
... ... @@ -254,6 +254,12 @@ module Searchkick
254 254 offset = options[:offset] || (page - 1) * per_page + padding
255 255 scroll = options[:scroll]
256 256  
  257 + max_result_window = searchkick_options[:max_result_window]
  258 + if max_result_window
  259 + offset = max_result_window if offset > max_result_window
  260 + per_page = max_result_window - offset if offset + per_page > max_result_window
  261 + end
  262 +
257 263 # model and eager loading
258 264 load = options[:load].nil? ? true : options[:load]
259 265  
... ...
test/pagination_test.rb
... ... @@ -139,4 +139,10 @@ class PaginationTest < Minitest::Test
139 139 end
140 140 assert_match "Result window is too large", error.message
141 141 end
  142 +
  143 + def test_max_result_window
  144 + with_options({max_result_window: 10000}, Song) do
  145 + assert_empty Song.search("*", offset: 10000, limit: 1).to_a
  146 + end
  147 + end
142 148 end
... ...