Commit 2e021f9ecd60fc4ca8cd432fbb34dbe67b5ceb1f
1 parent
cec64d20
Exists in
master
and in
1 other branch
Added max_result_window option - closes #1445
Showing
5 changed files
with
19 additions
and
3 deletions
Show diff stats
CHANGELOG.md
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 | ... | ... |