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,7 +19,7 @@ module Searchkick | ||
19 | mappings = generate_mappings.deep_symbolize_keys.deep_merge(custom_mappings) | 19 | mappings = generate_mappings.deep_symbolize_keys.deep_merge(custom_mappings) |
20 | end | 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 | settings: settings, | 25 | settings: settings, |
@@ -525,7 +525,7 @@ module Searchkick | @@ -525,7 +525,7 @@ module Searchkick | ||
525 | def set_deep_paging(settings) | 525 | def set_deep_paging(settings) |
526 | if !settings.dig(:index, :max_result_window) && !settings[:"index.max_result_window"] | 526 | if !settings.dig(:index, :max_result_window) && !settings[:"index.max_result_window"] |
527 | settings[:index] ||= {} | 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 | end | 529 | end |
530 | end | 530 | end |
531 | 531 |
lib/searchkick/model.rb
@@ -5,7 +5,7 @@ module Searchkick | @@ -5,7 +5,7 @@ module Searchkick | ||
5 | 5 | ||
6 | unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :deep_paging, :default_fields, | 6 | unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :deep_paging, :default_fields, |
7 | :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :language, | 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 | :special_characters, :stem, :stemmer, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end, | 9 | :special_characters, :stem, :stemmer, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end, |
10 | :text_middle, :text_start, :unscope, :word, :word_end, :word_middle, :word_start] | 10 | :text_middle, :text_start, :unscope, :word, :word_end, :word_middle, :word_start] |
11 | raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any? | 11 | raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any? |
lib/searchkick/query.rb
@@ -254,6 +254,12 @@ module Searchkick | @@ -254,6 +254,12 @@ module Searchkick | ||
254 | offset = options[:offset] || (page - 1) * per_page + padding | 254 | offset = options[:offset] || (page - 1) * per_page + padding |
255 | scroll = options[:scroll] | 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 | # model and eager loading | 263 | # model and eager loading |
258 | load = options[:load].nil? ? true : options[:load] | 264 | load = options[:load].nil? ? true : options[:load] |
259 | 265 |
test/pagination_test.rb
@@ -139,4 +139,10 @@ class PaginationTest < Minitest::Test | @@ -139,4 +139,10 @@ class PaginationTest < Minitest::Test | ||
139 | end | 139 | end |
140 | assert_match "Result window is too large", error.message | 140 | assert_match "Result window is too large", error.message |
141 | end | 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 | end | 148 | end |