search_flip 2.0.0.beta5 → 2.0.0.beta6

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: b0d1ed2d2431d99cbe9949cb24154bfda3c2188713eb7432a6a8f1c6d5e45fe8
4
- data.tar.gz: fbb8f6f7989552d6944a3d238ab3ca22c5ff2ca2c2c3ca7dddf1a3d8c4825ecc
3
+ metadata.gz: 47ca9a2ae9454e232a82a2d0ca91d58cb0f8d79e087795c0e9dbae5ad9ac6216
4
+ data.tar.gz: 721e6a0b0cc6abbf8d501e09903a1c9a3cb0ba526f1c9a403461ec38c3607f15
5
5
  SHA512:
6
- metadata.gz: 2f72caff2b7806d19d88d31ea8900fa739d10975d121d83245e7111552cbfc95fda81dde504f8b235ed4fdc6a9a6a3056029c404a638045d86a6c9fc606a23fd
7
- data.tar.gz: ea91ff174b46ad96bb29a94a9173ba9295ec503e731abc6e0956b1788dd73197aebc75c43eb302f59c6554822c5ebf2c7dee6006878462137ad1e57b1c512dad
6
+ metadata.gz: d0b4d33d00bb54b2d0b16fd1df450f93a412097312ac8726ab5f3d76bfd5c4c89a1374d6f61cf62920ebd4d86f209da330b20dd61a446c0d3bf5b25036b4cee3
7
+ data.tar.gz: 4d18ae080aa3dbdbdd024e5a3ce33529c002162bf9b5057848c7813546aab64dc82d2cd0ff91de26b155898559834bb8aabec961bea51488abe829ca5782dc52
data/README.md CHANGED
@@ -91,6 +91,7 @@ Available config options are:
91
91
  can be useful to separate the indices of e.g. testing and development environments.
92
92
  * `base_url` to tell search_flip how to connect to your cluster
93
93
  * `bulk_limit` a global limit for bulk requests
94
+ * `bulk_max_mb` a global limit for the payload of bulk requests
94
95
  * `auto_refresh` tells search_flip to automatically refresh an index after
95
96
  import, index, delete, etc operations. This is e.g. usuful for testing, etc.
96
97
  Defaults to false.
@@ -65,7 +65,8 @@ module SearchFlip
65
65
  :profile_value, :failsafe_value, :terminate_after_value, :timeout_value, :offset_value, :limit_value,
66
66
  :scroll_args, :highlight_values, :suggest_values, :custom_value, :source_value, :sort_values,
67
67
  :includes_values, :preload_values, :eager_load_values, :post_search_values, :post_must_values,
68
- :post_must_not_values, :post_should_values, :post_filter_values
68
+ :post_must_not_values, :post_should_values, :post_filter_values, :preference_value,
69
+ :search_type_value, :routing_value
69
70
  ]
70
71
 
71
72
  unsupported_methods.each do |unsupported_method|
@@ -1,5 +1,7 @@
1
1
 
2
2
  module SearchFlip
3
+ # @api private
4
+ #
3
5
  # The SearchFlip::Bulk class implements the bulk support, ie it collects
4
6
  # single requests and emits batches of requests.
5
7
  #
@@ -16,6 +18,8 @@ module SearchFlip
16
18
 
17
19
  attr_reader :url, :options, :ignore_errors
18
20
 
21
+ # @api private
22
+ #
19
23
  # Builds and yields a new Bulk object, ie initiates the buffer, yields,
20
24
  # sends batches of records each time the buffer is full, and sends a final
21
25
  # batch after the yielded code returns and there are still documents
@@ -33,8 +37,10 @@ module SearchFlip
33
37
  #
34
38
  # @param url [String] The endpoint to send bulk requests to
35
39
  # @param options [Hash] Options for the bulk requests
36
- # @option options batch_size [Fixnum] The maximum number of documents per bulk
40
+ # @option options bulk_limit [Fixnum] The maximum number of documents per bulk
37
41
  # request
42
+ # @option bulk_max_mb [Fixnum] The maximum payload size in megabytes per
43
+ # bulk request
38
44
  # @option options ignore_errors [Array, Fixnum] Errors that should be
39
45
  # ignored. If you eg want to ignore errors resulting from conflicts,
40
46
  # you can specify to ignore 409 here.
@@ -62,6 +68,8 @@ module SearchFlip
62
68
  upload if @num > 0
63
69
  end
64
70
 
71
+ # @api private
72
+ #
65
73
  # Adds an index request to the bulk batch.
66
74
  #
67
75
  # @param id [Fixnum, String] The document/record id
@@ -73,6 +81,8 @@ module SearchFlip
73
81
  perform :index, id, SearchFlip::JSON.generate(object), options
74
82
  end
75
83
 
84
+ # @api private
85
+ #
76
86
  # Adds an index request to the bulk batch
77
87
  #
78
88
  # @see #index
@@ -81,6 +91,8 @@ module SearchFlip
81
91
  index(*args)
82
92
  end
83
93
 
94
+ # @api private
95
+ #
84
96
  # Adds a create request to the bulk batch.
85
97
  #
86
98
  # @param id [Fixnum, String] The document/record id
@@ -92,6 +104,8 @@ module SearchFlip
92
104
  perform :create, id, SearchFlip::JSON.generate(object), options
93
105
  end
94
106
 
107
+ # @api private
108
+ #
95
109
  # Adds a update request to the bulk batch.
96
110
  #
97
111
  # @param id [Fixnum, String] The document/record id
@@ -103,6 +117,8 @@ module SearchFlip
103
117
  perform :update, id, SearchFlip::JSON.generate(object), options
104
118
  end
105
119
 
120
+ # @api private
121
+ #
106
122
  # Adds a delete request to the bulk batch.
107
123
  #
108
124
  # @param id [Fixnum, String] The document/record id
@@ -19,8 +19,10 @@ module SearchFlip
19
19
  include SearchFlip::Aggregatable
20
20
  extend Forwardable
21
21
 
22
- attr_accessor :target, :profile_value, :source_value, :sort_values, :highlight_values, :suggest_values, :offset_value, :limit_value,
23
- :includes_values, :eager_load_values, :preload_values, :failsafe_value, :scroll_args, :custom_value, :terminate_after_value, :timeout_value
22
+ attr_accessor :target, :profile_value, :source_value, :sort_values, :highlight_values, :suggest_values,
23
+ :offset_value, :limit_value, :includes_values, :eager_load_values, :preload_values, :failsafe_value,
24
+ :scroll_args, :custom_value, :terminate_after_value, :timeout_value, :preference_value,
25
+ :search_type_value, :routing_value
24
26
 
25
27
  # Creates a new criteria while merging the attributes (constraints,
26
28
  # settings, etc) of the current criteria with the attributes of another one
@@ -46,6 +48,9 @@ module SearchFlip
46
48
  criteria.limit_value = other.limit_value if other.limit_value
47
49
  criteria.scroll_args = other.scroll_args if other.scroll_args
48
50
  criteria.source_value = other.source_value if other.source_value
51
+ criteria.preference_value = other.preference_value if other.preference_value
52
+ criteria.search_type_value = other.search_type_value if other.search_type_value
53
+ criteria.routing_value = other.routing_value if other.routing_value
49
54
 
50
55
  criteria.sort_values = (criteria.sort_values || []) + other.sort_values if other.sort_values
51
56
  criteria.includes_values = (criteria.includes_values || []) + other.includes_values if other.includes_values
@@ -69,6 +74,54 @@ module SearchFlip
69
74
  end
70
75
  end
71
76
 
77
+ # Specifies a preference value for the request. Check out the elasticsearch
78
+ # docs for further details.
79
+ #
80
+ # @example
81
+ # CommentIndex.preference("_primary")
82
+ #
83
+ # @param value The preference value
84
+ #
85
+ # @return [SearchFlip::Criteria] A newly created extended criteria
86
+
87
+ def preference(value)
88
+ fresh.tap do |criteria|
89
+ criteria.preference_value = value
90
+ end
91
+ end
92
+
93
+ # Specifies the search type value for the request. Check out the elasticsearch
94
+ # docs for further details.
95
+ #
96
+ # @example
97
+ # CommentIndex.search_type("dfs_query_then_fetch")
98
+ #
99
+ # @param value The search type value
100
+ #
101
+ # @return [SearchFlip::Criteria] A newly created extended criteria
102
+
103
+ def search_type(value)
104
+ fresh.tap do |criteria|
105
+ criteria.search_type_value = value
106
+ end
107
+ end
108
+
109
+ # Specifies the routing value for the request. Check out the elasticsearch
110
+ # docs for further details.
111
+ #
112
+ # @example
113
+ # CommentIndex.routing("user_id")
114
+ #
115
+ # @param value The search type value
116
+ #
117
+ # @return [SearchFlip::Criteria] A newly created extended criteria
118
+
119
+ def routing(value)
120
+ fresh.tap do |criteria|
121
+ criteria.routing_value = value
122
+ end
123
+ end
124
+
72
125
  # Specifies a query timeout, such that the processing will be stopped after
73
126
  # that timeout and only the results calculated up to that point will be
74
127
  # processed and returned.
@@ -360,9 +413,9 @@ module SearchFlip
360
413
  dupped_request.delete(:size)
361
414
 
362
415
  if connection.version.to_i >= 5
363
- connection.http_client.post("#{target.type_url}/_delete_by_query", json: dupped_request)
416
+ connection.http_client.post("#{target.type_url}/_delete_by_query", params: request_params, json: dupped_request)
364
417
  else
365
- connection.http_client.delete("#{target.type_url}/_query", json: dupped_request)
418
+ connection.http_client.delete("#{target.type_url}/_query", params: request_params, json: dupped_request)
366
419
  end
367
420
 
368
421
  target.refresh if SearchFlip::Config[:auto_refresh]
@@ -722,21 +775,22 @@ module SearchFlip
722
775
  if connection.version.to_i >= 2
723
776
  http_request.post(
724
777
  "#{connection.base_url}/_search/scroll",
778
+ params: request_params,
725
779
  json: { scroll: scroll_args[:timeout], scroll_id: scroll_args[:id] }
726
780
  )
727
781
  else
728
782
  http_request
729
783
  .headers(content_type: "text/plain")
730
- .post("#{connection.base_url}/_search/scroll", params: { scroll: scroll_args[:timeout] }, body: scroll_args[:id])
784
+ .post("#{connection.base_url}/_search/scroll", params: request_params.merge(scroll: scroll_args[:timeout]), body: scroll_args[:id])
731
785
  end
732
786
  elsif scroll_args
733
787
  http_request.post(
734
788
  "#{target.type_url}/_search",
735
- params: { scroll: scroll_args[:timeout] },
789
+ params: request_params.merge(scroll: scroll_args[:timeout]),
736
790
  json: request
737
791
  )
738
792
  else
739
- http_request.post("#{target.type_url}/_search", json: request)
793
+ http_request.post("#{target.type_url}/_search", params: request_params, json: request)
740
794
  end
741
795
 
742
796
  SearchFlip::Response.new(self, http_response.parse)
@@ -824,5 +878,13 @@ module SearchFlip
824
878
  criteria = criteria.scroll(id: criteria.scroll_id, timeout: timeout)
825
879
  end
826
880
  end
881
+
882
+ def request_params
883
+ res = {}
884
+ res[:preference] = preference_value if preference_value
885
+ res[:search_type] = search_type_value if search_type_value
886
+ res[:routing] = routing_value if routing_value
887
+ res
888
+ end
827
889
  end
828
890
  end
@@ -252,7 +252,7 @@ module SearchFlip
252
252
  :includes, :eager_load, :preload, :sort, :resort, :order, :reorder, :offset, :limit, :paginate,
253
253
  :page, :per, :search, :highlight, :suggest, :custom, :find_in_batches, :find_results_in_batches,
254
254
  :find_each, :find_each_result, :failsafe, :total_entries, :total_count, :timeout, :terminate_after,
255
- :records, :results, :should, :should_not, :must, :must_not
255
+ :records, :results, :should, :should_not, :must, :must_not, :preference, :search_type, :routing
256
256
 
257
257
  # Override to specify the type name used within ElasticSearch. Recap,
258
258
  # this gem uses an individual index for each index class, because
@@ -1,5 +1,5 @@
1
1
 
2
2
  module SearchFlip
3
- VERSION = "2.0.0.beta5"
3
+ VERSION = "2.0.0.beta6"
4
4
  end
5
5
 
@@ -288,7 +288,8 @@ RSpec.describe SearchFlip::Aggregation do
288
288
  :profile_value, :failsafe_value, :terminate_after_value, :timeout_value, :offset_value, :limit_value,
289
289
  :scroll_args, :highlight_values, :suggest_values, :custom_value, :source_value, :sort_values,
290
290
  :includes_values, :preload_values, :eager_load_values, :post_search_values, :post_must_values,
291
- :post_must_not_values, :post_should_values, :post_filter_values
291
+ :post_must_not_values, :post_should_values, :post_filter_values, :preference_value,
292
+ :search_type_value, :routing_value
292
293
  ]
293
294
 
294
295
  unsupported_methods.each do |unsupported_method|
@@ -98,7 +98,7 @@ RSpec.describe SearchFlip::Bulk do
98
98
  end
99
99
  end
100
100
 
101
- expect(&block).not_to raise_error #(SearchFlip::ResponseError)
101
+ expect(&block).not_to raise_error
102
102
  end
103
103
  end
104
104
  end
@@ -35,7 +35,8 @@ RSpec.describe SearchFlip::Criteria do
35
35
  describe "assignments" do
36
36
  methods = [
37
37
  :profile_value, :failsafe_value, :terminate_after_value, :timeout_value,
38
- :offset_value, :limit_value, :scroll_args, :source_value
38
+ :offset_value, :limit_value, :scroll_args, :source_value, :preference_value,
39
+ :search_type_value, :routing_value
39
40
  ]
40
41
 
41
42
  methods.each do |method|
@@ -1023,5 +1024,32 @@ RSpec.describe SearchFlip::Criteria do
1023
1024
  expect(request[:custom_key]).to eq("custom_value")
1024
1025
  end
1025
1026
  end
1027
+
1028
+ describe "#preference" do
1029
+ it "sets the preference" do
1030
+ stub_request(:post, "http://127.0.0.1:9200/products/products/_search?preference=value")
1031
+ .to_return(status: 200, headers: { content_type: "application/json" }, body: "{}")
1032
+
1033
+ ProductIndex.preference("value").execute
1034
+ end
1035
+ end
1036
+
1037
+ describe "#search_type" do
1038
+ it "sets the search_type" do
1039
+ stub_request(:post, "http://127.0.0.1:9200/products/products/_search?search_type=value")
1040
+ .to_return(status: 200, headers: { content_type: "application/json" }, body: "{}")
1041
+
1042
+ ProductIndex.search_type("value").execute
1043
+ end
1044
+ end
1045
+
1046
+ describe "#routing" do
1047
+ it "sets the search_type" do
1048
+ stub_request(:post, "http://127.0.0.1:9200/products/products/_search?routing=value")
1049
+ .to_return(status: 200, headers: { content_type: "application/json" }, body: "{}")
1050
+
1051
+ ProductIndex.routing("value").execute
1052
+ end
1053
+ end
1026
1054
  end
1027
1055
 
@@ -14,7 +14,7 @@ RSpec.describe SearchFlip::Index do
14
14
  :find_in_batches, :highlight, :suggest, :custom, :find_each, :failsafe,
15
15
  :total_entries, :total_count, :terminate_after, :timeout, :records, :results,
16
16
  :should, :should_not, :must, :must_not, :find_each_result,
17
- :find_results_in_batches
17
+ :find_results_in_batches, :preference, :search_type, :routing
18
18
  ]
19
19
 
20
20
  methods.each do |method|
@@ -448,6 +448,39 @@ RSpec.describe SearchFlip::Index do
448
448
 
449
449
  expect(&bulk).not_to(change { ProductIndex.total_count })
450
450
  end
451
+
452
+ it "passes default options" do
453
+ allow(SearchFlip::Bulk).to receive(:new)
454
+
455
+ ProductIndex.bulk do |indexer|
456
+ indexer.index 1, id: 1
457
+ end
458
+
459
+ connection = ProductIndex.connection
460
+
461
+ expect(SearchFlip::Bulk).to have_received(:new).with(
462
+ anything,
463
+ http_client: connection.http_client,
464
+ bulk_limit: connection.bulk_limit,
465
+ bulk_max_mb: connection.bulk_max_mb
466
+ )
467
+ end
468
+
469
+ it "passes custom options" do
470
+ allow(SearchFlip::Bulk).to receive(:new)
471
+
472
+ options = {
473
+ bulk_limit: "bulk limit",
474
+ bulk_max_mb: "bulk max mb",
475
+ http_client: "http client"
476
+ }
477
+
478
+ ProductIndex.bulk(options) do |indexer|
479
+ indexer.index 1, id: 1
480
+ end
481
+
482
+ expect(SearchFlip::Bulk).to have_received(:new).with(anything, options)
483
+ end
451
484
  end
452
485
 
453
486
  describe ".connection" do
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: 2.0.0.beta5
4
+ version: 2.0.0.beta6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Vetter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-18 00:00:00.000000000 Z
11
+ date: 2019-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord