Commit 2e021f9ecd60fc4ca8cd432fbb34dbe67b5ceb1f

Authored by Andrew Kane
1 parent cec64d20

Added max_result_window option - closes #1445

  1 +## 5.0.4 (unreleased)
  2 +
  3 +- Added `max_result_window` option
  4 +
1 ## 5.0.3 (2022-03-13) 5 ## 5.0.3 (2022-03-13)
2 6
3 - Fixed context for index name for inherited models 7 - Fixed context for index name for inherited models
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