Commit f075cfd84109b585496d96a484a42052ecf25c8f

Authored by Andrew Kane
1 parent 910ff735

Cleaner code

Showing 1 changed file with 44 additions and 39 deletions   Show diff stats
lib/searchkick/index.rb
... ... @@ -248,8 +248,6 @@ module Searchkick
248 248 end
249 249  
250 250 def import_scope(scope, resume: false, method_name: nil, async: false, batch: false, batch_id: nil, full: false)
251   - batch_size = @options[:batch_size] || 1000
252   -
253 251 # use scope for import
254 252 scope = scope.search_import if scope.respond_to?(:search_import)
255 253  
... ... @@ -257,32 +255,7 @@ module Searchkick
257 255 import_or_update scope.to_a, method_name, async
258 256 redis.srem(batches_key, batch_id) if batch_id && redis
259 257 elsif full && async
260   - if scope.respond_to?(:primary_key)
261   - # TODO expire Redis key
262   - primary_key = scope.primary_key
263   - starting_id = scope.minimum(primary_key) || 0
264   - max_id = scope.maximum(primary_key) || 0
265   - batches_count = ((max_id - starting_id + 1) / batch_size.to_f).ceil
266   -
267   - batches_count.times do |i|
268   - batch_id = i + 1
269   - min_id = starting_id + (i * batch_size)
270   - bulk_reindex_job scope, batch_id, min_id: min_id, max_id: min_id + batch_size - 1
271   - end
272   - else
273   - batch_id = 1
274   - items = []
275   - scope = scope.only(:_id) if scope.respond_to?(:only)
276   - scope.each do |item|
277   - items << item
278   - if items.length == batch_size
279   - bulk_reindex_job scope, batch_id, record_ids: items.map { |i| i.id.to_s }
280   - items = []
281   - batch_id += 1
282   - end
283   - end
284   - bulk_reindex_job scope, batch_id, record_ids: items.map { |i| i.id.to_s }
285   - end
  258 + full_reindex_async(scope)
286 259 elsif scope.respond_to?(:find_in_batches)
287 260 if resume
288 261 # use total docs instead of max id since there's not a great way
... ... @@ -298,18 +271,9 @@ module Searchkick
298 271 import_or_update batch, method_name, async
299 272 end
300 273 else
301   - # https://github.com/karmi/tire/blob/master/lib/tire/model/import.rb
302   - # use cursor for Mongoid
303   - items = []
304   - # TODO add resume
305   - scope.all.each do |item|
306   - items << item
307   - if items.length == batch_size
308   - import_or_update items, method_name, async
309   - items = []
310   - end
  274 + each_batch(scope) do |items|
  275 + import_or_update items, method_name, async
311 276 end
312   - import_or_update items, method_name, async
313 277 end
314 278 end
315 279  
... ... @@ -446,6 +410,43 @@ module Searchkick
446 410 end
447 411 end
448 412  
  413 + def full_reindex_async(scope)
  414 + if scope.respond_to?(:primary_key)
  415 + # TODO expire Redis key
  416 + primary_key = scope.primary_key
  417 + starting_id = scope.minimum(primary_key) || 0
  418 + max_id = scope.maximum(primary_key) || 0
  419 + batches_count = ((max_id - starting_id + 1) / batch_size.to_f).ceil
  420 +
  421 + batches_count.times do |i|
  422 + batch_id = i + 1
  423 + min_id = starting_id + (i * batch_size)
  424 + bulk_reindex_job scope, batch_id, min_id: min_id, max_id: min_id + batch_size - 1
  425 + end
  426 + else
  427 + batch_id = 1
  428 + scope = scope.only(:_id) if scope.respond_to?(:only)
  429 + each_batch(scope) do |items|
  430 + bulk_reindex_job scope, batch_id, record_ids: items.map { |i| i.id.to_s }
  431 + batch_id += 1
  432 + end
  433 + end
  434 + end
  435 +
  436 + def each_batch(scope)
  437 + # https://github.com/karmi/tire/blob/master/lib/tire/model/import.rb
  438 + # use cursor for Mongoid
  439 + items = []
  440 + scope.all.each do |item|
  441 + items << item
  442 + if items.length == batch_size
  443 + yield items
  444 + items = []
  445 + end
  446 + end
  447 + yield items if items.any?
  448 + end
  449 +
449 450 def bulk_reindex_job(scope, batch_id, options)
450 451 Searchkick::BulkReindexJob.perform_later({
451 452 class_name: scope.model_name.name,
... ... @@ -455,6 +456,10 @@ module Searchkick
455 456 redis.sadd(batches_key, batch_id) if redis
456 457 end
457 458  
  459 + def batch_size
  460 + @batch_size ||= @options[:batch_size] || 1000
  461 + end
  462 +
458 463 def with_retries
459 464 retries = 0
460 465  
... ...