Commit 17f9162bb6283e2cfa40960a67d1e70c6f58892e

Authored by Andrew
1 parent 9155938d
Exists in routing_queue

Fixed deletes with routing and callbacks - #1182

1 ## 3.1.2 [unreleased] 1 ## 3.1.2 [unreleased]
2 2
3 - Fixed deletes with routing and `async` callbacks 3 - Fixed deletes with routing and `async` callbacks
  4 +- Fixed deletes with routing and `queue` callbacks
4 5
5 ## 3.1.1 6 ## 3.1.1
6 7
lib/searchkick/process_batch_job.rb
@@ -3,6 +3,10 @@ module Searchkick @@ -3,6 +3,10 @@ module Searchkick
3 queue_as { Searchkick.queue_name } 3 queue_as { Searchkick.queue_name }
4 4
5 def perform(class_name:, record_ids:) 5 def perform(class_name:, record_ids:)
  6 + # separate routing from id
  7 + routing = Hash[record_ids.map { |r| r.split("|", 2) }]
  8 + record_ids = routing.keys
  9 +
6 klass = class_name.constantize 10 klass = class_name.constantize
7 scope = Searchkick.load_records(klass, record_ids) 11 scope = Searchkick.load_records(klass, record_ids)
8 scope = scope.search_import if scope.respond_to?(:search_import) 12 scope = scope.search_import if scope.respond_to?(:search_import)
@@ -10,7 +14,16 @@ module Searchkick @@ -10,7 +14,16 @@ module Searchkick
10 14
11 # determine which records to delete 15 # determine which records to delete
12 delete_ids = record_ids - records.map { |r| r.id.to_s } 16 delete_ids = record_ids - records.map { |r| r.id.to_s }
13 - delete_records = delete_ids.map { |id| m = klass.new; m.id = id; m } 17 + delete_records = delete_ids.map do |id|
  18 + m = klass.new
  19 + m.id = id
  20 + if routing[id]
  21 + m.define_singleton_method(:search_routing) do
  22 + routing[id]
  23 + end
  24 + end
  25 + m
  26 + end
14 27
15 # bulk reindex 28 # bulk reindex
16 index = klass.searchkick_index 29 index = klass.searchkick_index
lib/searchkick/record_indexer.rb
@@ -20,7 +20,14 @@ module Searchkick @@ -20,7 +20,14 @@ module Searchkick
20 raise Searchkick::Error, "Partial reindex not supported with queue option" 20 raise Searchkick::Error, "Partial reindex not supported with queue option"
21 end 21 end
22 22
23 - index.reindex_queue.push(record.id.to_s) 23 + # always pass routing in case record is deleted
  24 + # before the queue job runs
  25 + if record.respond_to?(:search_routing)
  26 + routing = record.search_routing
  27 + end
  28 +
  29 + value = [record.id.to_s, routing].join("|")
  30 + index.reindex_queue.push(value)
24 when :async 31 when :async
25 unless defined?(ActiveJob) 32 unless defined?(ActiveJob)
26 raise Searchkick::Error, "Active Job not found" 33 raise Searchkick::Error, "Active Job not found"
test/routing_test.rb
@@ -31,7 +31,7 @@ class RoutingTest < Minitest::Test @@ -31,7 +31,7 @@ class RoutingTest < Minitest::Test
31 end 31 end
32 32
33 def test_routing_queue 33 def test_routing_queue
34 - skip # unless defined?(ActiveJob) && defined?(Redis) 34 + skip unless defined?(ActiveJob) && defined?(Redis)
35 35
36 with_options(Song, routing: true, callbacks: :queue) do 36 with_options(Song, routing: true, callbacks: :queue) do
37 store_names ["Dollar Tree"], Song 37 store_names ["Dollar Tree"], Song