elastomer-client 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/elastomer-client.gemspec +1 -0
- data/lib/elastomer/client/bulk.rb +78 -37
- data/lib/elastomer/client/docs.rb +1 -1
- data/lib/elastomer/version.rb +1 -1
- data/test/client/bulk_test.rb +70 -0
- data/test/client/docs_test.rb +21 -5
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e82302d43fced9352f7a34365d970c5c68372244
|
4
|
+
data.tar.gz: 5a5125d962c5648390e13d20ff15de07dc63d117
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1359ce4cb196c178ad8015e9b351ac5cdc227dbdd1b68b4ba0eef12fba520e6e12f83b3112dadef8b07f3977736999ada69850e853f34be366d9aa89212ed4f
|
7
|
+
data.tar.gz: 9c3973a14dd4a064c15b012cde567ab12bc1692937d38969784ef728b60e61cd7f562d8cf77446beef089f6fa5fa2083ea3647c6628f5e9fc99e0f526896351d
|
data/elastomer-client.gemspec
CHANGED
@@ -18,12 +18,12 @@ module Elastomer
|
|
18
18
|
#
|
19
19
|
# Examples
|
20
20
|
#
|
21
|
-
# bulk(
|
21
|
+
# bulk(request_body, :index => 'default-index')
|
22
22
|
#
|
23
|
-
# bulk(
|
24
|
-
# b.index(
|
25
|
-
# b.index(
|
26
|
-
# b.delete(
|
23
|
+
# bulk(:index => 'default-index') do |b|
|
24
|
+
# b.index(document1)
|
25
|
+
# b.index(document2, :_type => 'default-type')
|
26
|
+
# b.delete(document3)
|
27
27
|
# ...
|
28
28
|
# end
|
29
29
|
#
|
@@ -118,58 +118,60 @@ module Elastomer
|
|
118
118
|
end
|
119
119
|
|
120
120
|
# Add an index action to the list of bulk actions to be performed when
|
121
|
-
# the bulk API call is made.
|
122
|
-
#
|
123
|
-
#
|
121
|
+
# the bulk API call is made. Parameters can be provided in the
|
122
|
+
# parameters hash (underscore prefix optional) or in the document
|
123
|
+
# hash (underscore prefix required).
|
124
124
|
#
|
125
125
|
# document - The document to index as a Hash or JSON encoded String
|
126
|
-
# params - Parameters for the index action (as a Hash)
|
126
|
+
# params - Parameters for the index action (as a Hash) (optional)
|
127
|
+
#
|
128
|
+
# Examples
|
129
|
+
# index({"foo" => "bar"}, {:_id => 1, :_type => "foo"}
|
130
|
+
# index({"foo" => "bar"}, {:id => 1, :type => "foo"}
|
131
|
+
# index("foo" => "bar", "_id" => 1, "_type" => "foo")
|
127
132
|
#
|
128
133
|
# Returns the response from the bulk call if one was made or nil.
|
129
134
|
def index( document, params = {} )
|
130
|
-
|
131
|
-
overrides = from_document(document)
|
132
|
-
params = params.merge overrides
|
133
|
-
end
|
134
|
-
params.delete(:_id) if params[:_id].nil? || params[:_id].to_s.empty?
|
135
|
-
|
135
|
+
params = prepare_params(document, params)
|
136
136
|
add_to_actions({:index => params}, document)
|
137
137
|
end
|
138
138
|
alias :add :index
|
139
139
|
|
140
140
|
# Add a create action to the list of bulk actions to be performed when
|
141
|
-
# the bulk API call is made.
|
142
|
-
# or
|
141
|
+
# the bulk API call is made. Parameters can be provided in the
|
142
|
+
# parameters hash (underscore prefix optional) or in the document
|
143
|
+
# hash (underscore prefix required).
|
143
144
|
#
|
144
145
|
# document - The document to create as a Hash or JSON encoded String
|
145
|
-
# params - Parameters for the create action (as a Hash)
|
146
|
+
# params - Parameters for the create action (as a Hash) (optional)
|
147
|
+
#
|
148
|
+
# Examples
|
149
|
+
# create({"foo" => "bar"}, {:_id => 1}
|
150
|
+
# create({"foo" => "bar"}, {:id => 1}
|
151
|
+
# create("foo" => "bar", "_id" => 1)
|
146
152
|
#
|
147
153
|
# Returns the response from the bulk call if one was made or nil.
|
148
154
|
def create( document, params )
|
149
|
-
|
150
|
-
overrides = from_document(document)
|
151
|
-
params = params.merge overrides
|
152
|
-
end
|
153
|
-
params.delete(:_id) if params[:_id].nil? || params[:_id].to_s.empty?
|
154
|
-
|
155
|
+
params = prepare_params(document, params)
|
155
156
|
add_to_actions({:create => params}, document)
|
156
157
|
end
|
157
158
|
|
158
159
|
# Add an update action to the list of bulk actions to be performed when
|
159
|
-
# the bulk API call is made.
|
160
|
-
# or
|
160
|
+
# the bulk API call is made. Parameters can be provided in the parameters
|
161
|
+
# hash (underscore prefix optional) or in the document hash (underscore
|
162
|
+
# prefix required).
|
161
163
|
#
|
162
164
|
# document - The document to update as a Hash or JSON encoded String
|
163
|
-
# params - Parameters for the update action (as a Hash)
|
165
|
+
# params - Parameters for the update action (as a Hash) (optional)
|
166
|
+
#
|
167
|
+
# Examples
|
168
|
+
# update({"foo" => "bar"}, {:_id => 1}
|
169
|
+
# update({"foo" => "bar"}, {:id => 1}
|
170
|
+
# update("foo" => "bar", "_id" => 1)
|
164
171
|
#
|
165
172
|
# Returns the response from the bulk call if one was made or nil.
|
166
173
|
def update( document, params )
|
167
|
-
|
168
|
-
overrides = from_document(document)
|
169
|
-
params = params.merge overrides
|
170
|
-
end
|
171
|
-
params.delete(:_id) if params[:_id].nil? || params[:_id].to_s.empty?
|
172
|
-
|
174
|
+
params = prepare_params(document, params)
|
173
175
|
add_to_actions({:update => params}, document)
|
174
176
|
end
|
175
177
|
|
@@ -177,10 +179,14 @@ module Elastomer
|
|
177
179
|
# the bulk API call is made.
|
178
180
|
#
|
179
181
|
# params - Parameters for the delete action (as a Hash)
|
182
|
+
#
|
183
|
+
# Examples
|
184
|
+
# delete(:_id => 1, :_type => 'foo')
|
180
185
|
#
|
181
186
|
# Returns the response from the bulk call if one was made or nil.
|
182
187
|
def delete( params )
|
183
|
-
|
188
|
+
params = prepare_params(nil, params)
|
189
|
+
add_to_actions({:delete => params})
|
184
190
|
end
|
185
191
|
|
186
192
|
# Immediately execute a bulk API call with the currently accumulated
|
@@ -201,6 +207,20 @@ module Elastomer
|
|
201
207
|
@actions.clear
|
202
208
|
end
|
203
209
|
|
210
|
+
SPECIAL_KEYS = %w[id type index version version_type routing parent percolator timestamp ttl retry_on_conflict]
|
211
|
+
SPECIAL_KEYS_HASH = SPECIAL_KEYS.inject({}) { |h, k| h[k] = "_#{k}"; h }
|
212
|
+
|
213
|
+
# Internal: convert special key parameters to their wire representation
|
214
|
+
# and apply any override document parameters.
|
215
|
+
def prepare_params(document, params)
|
216
|
+
params = convert_special_keys(params)
|
217
|
+
unless document.nil? || String === document
|
218
|
+
params = from_document(document).merge(params)
|
219
|
+
end
|
220
|
+
params.delete(:_id) if params[:_id].nil? || params[:_id].to_s.empty?
|
221
|
+
params
|
222
|
+
end
|
223
|
+
|
204
224
|
# Internal: Extract special keys for bulk indexing from the given
|
205
225
|
# `document`. The keys and their values are returned as a Hash from this
|
206
226
|
# method. If a value is `nil` then it will be ignored.
|
@@ -211,15 +231,36 @@ module Elastomer
|
|
211
231
|
def from_document( document )
|
212
232
|
opts = {}
|
213
233
|
|
214
|
-
|
234
|
+
SPECIAL_KEYS_HASH.values.each do |field|
|
215
235
|
key = field.to_sym
|
216
|
-
opts[key] = document.delete field if document
|
217
|
-
opts[key] = document.delete key if document
|
236
|
+
opts[key] = document.delete field if document.key? field
|
237
|
+
opts[key] = document.delete key if document.key? key
|
218
238
|
end
|
219
239
|
|
220
240
|
opts
|
221
241
|
end
|
222
242
|
|
243
|
+
# Internal: Convert incoming Ruby symbol keys to their special underscore
|
244
|
+
# versions. Maintains API compaibility with the `Docs` API for `index`,
|
245
|
+
# `create`, `update` and `delete`.
|
246
|
+
#
|
247
|
+
# :id -> :_id
|
248
|
+
# 'id' -> '_id'
|
249
|
+
#
|
250
|
+
# params - Hash.
|
251
|
+
#
|
252
|
+
# Returns a new params Hash with the special keys replaced.
|
253
|
+
def convert_special_keys(params)
|
254
|
+
new_params = params.dup
|
255
|
+
|
256
|
+
SPECIAL_KEYS_HASH.each do |k1, k2|
|
257
|
+
new_params[k2] = new_params.delete k1 if new_params.key? k1
|
258
|
+
new_params[k2.to_sym] = new_params.delete k1.to_sym if new_params.key? k1.to_sym
|
259
|
+
end
|
260
|
+
|
261
|
+
new_params
|
262
|
+
end
|
263
|
+
|
223
264
|
# Internal: Add the given `action` to the list of actions that will be
|
224
265
|
# performed by this bulk request. An optional `document` can also be
|
225
266
|
# given.
|
data/lib/elastomer/version.rb
CHANGED
data/test/client/bulk_test.rb
CHANGED
@@ -223,4 +223,74 @@ describe Elastomer::Client::Bulk do
|
|
223
223
|
|
224
224
|
assert_equal 10, h['hits']['total']
|
225
225
|
end
|
226
|
+
|
227
|
+
it 'uses :id from parameters' do
|
228
|
+
response = @index.bulk do |b|
|
229
|
+
document = { :_type => 'tweet', :author => 'pea53', :message => 'just a test tweet' }
|
230
|
+
params = { :id => 'foo' }
|
231
|
+
|
232
|
+
b.index document, params
|
233
|
+
end
|
234
|
+
|
235
|
+
assert_instance_of Fixnum, response['took']
|
236
|
+
|
237
|
+
items = response['items']
|
238
|
+
assert_bulk_index(items[0])
|
239
|
+
|
240
|
+
assert_equal 'foo', items[0]['index']['_id']
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'supports symbol and string parameters' do
|
244
|
+
response = @index.bulk do |b|
|
245
|
+
doc1 = { :author => 'pea53', :message => 'a tweet about foo' }
|
246
|
+
b.index doc1, { :id => 'foo', :type => 'tweet' }
|
247
|
+
|
248
|
+
doc2 = { :author => 'pea53', :message => 'a tweet about bar' }
|
249
|
+
b.index doc2, { 'id' => 'bar', 'type' => 'tweet' }
|
250
|
+
end
|
251
|
+
|
252
|
+
assert_instance_of Fixnum, response['took']
|
253
|
+
|
254
|
+
items = response['items']
|
255
|
+
assert_bulk_index(items[0])
|
256
|
+
assert_bulk_index(items[1])
|
257
|
+
|
258
|
+
assert_equal 'a tweet about foo', @index.docs('tweet').get(:id => 'foo')['_source']['message']
|
259
|
+
assert_equal 'a tweet about bar', @index.docs('tweet').get(:id => 'bar')['_source']['message']
|
260
|
+
end
|
261
|
+
|
262
|
+
it 'doesn\'t override parameters from the document' do
|
263
|
+
document = { :_id => 1, :_type => 'tweet', :author => 'pea53', :message => 'just a test tweet' }
|
264
|
+
params = { :id => 2 }
|
265
|
+
|
266
|
+
response = @index.bulk do |b|
|
267
|
+
b.index document, params
|
268
|
+
end
|
269
|
+
|
270
|
+
assert_instance_of Fixnum, response['took']
|
271
|
+
|
272
|
+
items = response['items']
|
273
|
+
assert_bulk_index(items[0])
|
274
|
+
|
275
|
+
refute_found @index.docs('tweet').get(:id => 1)
|
276
|
+
assert_equal 'just a test tweet', @index.docs('tweet').get(:id => 2)['_source']['message']
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'doesn\'t upgrade non-prefixed keys to parameters' do
|
280
|
+
document = { :id => 1, :type => 'book', :version => 5, :author => 'pea53', :message => 'just a test tweet' }
|
281
|
+
params = { :id => 2, :type => 'tweet' }
|
282
|
+
|
283
|
+
response = @index.bulk do |b|
|
284
|
+
b.index document, params
|
285
|
+
end
|
286
|
+
|
287
|
+
assert_instance_of Fixnum, response['took']
|
288
|
+
|
289
|
+
items = response['items']
|
290
|
+
assert_bulk_index(items[0])
|
291
|
+
|
292
|
+
assert_equal '2', items[0]['index']['_id']
|
293
|
+
assert_equal 'tweet', items[0]['index']['_type']
|
294
|
+
assert_equal 1, items[0]['index']['_version']
|
295
|
+
end
|
226
296
|
end
|
data/test/client/docs_test.rb
CHANGED
@@ -363,26 +363,42 @@ describe Elastomer::Client::Docs do
|
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
366
|
-
|
367
|
-
@docs.
|
366
|
+
it 'supports bulk operations with the same parameters as docs' do
|
367
|
+
response = @docs.bulk do |b|
|
368
|
+
populate!(b)
|
369
|
+
end
|
370
|
+
|
371
|
+
assert_instance_of Fixnum, response['took']
|
372
|
+
|
373
|
+
response = @docs.get(:id => 1, :type => 'doc1')
|
374
|
+
assert_found response
|
375
|
+
assert_equal 'mojombo', response['_source']['author']
|
376
|
+
end
|
377
|
+
|
378
|
+
# Create/index multiple documents.
|
379
|
+
#
|
380
|
+
# docs - An instance of Elastomer::Client::Docs or Elastomer::Client::Bulk. If
|
381
|
+
# nil uses the @docs instance variable.
|
382
|
+
def populate!(docs = @docs)
|
383
|
+
docs.add \
|
368
384
|
:_id => 1,
|
369
385
|
:_type => 'doc1',
|
370
386
|
:title => 'the author of gravatar',
|
371
387
|
:author => 'mojombo'
|
372
388
|
|
373
|
-
|
389
|
+
docs.add \
|
374
390
|
:_id => 2,
|
375
391
|
:_type => 'doc1',
|
376
392
|
:title => 'the author of resque',
|
377
393
|
:author => 'defunkt'
|
378
394
|
|
379
|
-
|
395
|
+
docs.add \
|
380
396
|
:_id => 1,
|
381
397
|
:_type => 'doc2',
|
382
398
|
:title => 'the author of logging',
|
383
399
|
:author => 'pea53'
|
384
400
|
|
385
|
-
|
401
|
+
docs.add \
|
386
402
|
:_id => 2,
|
387
403
|
:_type => 'doc2',
|
388
404
|
:title => 'the author of rubber-band',
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastomer-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Pease
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -109,6 +109,20 @@ dependencies:
|
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: debugger
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.6.8
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.6.8
|
112
126
|
description: |-
|
113
127
|
Elastomer is a low level API client for the
|
114
128
|
Elasticsearch HTTP interface.
|