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