class Rummageable::Index

Public Class Methods

new(base_url, index_name, options = {}) click to toggle source
# File lib/rummageable.rb, line 11
def initialize(base_url, index_name, options = {})
  @index_url = [base_url, index_name.sub(%r{^/}, '')].join('/')
  @logger = options[:logger] || NullLogger.instance
  @batch_size = options.fetch(:batch_size, 20)
  @retry_delay = options.fetch(:retry_delay, 2)
  @attempts = options.fetch(:attempts, 3)
end

Public Instance Methods

add(entry) click to toggle source
# File lib/rummageable.rb, line 19
def add(entry)
  repeatedly do
    make_request(:post, documents_url, MultiJson.encode([entry]))
  end
end
add_batch(entries) click to toggle source
# File lib/rummageable.rb, line 25
def add_batch(entries)
  entries.each_slice(@batch_size) do |batch|
    repeatedly do
      make_request(:post, documents_url, MultiJson.encode(batch))
    end
  end
end
amend(link, changes) click to toggle source
# File lib/rummageable.rb, line 33
def amend(link, changes)
  repeatedly do
    make_request(:post, documents_url(link: link), changes)
  end
end
commit() click to toggle source
# File lib/rummageable.rb, line 52
def commit
  repeatedly do
    make_request(:post, [@index_url, 'commit'].join('/'), MultiJson.encode({}))
  end
end
delete(id, options = {}) click to toggle source
# File lib/rummageable.rb, line 39
def delete(id, options = {})
  type = options[:type] || 'edition'
  repeatedly do
    make_request(:delete, documents_url(id: id, type: type))
  end
end
delete_all() click to toggle source
# File lib/rummageable.rb, line 46
def delete_all
  repeatedly do
    make_request(:delete, documents_url + '?delete_all=1')
  end
end

Private Instance Methods

documents_url(options = {}) click to toggle source
# File lib/rummageable.rb, line 92
def documents_url(options = {})
  options[:id] ||= options[:link]

  parts = [@index_url, 'documents']
  parts << CGI.escape(options[:type]) if options[:type]
  parts << CGI.escape(options[:id]) if options[:id]
  parts.join('/')
end
log_request(method, url, payload = nil) click to toggle source
# File lib/rummageable.rb, line 72
def log_request(method, url, payload = nil)
  @logger.info("Rummageable request: #{method.upcase} #{url}")
end
log_response(method, url, call_time, response) click to toggle source
# File lib/rummageable.rb, line 76
def log_response(method, url, call_time, response)
  time = sprintf('%.03f', call_time)
  result = response.length > 0 ? JSON.parse(response).fetch('result', 'UNKNOWN') : "UNKNOWN"
  @logger.info("Rummageable response: #{method.upcase} #{url} - time: #{time}s, result: #{result}")
end
make_request(method, *args) click to toggle source
# File lib/rummageable.rb, line 82
def make_request(method, *args)
  response = nil
  log_request(method, *args)
  call_time = Benchmark.realtime do
    response = RestClient.send(method, *args, content_type: :json, accept: :json)
  end
  log_response(method, args.first, call_time, response)
  response
end
repeatedly() { || ... } click to toggle source
# File lib/rummageable.rb, line 59
def repeatedly(&block)
  @attempts.times do |i|
    begin
      return yield
    rescue RestClient::RequestFailed, RestClient::RequestTimeout, RestClient::ServerBrokeConnection => e
      @logger.warn e.message
      raise if @attempts == i + 1
      @logger.info 'Retrying...'
      sleep(@retry_delay) if @retry_delay
    end
  end
end