lib/searchkick.rb in searchkick-1.1.1 vs lib/searchkick.rb in searchkick-1.1.2

- old
+ new

@@ -6,10 +6,11 @@ require "searchkick/results" require "searchkick/query" require "searchkick/reindex_job" require "searchkick/model" require "searchkick/tasks" +require "searchkick/middleware" require "searchkick/logging" if defined?(Rails) # background jobs begin require "active_job" @@ -25,15 +26,12 @@ class InvalidQueryError < Elasticsearch::Transport::Transport::Errors::BadRequest; end class DangerousOperation < Error; end class ImportError < Error; end class << self - attr_accessor :search_method_name - attr_accessor :wordnet_path - attr_accessor :timeout - attr_accessor :models - attr_writer :env + attr_accessor :search_method_name, :wordnet_path, :timeout, :models + attr_writer :client, :env, :search_timeout end self.search_method_name = :search self.wordnet_path = "/var/lib/wn_s.pl" self.timeout = 10 self.models = [] @@ -41,34 +39,95 @@ def self.client @client ||= Elasticsearch::Client.new( url: ENV["ELASTICSEARCH_URL"], transport_options: {request: {timeout: timeout}} - ) + ) do |f| + f.use Searchkick::Middleware + end end - class << self - attr_writer :client + def self.env + @env ||= ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development" end + def self.search_timeout + @search_timeout || timeout + end + def self.server_version @server_version ||= client.info["version"]["number"] end def self.enable_callbacks - Thread.current[:searchkick_callbacks_enabled] = true + self.callbacks_value = nil end def self.disable_callbacks - Thread.current[:searchkick_callbacks_enabled] = false + self.callbacks_value = false end def self.callbacks? Thread.current[:searchkick_callbacks_enabled].nil? || Thread.current[:searchkick_callbacks_enabled] end - def self.env - @env ||= ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development" + def self.callbacks(value) + if block_given? + previous_value = callbacks_value + begin + self.callbacks_value = value + yield + perform_bulk if callbacks_value == :bulk + ensure + self.callbacks_value = previous_value + end + else + self.callbacks_value = value + end + end + + # private + def self.queue_items(items) + queued_items.concat(items) + perform_bulk unless callbacks_value == :bulk + end + + # private + def self.perform_bulk + items = queued_items + clear_queued_items + perform_items(items) + end + + # private + def self.perform_items(items) + if items.any? + response = client.bulk(body: items) + if response["errors"] + first_item = response["items"].first + raise Searchkick::ImportError, (first_item["index"] || first_item["delete"])["error"] + end + end + end + + # private + def self.queued_items + Thread.current[:searchkick_queued_items] ||= [] + end + + # private + def self.clear_queued_items + Thread.current[:searchkick_queued_items] = [] + end + + # private + def self.callbacks_value + Thread.current[:searchkick_callbacks_enabled] + end + + # private + def self.callbacks_value=(value) + Thread.current[:searchkick_callbacks_enabled] = value end end # TODO find better ActiveModel hook ActiveModel::Callbacks.send(:include, Searchkick::Model)