diff --git a/CHANGELOG.md b/CHANGELOG.md index 6344a3e..6159c01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.0.4 (unreleased) + +- Added `max_result_window` option + ## 5.0.3 (2022-03-13) - Fixed context for index name for inherited models diff --git a/lib/searchkick/index_options.rb b/lib/searchkick/index_options.rb index f4194cf..f7cdf4e 100644 --- a/lib/searchkick/index_options.rb +++ b/lib/searchkick/index_options.rb @@ -19,7 +19,7 @@ module Searchkick mappings = generate_mappings.deep_symbolize_keys.deep_merge(custom_mappings) end - set_deep_paging(settings) if options[:deep_paging] + set_deep_paging(settings) if options[:deep_paging] || options[:max_result_window] { settings: settings, @@ -525,7 +525,7 @@ module Searchkick def set_deep_paging(settings) if !settings.dig(:index, :max_result_window) && !settings[:"index.max_result_window"] settings[:index] ||= {} - settings[:index][:max_result_window] = 1_000_000_000 + settings[:index][:max_result_window] = options[:max_result_window] || 1_000_000_000 end end diff --git a/lib/searchkick/model.rb b/lib/searchkick/model.rb index 557c49d..41aa487 100644 --- a/lib/searchkick/model.rb +++ b/lib/searchkick/model.rb @@ -5,7 +5,7 @@ module Searchkick unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :deep_paging, :default_fields, :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :language, - :locations, :mappings, :match, :merge_mappings, :routing, :searchable, :search_synonyms, :settings, :similarity, + :locations, :mappings, :match, :max_result_window, :merge_mappings, :routing, :searchable, :search_synonyms, :settings, :similarity, :special_characters, :stem, :stemmer, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end, :text_middle, :text_start, :unscope, :word, :word_end, :word_middle, :word_start] raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any? diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index dee2ca9..a195e73 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -254,6 +254,12 @@ module Searchkick offset = options[:offset] || (page - 1) * per_page + padding scroll = options[:scroll] + max_result_window = searchkick_options[:max_result_window] + if max_result_window + offset = max_result_window if offset > max_result_window + per_page = max_result_window - offset if offset + per_page > max_result_window + end + # model and eager loading load = options[:load].nil? ? true : options[:load] diff --git a/test/pagination_test.rb b/test/pagination_test.rb index 5540f66..52edb4f 100644 --- a/test/pagination_test.rb +++ b/test/pagination_test.rb @@ -139,4 +139,10 @@ class PaginationTest < Minitest::Test end assert_match "Result window is too large", error.message end + + def test_max_result_window + with_options({max_result_window: 10000}, Song) do + assert_empty Song.search("*", offset: 10000, limit: 1).to_a + end + end end -- libgit2 0.21.0