Commit c7074f13b33f6410c853e79be21ae6dc71e51a35
1 parent
fd149dbb
Exists in
master
and in
2 other branches
Improved resume code and fixed Mongoid code [skip ci]
Showing
5 changed files
with
28 additions
and
15 deletions
Show diff stats
lib/searchkick/record_indexer.rb
... | ... | @@ -34,7 +34,7 @@ module Searchkick |
34 | 34 | else |
35 | 35 | Searchkick::BulkReindexJob.perform_later( |
36 | 36 | class_name: records.first.class.searchkick_options[:class_name], |
37 | - record_ids: records.map(&:id), | |
37 | + record_ids: records.map { |r| r.id.to_s }, | |
38 | 38 | index_name: index.name, |
39 | 39 | method_name: method_name ? method_name.to_s : nil |
40 | 40 | ) | ... | ... |
lib/searchkick/relation_indexer.rb
... | ... | @@ -29,6 +29,8 @@ module Searchkick |
29 | 29 | return full_reindex_async(relation) |
30 | 30 | end |
31 | 31 | |
32 | + relation = resume_relation(relation) if resume | |
33 | + | |
32 | 34 | reindex_options = { |
33 | 35 | mode: mode, |
34 | 36 | method_name: method_name, |
... | ... | @@ -36,18 +38,6 @@ module Searchkick |
36 | 38 | } |
37 | 39 | record_indexer = RecordIndexer.new(index) |
38 | 40 | |
39 | - if resume | |
40 | - if relation.respond_to?(:primary_key) | |
41 | - # use total docs instead of max id since there's not a great way | |
42 | - # to get the max _id without scripting since it's a string | |
43 | - | |
44 | - # TODO use primary key and prefix with table name | |
45 | - relation = relation.where("id > ?", index.total_docs) | |
46 | - else | |
47 | - # TODO support resume for Mongoid | |
48 | - end | |
49 | - end | |
50 | - | |
51 | 41 | if relation.respond_to?(:find_in_batches) |
52 | 42 | relation.find_in_batches(batch_size: batch_size) do |items| |
53 | 43 | record_indexer.reindex(items, **reindex_options) |
... | ... | @@ -69,6 +59,18 @@ module Searchkick |
69 | 59 | |
70 | 60 | private |
71 | 61 | |
62 | + def resume_relation(relation) | |
63 | + if relation.respond_to?(:primary_key) | |
64 | + # use total docs instead of max id since there's not a great way | |
65 | + # to get the max _id without scripting since it's a string | |
66 | + | |
67 | + # TODO use primary key and prefix with table name | |
68 | + relation = relation.where("id > ?", index.total_docs) | |
69 | + else | |
70 | + raise Error, "Resume not supported for Mongoid" | |
71 | + end | |
72 | + end | |
73 | + | |
72 | 74 | def full_reindex_async(scope) |
73 | 75 | if scope.respond_to?(:primary_key) |
74 | 76 | # TODO expire Redis key | ... | ... |
test/reindex_test.rb
... | ... | @@ -163,7 +163,14 @@ class ReindexTest < Minitest::Test |
163 | 163 | end |
164 | 164 | |
165 | 165 | def test_full_resume |
166 | - assert Product.reindex(resume: true) | |
166 | + if mongoid? | |
167 | + error = assert_raises(Searchkick::Error) do | |
168 | + Product.reindex(resume: true) | |
169 | + end | |
170 | + assert_equal "Resume not supported for Mongoid", error.message | |
171 | + else | |
172 | + assert Product.reindex(resume: true) | |
173 | + end | |
167 | 174 | end |
168 | 175 | |
169 | 176 | def test_full_refresh | ... | ... |
test/support/mongoid.rb