This repository has been archived by the owner on Apr 4, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
rummageable.rb
97 lines (83 loc) · 2.56 KB
/
rummageable.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
require 'benchmark'
require 'json'
require 'multi_json'
require 'null_logger'
require 'rest_client'
module Rummageable
class Index
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
def add(entry)
repeatedly do
make_request(:post, documents_url, MultiJson.encode([entry]))
end
end
def add_batch(entries)
entries.each_slice(@batch_size) do |batch|
repeatedly do
make_request(:post, documents_url, MultiJson.encode(batch))
end
end
end
def amend(link, changes)
repeatedly do
make_request(:post, documents_url(link: link), changes)
end
end
def delete(link)
repeatedly do
make_request(:delete, documents_url(link: link))
end
end
def delete_all
repeatedly do
make_request(:delete, documents_url + '?delete_all=1')
end
end
def commit
repeatedly do
make_request(:post, [@index_url, 'commit'].join('/'), MultiJson.encode({}))
end
end
private
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
def log_request(method, url, payload = nil)
@logger.info("Rummageable request: #{method.upcase} #{url}")
end
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
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
def documents_url(options = {})
parts = [@index_url, 'documents']
parts << CGI.escape(options[:link]) if options[:link]
parts.join('/')
end
end
end