Commit 873816e23a3de2904a4af24b725eb2a72d754b32

Authored by Andrew Kane
1 parent 815dee64

Moved logic to index [skip ci]

lib/searchkick/index.rb
@@ -209,7 +209,28 @@ module Searchkick @@ -209,7 +209,28 @@ module Searchkick
209 209
210 # reindex 210 # reindex
211 211
212 - def reindex(relation, method_name, scoped:, full: false, **options) 212 + def reindex(object, method_name: nil, full: false, **options)
  213 + if object.is_a?(Array)
  214 + mode = options.delete(:mode)
  215 + mode ||= Searchkick.callbacks_value || @options[:callbacks] || true
  216 + mode = :inline if mode == :bulk
  217 +
  218 + refresh = options.delete(:refresh)
  219 +
  220 + # note: always want full to be false here
  221 + result = RecordIndexer.new(self).reindex(object, mode: mode, method_name: method_name, full: false, **options)
  222 + self.refresh if refresh
  223 + return result
  224 + end
  225 +
  226 + if !object.respond_to?(:searchkick_klass)
  227 + raise Error, "Cannot reindex object"
  228 + end
  229 +
  230 + scoped = Searchkick.relation?(object)
  231 + # call searchkick_klass for inheritance
  232 + relation = scoped ? object.all : Searchkick.scope(object.searchkick_klass).all
  233 +
213 refresh = options.fetch(:refresh, !scoped) 234 refresh = options.fetch(:refresh, !scoped)
214 options.delete(:refresh) 235 options.delete(:refresh)
215 236
lib/searchkick/model.rb
@@ -26,11 +26,7 @@ module Searchkick @@ -26,11 +26,7 @@ module Searchkick
26 include(mod) 26 include(mod)
27 mod.module_eval do 27 mod.module_eval do
28 def reindex(method_name = nil, mode: nil, refresh: false) 28 def reindex(method_name = nil, mode: nil, refresh: false)
29 - mode ||= Searchkick.callbacks_value || self.class.searchkick_index.options[:callbacks] || true  
30 - mode = :inline if mode == :bulk  
31 - result = RecordIndexer.new(self.class.searchkick_index).reindex([self], mode: mode, method_name: method_name, single: true)  
32 - self.class.searchkick_index.refresh if refresh  
33 - result 29 + self.class.searchkick_index.reindex([self], method_name: method_name, mode: mode, refresh: refresh, single: true)
34 end 30 end
35 31
36 def similar(**options) 32 def similar(**options)
@@ -76,10 +72,7 @@ module Searchkick @@ -76,10 +72,7 @@ module Searchkick
76 alias_method :search_index, :searchkick_index unless method_defined?(:search_index) 72 alias_method :search_index, :searchkick_index unless method_defined?(:search_index)
77 73
78 def searchkick_reindex(method_name = nil, **options) 74 def searchkick_reindex(method_name = nil, **options)
79 - scoped = Searchkick.relation?(self)  
80 - # call searchkick_klass for inheritance  
81 - relation = scoped ? all : Searchkick.scope(searchkick_klass).all  
82 - searchkick_index.reindex(relation, method_name, scoped: scoped, **options) 75 + searchkick_index.reindex(self, method_name: method_name, **options)
83 end 76 end
84 alias_method :reindex, :searchkick_reindex unless method_defined?(:reindex) 77 alias_method :reindex, :searchkick_reindex unless method_defined?(:reindex)
85 78
test/reindex_test.rb
@@ -47,6 +47,14 @@ class ReindexTest < Minitest::Test @@ -47,6 +47,14 @@ class ReindexTest < Minitest::Test
47 assert_search "product", ["Product A"] 47 assert_search "product", ["Product A"]
48 end 48 end
49 49
  50 + def test_record_index
  51 + store_names ["Product A", "Product B"], reindex: false
  52 +
  53 + product = Product.find_by!(name: "Product A")
  54 + assert_equal true, Product.search_index.reindex([product], refresh: true)
  55 + assert_search "product", ["Product A"]
  56 + end
  57 +
50 def test_relation_inline 58 def test_relation_inline
51 store_names ["Product A"] 59 store_names ["Product A"]
52 store_names ["Product B", "Product C"], reindex: false 60 store_names ["Product B", "Product C"], reindex: false
@@ -142,6 +150,13 @@ class ReindexTest < Minitest::Test @@ -142,6 +150,13 @@ class ReindexTest < Minitest::Test
142 assert_search "product", ["Product A", "Product B"] 150 assert_search "product", ["Product A", "Product B"]
143 end 151 end
144 152
  153 + def test_relation_index
  154 + store_names ["Product A"]
  155 + store_names ["Product B", "Product C"], reindex: false
  156 + Product.search_index.reindex(Product.where(name: "Product B"), refresh: true)
  157 + assert_search "product", ["Product A", "Product B"]
  158 + end
  159 +
145 def test_full_async 160 def test_full_async
146 store_names ["Product A"], reindex: false 161 store_names ["Product A"], reindex: false
147 reindex = nil 162 reindex = nil
@@ -290,6 +305,13 @@ class ReindexTest < Minitest::Test @@ -290,6 +305,13 @@ class ReindexTest < Minitest::Test
290 Searchkick::ProcessQueueJob.perform_now(class_name: "Product") 305 Searchkick::ProcessQueueJob.perform_now(class_name: "Product")
291 end 306 end
292 307
  308 + def test_object_index
  309 + error = assert_raises(Searchkick::Error) do
  310 + Product.search_index.reindex(Object.new)
  311 + end
  312 + assert_equal "Cannot reindex object", error.message
  313 + end
  314 +
293 def test_transaction 315 def test_transaction
294 skip unless activerecord? 316 skip unless activerecord?
295 317