From 0ac5c27f92c5226d83bbbbfbbdd81e2f858e78f0 Mon Sep 17 00:00:00 2001
From: Domizio Demichelis
Date: Mon, 22 Jul 2019 12:10:22 +0200
Subject: [PATCH] refactoring of pagy_search and its usage in order to allow
optional term argument for searchkick (#169)
---
lib/pagy/extras/elasticsearch_rails.rb | 16 +++++++-------
lib/pagy/extras/pagy_search.rb | 6 ++++--
lib/pagy/extras/searchkick.rb | 16 +++++++-------
test/pagy/extras/elasticsearch_rails_test.rb | 8 +++----
test/pagy/extras/searchkick_test.rb | 22 ++++++++++++++++----
5 files changed, 42 insertions(+), 26 deletions(-)
diff --git a/lib/pagy/extras/elasticsearch_rails.rb b/lib/pagy/extras/elasticsearch_rails.rb
index 93137e2d6..6e19b00b8 100644
--- a/lib/pagy/extras/elasticsearch_rails.rb
+++ b/lib/pagy/extras/elasticsearch_rails.rb
@@ -21,17 +21,17 @@ def self.new_from_elasticsearch_rails(response, vars={})
module Backend ; private
# Return Pagy object and items
- def pagy_elasticsearch_rails(search_args, vars={})
- model, query_or_payload, options, _block, *called = search_args
- vars = pagy_elasticsearch_rails_get_vars(nil, vars)
- options[:size] = vars[:items]
- options[:from] = vars[:items] * (vars[:page] - 1)
- response = model.search(query_or_payload, options)
- vars[:count] = response.raw_response['hits']['total']
+ def pagy_elasticsearch_rails(pagy_search_args, vars={})
+ model, search_args, _block, *called = pagy_search_args
+ vars = pagy_elasticsearch_rails_get_vars(nil, vars)
+ search_args[-1][:size] = vars[:items]
+ search_args[-1][:from] = vars[:items] * (vars[:page] - 1)
+ response = model.search(*search_args)
+ vars[:count] = response.raw_response['hits']['total']
pagy = Pagy.new(vars)
# with :last_page overflow we need to re-run the method in order to get the hits
if defined?(OVERFLOW) && pagy.overflow? && pagy.vars[:overflow] == :last_page
- return pagy_elasticsearch_rails(search_args, vars.merge(page: pagy.page))
+ return pagy_elasticsearch_rails(pagy_search_args, vars.merge(page: pagy.page))
end
return pagy, called.empty? ? response : response.send(*called)
end
diff --git a/lib/pagy/extras/pagy_search.rb b/lib/pagy/extras/pagy_search.rb
index b29ab019a..098e7de59 100644
--- a/lib/pagy/extras/pagy_search.rb
+++ b/lib/pagy/extras/pagy_search.rb
@@ -7,8 +7,10 @@ module Search
# returns an array used to delay the call of #search
# after the pagination variables are merged to the options
# it also pushes to the same array an eventually called method and arguments
- def pagy_search(arg, options={}, &block)
- [self, arg, options, block].tap do |args|
+ # the last search argument must be a hash option
+ def pagy_search(*search_args, &block)
+ search_args << {} unless search_args[-1].is_a?(Hash)
+ [self, search_args, block].tap do |args|
args.define_singleton_method(:method_missing){|*a| args += a}
end
end
diff --git a/lib/pagy/extras/searchkick.rb b/lib/pagy/extras/searchkick.rb
index cb44116bf..3bae21e60 100644
--- a/lib/pagy/extras/searchkick.rb
+++ b/lib/pagy/extras/searchkick.rb
@@ -21,17 +21,17 @@ def self.new_from_searchkick(results, vars={})
module Backend ; private
# Return Pagy object and results
- def pagy_searchkick(search_args, vars={})
- model, term, options, block, *called = search_args
- vars = pagy_searchkick_get_vars(nil, vars)
- options[:per_page] = vars[:items]
- options[:page] = vars[:page]
- results = model.search(term, options, &block)
- vars[:count] = results.total_count
+ def pagy_searchkick(pagy_search_args, vars={})
+ model, search_args, block, *called = pagy_search_args
+ vars = pagy_searchkick_get_vars(nil, vars)
+ search_args[-1][:per_page] = vars[:items]
+ search_args[-1][:page] = vars[:page]
+ results = model.search(*search_args, &block)
+ vars[:count] = results.total_count
pagy = Pagy.new(vars)
# with :last_page overflow we need to re-run the method in order to get the hits
if defined?(OVERFLOW) && pagy.overflow? && pagy.vars[:overflow] == :last_page
- return pagy_searchkick(search_args, vars.merge(page: pagy.page))
+ return pagy_searchkick(pagy_search_args, vars.merge(page: pagy.page))
end
return pagy, called.empty? ? results : results.send(*called)
end
diff --git a/test/pagy/extras/elasticsearch_rails_test.rb b/test/pagy/extras/elasticsearch_rails_test.rb
index 2a06a590f..ded2bb0e1 100644
--- a/test/pagy/extras/elasticsearch_rails_test.rb
+++ b/test/pagy/extras/elasticsearch_rails_test.rb
@@ -16,15 +16,15 @@
end
it 'returns class and arguments' do
- MockElasticsearchRails::Model.pagy_search('a', b:2).must_equal [MockElasticsearchRails::Model, 'a', {b: 2}, nil]
+ MockElasticsearchRails::Model.pagy_search('a', b:2).must_equal [MockElasticsearchRails::Model, ['a', {b: 2}], nil]
args = MockElasticsearchRails::Model.pagy_search('a', b:2){|a| a*2}
block = args[-1]
- args.must_equal [MockElasticsearchRails::Model, 'a', {b: 2}, block]
+ args.must_equal [MockElasticsearchRails::Model, ['a', {b: 2}], block]
end
it 'adds the caller and arguments' do
- MockElasticsearchRails::Model.pagy_search('a', b:2).records.must_equal [MockElasticsearchRails::Model, 'a', {b: 2}, nil, :records]
- MockElasticsearchRails::Model.pagy_search('a', b:2).a('b', 2).must_equal [MockElasticsearchRails::Model, 'a', {b: 2}, nil, :a, 'b', 2]
+ MockElasticsearchRails::Model.pagy_search('a', b:2).records.must_equal [MockElasticsearchRails::Model, ['a', {b: 2}], nil, :records]
+ MockElasticsearchRails::Model.pagy_search('a', b:2).a('b', 2).must_equal [MockElasticsearchRails::Model, ['a', {b: 2}], nil, :a, 'b', 2]
end
end
diff --git a/test/pagy/extras/searchkick_test.rb b/test/pagy/extras/searchkick_test.rb
index de6dc2f92..d2142ceed 100644
--- a/test/pagy/extras/searchkick_test.rb
+++ b/test/pagy/extras/searchkick_test.rb
@@ -16,15 +16,29 @@
end
it 'returns class and arguments' do
- MockSearchkick::Model.pagy_search('a', b:2).must_equal [MockSearchkick::Model, 'a', {b: 2}, nil]
+ MockSearchkick::Model.pagy_search('a', b:2).must_equal [MockSearchkick::Model, ['a', {b: 2}], nil]
args = MockSearchkick::Model.pagy_search('a', b:2){|a| a*2}
block = args[-1]
- args.must_equal [MockSearchkick::Model, 'a', {b: 2}, block]
+ args.must_equal [MockSearchkick::Model, ['a', {b: 2}], block]
+ end
+
+ it 'allows the term argument to be optional' do
+ MockSearchkick::Model.pagy_search(b:2).must_equal [MockSearchkick::Model, [{b: 2}], nil]
+ args = MockSearchkick::Model.pagy_search(b:2){|a| a*2}
+ block = args[-1]
+ args.must_equal [MockSearchkick::Model, [{b: 2}], block]
+ end
+
+ it 'adds an empty option hash' do
+ MockSearchkick::Model.pagy_search('a').must_equal [MockSearchkick::Model, ['a', {}], nil]
+ args = MockSearchkick::Model.pagy_search('a'){|a| a*2}
+ block = args[-1]
+ args.must_equal [MockSearchkick::Model, ['a', {}], block]
end
it 'adds the caller and arguments' do
- MockSearchkick::Model.pagy_search('a', b:2).results.must_equal [MockSearchkick::Model, 'a', {b: 2}, nil, :results]
- MockSearchkick::Model.pagy_search('a', b:2).a('b', 2).must_equal [MockSearchkick::Model, 'a', {b: 2}, nil, :a, 'b', 2]
+ MockSearchkick::Model.pagy_search('a', b:2).results.must_equal [MockSearchkick::Model, ['a', {b: 2}], nil, :results]
+ MockSearchkick::Model.pagy_search('a', b:2).a('b', 2).must_equal [MockSearchkick::Model, ['a', {b: 2}], nil, :a, 'b', 2]
end
end