ignatiusreza/elasticsearch-model-transactional_callbacks

View on GitHub
lib/elasticsearch/model/transactional_callbacks/manager.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require_relative './bulk_indexing_job'
require_relative './queue'

module Elasticsearch
  module Model
    module TransactionalCallbacks
      module Manager # :nodoc:
        class << self
          def capture
            counter_stack.push(:lol)

            yield.tap do
              register_job if counter_stack.length == 1
            end
          ensure
            counter_stack.pop
          end

          def queue
            Thread.current[:elasticsearch_transactional_queue] ||= Queue.new
          end

          private

            def counter_stack
              Thread.current[:elasticsearch_transactional_counter] ||= []
            end

            def register_job
              return if queue.empty?

              BulkIndexingJob.perform_later(queue.to_h)

              queue.reset!
            end
        end
      end
    end
  end
end