search_flip 4.0.0.beta10 → 4.0.0.beta12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef717835cd3022f20a81919662e6fa217d2ec51ba038dbf47adb8c306263cecd
4
- data.tar.gz: d4b7809f264bea9b0fa2b2f620bbe017798dc188078d76822baf55f42663ff07
3
+ metadata.gz: 3bde1fa6dcbf87a41164c9902a50fbc752cbf62d8a43c9d7a4b8d8e0ec1dd429
4
+ data.tar.gz: 16553bb4ee83207664394ed55ff69fc9be87d5394acb1120a5113b25e6ff6a64
5
5
  SHA512:
6
- metadata.gz: 6a03decbd40819248b0ed6c873f5fd876e97fc1fe2fca501ba71bffe833bcf9ba907360de08b10409fc8d59ff1859ad333ebb7c9e7f6533992baa61c91166221
7
- data.tar.gz: 9933d1b3f3eca29cee34f2145967b2cd9fe84d313caf95927bd1ec0ac3cdd438dc4b1f0ee04dbada71682a70274b595e422141d8b5e4a4a74677f2119e7fd225
6
+ metadata.gz: da4d0d174553926b52a6e6c7545f28b530e6ba6f6c4415ced8e3194dcb60c36704ba140e8a6de73685240c698e0389de0f0251249a2f36739c01b52f90a13aca
7
+ data.tar.gz: b8bf65256065d071b9b9ea169f81d658b537e69fcc800fa01e115fd045788c6b2cceef590155808da748b2d4906004bfbc2dc71aa6ec62a02b80b62290d79cc1
data/CHANGELOG.md CHANGED
@@ -11,6 +11,15 @@
11
11
  * Added `SearchFlip::Connection#get_cluster_settings` and
12
12
  `#update_cluster_settings`
13
13
 
14
+ ## v3.7.1
15
+
16
+ * Fix thread-safety issue of http-rb
17
+
18
+ ## v3.7.0
19
+
20
+ * Add `SearchFlip::Connection#bulk` to allow more clean bulk indexing to
21
+ multiple indices at once
22
+
14
23
  ## v3.6.0
15
24
 
16
25
  * Support Elasticsearch v8
data/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  Using SearchFlip it is dead-simple to create index classes that correspond to
10
10
  [Elasticsearch](https://www.elastic.co/) indices and to manipulate, query and
11
11
  aggregate these indices using a chainable, concise, yet powerful DSL. Finally,
12
- SearchFlip supports Elasticsearch 2.x, 5.x, 6.x, 7.x. Check section
12
+ SearchFlip supports Elasticsearch 2.x, 5.x, 6.x, 7.x and 8.x. Check section
13
13
  [Feature Support](#feature-support) for version dependent features.
14
14
 
15
15
  ```ruby
@@ -384,6 +384,51 @@ module SearchFlip
384
384
  raise e
385
385
  end
386
386
 
387
+ # Initiates and yields a bulk object, such that index, import, create,
388
+ # update and delete requests can be appended to the bulk request. Please
389
+ # note that you need to manually pass the desired index name as well as
390
+ # type name (depending on the Elasticsearch version) when using #bulk on a
391
+ # connection object or Elasticsearch will return an error. After the bulk
392
+ # requests are successfully processed all existing indices will
393
+ # subsequently be refreshed when auto_refresh is enabled.
394
+ #
395
+ # @see SearchFlip::Config See SearchFlip::Config for auto_refresh
396
+ #
397
+ # @example
398
+ # connection = SearchFlip::Connection.new
399
+ #
400
+ # connection.bulk ignore_errors: [409] do |bulk|
401
+ # bulk.create comment.id, CommentIndex.serialize(comment),
402
+ # _index: CommentIndex.index_name, version: comment.version, version_type: "external_gte"
403
+ #
404
+ # bulk.delete product.id, _index: ProductIndex.index_name, routing: product.user_id
405
+ #
406
+ # # ...
407
+ # end
408
+ #
409
+ # @param options [Hash] Specifies options regarding the bulk indexing
410
+ # @option options ignore_errors [Array] Specifies an array of http status
411
+ # codes that shouldn't raise any exceptions, like eg 409 for conflicts,
412
+ # ie when optimistic concurrency control is used.
413
+ # @option options raise [Boolean] Prevents any exceptions from being
414
+ # raised. Please note that this only applies to the bulk response, not to
415
+ # the request in general, such that connection errors, etc will still
416
+ # raise.
417
+
418
+ def bulk(options = {})
419
+ default_options = {
420
+ http_client: http_client,
421
+ bulk_limit: bulk_limit,
422
+ bulk_max_mb: bulk_max_mb
423
+ }
424
+
425
+ SearchFlip::Bulk.new("#{base_url}/_bulk", default_options.merge(options)) do |indexer|
426
+ yield indexer
427
+ end
428
+
429
+ refresh if SearchFlip::Config[:auto_refresh]
430
+ end
431
+
387
432
  # Returns the full Elasticsearch type URL, ie base URL, index name with
388
433
  # prefix and type name.
389
434
  #
@@ -59,6 +59,7 @@ module SearchFlip
59
59
 
60
60
  def execute(method, uri, options = {})
61
61
  final_request = plugins.inject(self) { |res, cur| cur.call(res, method, uri, options) }
62
+ final_request = final_request.headers({}) # Prevent thread-safety issue of http-rb: https://github.com/httprb/http/issues/558
62
63
  response = final_request.request.send(method, uri, options)
63
64
 
64
65
  raise SearchFlip::ResponseError.new(code: response.code, body: response.body.to_s) unless response.status.success?
@@ -601,7 +601,7 @@ module SearchFlip
601
601
  scope
602
602
  end
603
603
 
604
- # Initiates and yields the bulk object, such that index, import, create,
604
+ # Initiates and yields a bulk object, such that index, import, create,
605
605
  # update and delete requests can be appended to the bulk request. Sends a
606
606
  # refresh request afterwards if auto_refresh is enabled.
607
607
  #
@@ -1,3 +1,3 @@
1
1
  module SearchFlip
2
- VERSION = "4.0.0.beta10"
2
+ VERSION = "4.0.0.beta12"
3
3
  end
data/search_flip.gemspec CHANGED
@@ -15,7 +15,6 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
18
  spec.require_paths = ["lib"]
20
19
 
21
20
  spec.post_install_message = <<~MESSAGE
@@ -344,6 +344,96 @@ RSpec.describe SearchFlip::Connection do
344
344
  end
345
345
  end
346
346
 
347
+ describe "#bulk" do
348
+ it "imports objects to the specified indices" do
349
+ connection = SearchFlip::Connection.new
350
+
351
+ bulk = proc do
352
+ connection.bulk do |indexer|
353
+ indexer.index 1, { id: 1 }, _index: ProductIndex.index_name, ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
354
+ indexer.index 2, { id: 2 }, _index: ProductIndex.index_name, ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
355
+ indexer.index 1, { id: 1 }, _index: CommentIndex.index_name, ** connection.version.to_i < 8 ? { _type: CommentIndex.type_name } : {}
356
+ end
357
+ end
358
+
359
+ expect(&bulk).to(change { CommentIndex.total_count }.by(1).and(change { CommentIndex.total_count }.by(1)))
360
+ end
361
+
362
+ it "raises when no index is given" do
363
+ connection = SearchFlip::Connection.new
364
+
365
+ bulk = proc do
366
+ connection.bulk do |indexer|
367
+ indexer.index 1, id: 1
368
+ end
369
+ end
370
+
371
+ expect(&bulk).to raise_error(SearchFlip::ResponseError)
372
+ end
373
+
374
+ it "respects options" do
375
+ connection = SearchFlip::Connection.new
376
+
377
+ connection.bulk do |indexer|
378
+ indexer.index 1, { id: 1 }, _index: ProductIndex.index_name, ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
379
+ indexer.index 2, { id: 2 }, _index: ProductIndex.index_name, ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
380
+ end
381
+
382
+ bulk = proc do
383
+ connection.bulk do |indexer|
384
+ indexer.index 1, { id: 1 }, _index: ProductIndex.index_name, version: 1, version_type: "external", ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
385
+ indexer.index 2, { id: 2 }, _index: ProductIndex.index_name, version: 1, version_type: "external", ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
386
+ end
387
+ end
388
+
389
+ expect(&bulk).to raise_error(SearchFlip::Bulk::Error)
390
+
391
+ bulk = proc do
392
+ connection.bulk ignore_errors: [409] do |indexer|
393
+ indexer.index 1, { id: 1 }, _index: ProductIndex.index_name, version: 1, version_type: "external", ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
394
+ indexer.index 2, { id: 2 }, _index: ProductIndex.index_name, version: 1, version_type: "external", ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
395
+ end
396
+ end
397
+
398
+ expect(&bulk).not_to(change { ProductIndex.total_count })
399
+ end
400
+
401
+ it "passes default options" do
402
+ allow(SearchFlip::Bulk).to receive(:new)
403
+
404
+ connection = SearchFlip::Connection.new
405
+
406
+ connection.bulk do |indexer|
407
+ indexer.index 1, { id: 1 }, _index: ProductIndex.index_name, ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
408
+ end
409
+
410
+ expect(SearchFlip::Bulk).to have_received(:new).with(
411
+ anything,
412
+ http_client: connection.http_client,
413
+ bulk_limit: connection.bulk_limit,
414
+ bulk_max_mb: connection.bulk_max_mb
415
+ )
416
+ end
417
+
418
+ it "passes custom options" do
419
+ allow(SearchFlip::Bulk).to receive(:new)
420
+
421
+ connection = SearchFlip::Connection.new
422
+
423
+ options = {
424
+ bulk_limit: "bulk limit",
425
+ bulk_max_mb: "bulk max mb",
426
+ http_client: "http client"
427
+ }
428
+
429
+ connection.bulk(options) do |indexer|
430
+ indexer.index 1, { id: 1 }, _index: ProductIndex.index_name, ** connection.version.to_i < 8 ? { _type: ProductIndex.type_name } : {}
431
+ end
432
+
433
+ expect(SearchFlip::Bulk).to have_received(:new).with(anything, options)
434
+ end
435
+ end
436
+
347
437
  describe "#index_url" do
348
438
  it "returns the index url for the specified index" do
349
439
  connection = SearchFlip::Connection.new(base_url: "base_url")
data/spec/spec_helper.rb CHANGED
@@ -16,6 +16,8 @@ RSpec.configure do |config|
16
16
  TestIndex.delete_index if TestIndex.index_exists?
17
17
  ProductIndex.match_all.delete
18
18
  Product.delete_all
19
+ CommentIndex.match_all.delete
20
+ Comment.delete_all
19
21
  end
20
22
  end
21
23
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search_flip
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.beta10
4
+ version: 4.0.0.beta12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Vetter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-27 00:00:00.000000000 Z
11
+ date: 2022-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -291,18 +291,4 @@ rubygems_version: 3.2.3
291
291
  signing_key:
292
292
  specification_version: 4
293
293
  summary: Full-Featured Elasticsearch Ruby Client with a Chainable DSL
294
- test_files:
295
- - spec/delegate_matcher.rb
296
- - spec/search_flip/aggregation_spec.rb
297
- - spec/search_flip/aws_sigv4_plugin_spec.rb
298
- - spec/search_flip/bulk_spec.rb
299
- - spec/search_flip/connection_spec.rb
300
- - spec/search_flip/criteria_spec.rb
301
- - spec/search_flip/http_client_spec.rb
302
- - spec/search_flip/index_spec.rb
303
- - spec/search_flip/json_spec.rb
304
- - spec/search_flip/model_spec.rb
305
- - spec/search_flip/null_instrumenter_spec.rb
306
- - spec/search_flip/response_spec.rb
307
- - spec/search_flip/result_spec.rb
308
- - spec/spec_helper.rb
294
+ test_files: []