From d2b5ebac477181ee18d42662ebfb89bb022cae9d Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Sun, 20 Feb 2022 12:48:26 -0800 Subject: [PATCH] Improved indexer code [skip ci] --- lib/searchkick.rb | 2 +- lib/searchkick/indexer.rb | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/searchkick.rb b/lib/searchkick.rb index 92f8239..8192ac4 100644 --- a/lib/searchkick.rb +++ b/lib/searchkick.rb @@ -285,7 +285,7 @@ module Searchkick # private def self.indexer - Thread.current[:searchkick_indexer] ||= Searchkick::Indexer.new + Thread.current[:searchkick_indexer] ||= Indexer.new end # private diff --git a/lib/searchkick/indexer.rb b/lib/searchkick/indexer.rb index e1d99b2..3e3ad35 100644 --- a/lib/searchkick/indexer.rb +++ b/lib/searchkick/indexer.rb @@ -1,3 +1,5 @@ +# thread-local (technically fiber-local) indexer +# used to aggregate bulk callbacks across models module Searchkick class Indexer attr_reader :queued_items @@ -14,15 +16,19 @@ module Searchkick def perform items = @queued_items @queued_items = [] - if items.any? - response = Searchkick.client.bulk(body: items) - if response["errors"] - first_with_error = response["items"].map do |item| - (item["index"] || item["delete"] || item["update"]) - end.find { |item| item["error"] } - raise Searchkick::ImportError, "#{first_with_error["error"]} on item with id '#{first_with_error["_id"]}'" - end + + return if items.empty? + + response = Searchkick.client.bulk(body: items) + if response["errors"] + first_with_error = response["items"].map do |item| + (item["index"] || item["delete"] || item["update"]) + end.find { |item| item["error"] } + raise ImportError, "#{first_with_error["error"]} on item with id '#{first_with_error["_id"]}'" end + + # maybe return response in future + nil end end end -- libgit2 0.21.0