From 0fc0957223e7f4bd729e6edcf613c9836096ee0b Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Wed, 9 Mar 2022 10:48:41 -0500 Subject: [PATCH] Added order and reorder methods on relation --- lib/searchkick/relation.rb | 31 +++++++++++++++++++++++++++++++ test/order_test.rb | 7 +++++++ test/support/helpers.rb | 4 ++++ 3 files changed, 42 insertions(+), 0 deletions(-) diff --git a/lib/searchkick/relation.rb b/lib/searchkick/relation.rb index 2ae84a8..a2472f5 100644 --- a/lib/searchkick/relation.rb +++ b/lib/searchkick/relation.rb @@ -117,6 +117,37 @@ module Searchkick end # experimental + def order(value) + clone.order!(value) + end + + # experimental + def order!(value) + check_loaded + if @options[:order] + order = @options[:order] + order = [order] unless order.is_a?(Array) + order << value + @options[:order] = order + else + @options[:order] = value + end + self + end + + # experimental + def reorder(value) + clone.reorder!(value) + end + + # experimental + def reorder!(value) + check_loaded + @options[:order] = value + self + end + + # experimental def only(*keys) Relation.new(@model, @term, **@options.slice(*keys)) end diff --git a/test/order_test.rb b/test/order_test.rb index fb159f6..9ac5c5a 100644 --- a/test/order_test.rb +++ b/test/order_test.rb @@ -4,11 +4,13 @@ class OrderTest < Minitest::Test def test_hash store_names ["Product A", "Product B", "Product C", "Product D"] assert_order "product", ["Product D", "Product C", "Product B", "Product A"], order: {name: :desc} + assert_order_relation ["Product D", "Product C", "Product B", "Product A"], Product.search("product").order(name: :desc) end def test_string store_names ["Product A", "Product B", "Product C", "Product D"] assert_order "product", ["Product A", "Product B", "Product C", "Product D"], order: "name" + assert_order_relation ["Product A", "Product B", "Product C", "Product D"], Product.search("product").order("name") end def test_multiple @@ -18,15 +20,20 @@ class OrderTest < Minitest::Test {name: "Product C", color: "red", store_id: 2} ] assert_order "product", ["Product A", "Product B", "Product C"], order: {color: :asc, store_id: :desc} + assert_order_relation ["Product A", "Product B", "Product C"], Product.search("product").order(color: :asc, store_id: :desc) + assert_order_relation ["Product A", "Product B", "Product C"], Product.search("product").order(color: :asc).order(store_id: :desc) + assert_order_relation ["Product B", "Product C", "Product A"], Product.search("product").order(color: :asc).reorder(store_id: :desc) end def test_unmapped_type Product.search_index.refresh assert_order "product", [], order: {not_mapped: {unmapped_type: "long"}} + assert_order_relation [], Product.search("product").order(not_mapped: {unmapped_type: "long"}) end def test_array store [{name: "San Francisco", latitude: 37.7833, longitude: -122.4167}] assert_order "francisco", ["San Francisco"], order: [{_geo_distance: {location: "0,0"}}] + assert_order_relation ["San Francisco"], Product.search("francisco").order([{_geo_distance: {location: "0,0"}}]) end end diff --git a/test/support/helpers.rb b/test/support/helpers.rb index dce744d..6ce9f0e 100644 --- a/test/support/helpers.rb +++ b/test/support/helpers.rb @@ -61,6 +61,10 @@ class Minitest::Test assert_equal expected, model.search(term, **options).map(&:name) end + def assert_order_relation(expected, relation) + assert_equal expected, relation.map(&:name) + end + def assert_equal_scores(term, options = {}, model = default_model) assert_equal 1, model.search(term, **options).hits.map { |a| a["_score"] }.uniq.size end -- libgit2 0.21.0