diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb new file mode 100644 index 0000000..d585d9c --- /dev/null +++ b/config/initializers/sidekiq.rb @@ -0,0 +1,26 @@ +module SidekiqAddOns + def flushdb + Sidekiq.redis(&:flushdb) + end +end +Sidekiq.send(:extend, SidekiqAddOns) unless Sidekiq.respond_to?(:flushdb) + +opts = {} +opts[:url] = ENV["REDIS_URL"] if ENV.key?("REDIS_URL") + +if opts.key?(:url) + Sidekiq.configure_server do |config| + config.redis = opts + end + + Sidekiq.configure_client do |config| + config.redis = opts + end + + ActiveJob::Base.queue_adapter = :sidekiq unless Rails.env.test? +end + +Sidekiq.default_worker_options = { + unique: :until_executing, + unique_args: ->(args) { args.first.except("job_id") } +} diff --git a/config/initializers/sunspot.rb b/config/initializers/sunspot.rb new file mode 100644 index 0000000..61744e7 --- /dev/null +++ b/config/initializers/sunspot.rb @@ -0,0 +1,16 @@ +require "sunspot" +require "sunspot/queue/session_proxy" +require "sunspot/queue/active_job" + +Sunspot::Queue::SessionProxy.class_eval do + def commit_if_dirty(_ = false); end + + def commit_if_delete_dirty(_ = false); end + + def commit(_ = false); end +end + +Sunspot::Rails.configuration.instance_variable_get("@user_configuration")["auto_index_callback"] = "after_commit" + +backend = Sunspot::Queue::ActiveJob::Backend.new +Sunspot.session = Sunspot::Queue::SessionProxy.new(Sunspot.session, backend) diff --git a/lib/sunspot/queue/active_job.rb b/lib/sunspot/queue/active_job.rb new file mode 100644 index 0000000..5e4e5de --- /dev/null +++ b/lib/sunspot/queue/active_job.rb @@ -0,0 +1,13 @@ +require "sunspot/queue" + +module Sunspot::Queue + module ActiveJob + require "sunspot/queue/active_job/backend" + require "sunspot/queue/active_job/index_job" + require "sunspot/queue/active_job/removal_job" + end +end + +# Backwards compatability with 0.9.x. Will be removed by 1.0 / 0.11. +::Sunspot::Queue::IndexJob = ::Sunspot::Queue::ActiveJob::IndexJob +::Sunspot::Queue::RemovalJob = ::Sunspot::Queue::ActiveJob::RemovalJob diff --git a/lib/sunspot/queue/active_job/backend.rb b/lib/sunspot/queue/active_job/backend.rb new file mode 100644 index 0000000..82be2e6 --- /dev/null +++ b/lib/sunspot/queue/active_job/backend.rb @@ -0,0 +1,30 @@ +require "active_job" +require "sunspot/queue/active_job/index_job" +require "sunspot/queue/active_job/removal_job" + +module Sunspot::Queue::ActiveJob + class Backend + attr_reader :configuration + + def initialize(configuration = Sunspot::Queue.configuration) + @configuration = configuration + end + + def index(klass, id) + index_job.perform_later(klass, id) + end + + def remove(klass, id) + removal_job.perform_later(klass, id) + end + + private + def index_job + configuration.index_job || ::Sunspot::Queue::ActiveJob::IndexJob + end + + def removal_job + configuration.removal_job || ::Sunspot::Queue::ActiveJob::RemovalJob + end + end +end diff --git a/lib/sunspot/queue/active_job/index_job.rb b/lib/sunspot/queue/active_job/index_job.rb new file mode 100644 index 0000000..70dca61 --- /dev/null +++ b/lib/sunspot/queue/active_job/index_job.rb @@ -0,0 +1,14 @@ +require "sunspot/queue/helpers" + +module Sunspot::Queue::ActiveJob + class IndexJob < ApplicationJob + extend ::Sunspot::Queue::Helpers + queue_as :sunspot_index + + def perform(klass, id) + self.class.without_proxy do + self.class.constantize(klass).find(id).solr_index + end + end + end +end diff --git a/lib/sunspot/queue/active_job/removal_job.rb b/lib/sunspot/queue/active_job/removal_job.rb new file mode 100644 index 0000000..c0c4c45 --- /dev/null +++ b/lib/sunspot/queue/active_job/removal_job.rb @@ -0,0 +1,14 @@ +require "sunspot/queue/helpers" + +module Sunspot::Queue::ActiveJob + class RemovalJob < ApplicationJob + extend ::Sunspot::Queue::Helpers + queue_as :sunspot_index + + def perform(klass, id) + self.class.without_proxy do + ::Sunspot.remove_by_id(klass, id) + end + end + end +end