esse 0.4.0.rc2 → 0.4.0.rc4

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: 378f933ddf41a9d403121e9272b87814a01ee9e462eea5b9ad556d1ba593e46a
4
- data.tar.gz: b3551d3361c380b750ca4e52c065d3372e6ec0c5762526f0f65894c097c79163
3
+ metadata.gz: 1b78836cea90af6c95e5bad1fec44c734733e21dab660cbb338a79546f2539d5
4
+ data.tar.gz: 0d1e073bbcc3ab1576d134ab4c70e2231767b836f59652f2f41b56e5943cc585
5
5
  SHA512:
6
- metadata.gz: f70d6495c34e176226a16e22da5e04b3ac74cce0d3469a3fa3ddf61c133a402d5577113839b0f4a52935cc71564be08930b529e25abb610c6bee1fcdadad77bb
7
- data.tar.gz: 1cd02580736bb222d0a6e3e7a26fbdc17e925dafbc8cda97eb87fb911c85f1dac4c32543ffdde3418fade6a632722492147278f6c293184d42cae6ccc2a3ee28
6
+ metadata.gz: 4118d2d6d2d163456f09c487b391abfb7522d4c1900e1517d94a8414b3f14587abf7e3fbb8292321933c767cb21b981c03f829ec2bd12f4cbc7327aa34cbe3e4
7
+ data.tar.gz: 80cdb7b8ccdb6ca158ca95207b0f9363b3edd19edddc6e9d29c168cb03ae04d520f110c752dd604b19665891cde2ce787db9eb18ca0119d155b90f1150527d38
@@ -102,6 +102,32 @@ module Esse
102
102
  to: colorize(event[:request].dig(:body, :dest, :index), :bold),
103
103
  runtime: formatted_runtime(event[:runtime])
104
104
  end
105
+
106
+ def elasticsearch_task(event)
107
+ running_time_in_nanos = event[:response].dig('task', 'running_time_in_nanos')
108
+ runtime = running_time_in_nanos ? "#{running_time_in_nanos / 1_000_000} ms" : 'unknown'
109
+
110
+ case event[:response]['completed']
111
+ when true
112
+ print_message '[%<runtime>s] Task %<task_id>s successfuly completed. %<total_runtime>s',
113
+ task_id: colorize(event[:request][:id], :bold),
114
+ runtime: formatted_runtime(event[:runtime]),
115
+ total_runtime: colorize("Elapsed time: #{runtime}", :bold)
116
+ when false
117
+ description = event[:response].dig('task', 'description')
118
+ print_message '[%<runtime>s] Task %<task_id>s still in progress: %<description>s. %<total_runtime>s',
119
+ task_id: colorize(event[:request][:id], :bold),
120
+ description: description,
121
+ runtime: formatted_runtime(event[:runtime]),
122
+ total_runtime: colorize("Elapsed time: #{runtime}", :bold)
123
+ end
124
+ end
125
+
126
+ def elasticsearch_cancel_task(event)
127
+ print_message '[%<runtime>s] Task %<task_id>s successfuly canceled',
128
+ task_id: colorize(event[:request][:id], :bold),
129
+ runtime: formatted_runtime(event[:runtime])
130
+ end
105
131
  end
106
132
  end
107
133
  end
@@ -15,13 +15,15 @@ module Esse
15
15
  * Delete the old index.
16
16
  DESC
17
17
  option :suffix, type: :string, default: nil, aliases: '-s', desc: 'Suffix to append to index name'
18
- option :import, type: :boolean, default: true, desc: 'Import documents before point alias to the new index'
19
- option :reindex, type: :boolean, default: false, desc: 'Use _reindex API to import documents from the old index to the new index'
18
+ option :import, desc: 'Import documents before point alias to the new index'
19
+ option :reindex, desc: 'Use _reindex API to import documents from the old index to the new index'
20
20
  option :optimize, type: :boolean, default: true, desc: 'Optimize index before import documents by disabling refresh_interval and setting number_of_replicas to 0'
21
21
  option :settings, type: :hash, default: nil, desc: 'List of settings to pass to the index class. Example: --settings=refresh_interval:1s,number_of_replicas:0'
22
22
  def reset(*index_classes)
23
23
  require_relative 'index/reset'
24
24
  opts = HashUtils.deep_transform_keys(options.to_h, &:to_sym)
25
+ opts[:reindex] = Parser::BoolOrHash.new(:reindex, default: false).parse(opts[:reindex])
26
+ opts[:import] = Parser::BoolOrHash.new(:import, default: true).parse(opts[:import])
25
27
  if opts[:import] && opts[:reindex]
26
28
  raise ArgumentError, 'You cannot use --import and --reindex together'
27
29
  end
@@ -100,7 +102,6 @@ module Esse
100
102
  option :preload_lazy_attributes, type: :string, default: nil, desc: 'Command separated list of lazy document attributes to preload using search API before the bulk import. Or pass `true` to preload all lazy attributes'
101
103
  option :eager_load_lazy_attributes, type: :string, default: nil, desc: 'Comma separated list of lazy document attributes to include to the bulk index request. Or pass `true` to include all lazy attributes'
102
104
  option :update_lazy_attributes, type: :string, default: nil, desc: 'Comma separated list of lazy document attributes to bulk update after the bulk index request Or pass `true` to include all lazy attributes'
103
-
104
105
  def import(*index_classes)
105
106
  require_relative 'index/import'
106
107
  opts = HashUtils.deep_transform_keys(options.to_h, &:to_sym)
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ module CLI
5
+ module Parser
6
+ FALSEY = [false, 'false', 'FALSE', 'f', 'F'].freeze
7
+ TRUTHY = [true, 'true', 'TRUE', 't', 'T'].freeze
8
+ HASH_MATCHER = /([\w\.\-]+)\:([^\s]+)/.freeze
9
+ HASH_SEPARATOR = /[\s]+/.freeze
10
+ ARRAY_SEPARATOR = /[\,]+/.freeze
11
+
12
+ class BoolOrHash
13
+ def initialize(key, default: nil)
14
+ @key = key
15
+ @default = default
16
+ end
17
+
18
+ def parse(input)
19
+ return true if TRUTHY.include?(input)
20
+ return false if FALSEY.include?(input)
21
+ return input if input.is_a?(Hash)
22
+ return @default if input.nil?
23
+ return true if @key.to_s == input
24
+ return @default unless HASH_MATCHER.match?(input)
25
+
26
+ compact_hash = input.to_s.split(HASH_SEPARATOR).each_with_object({}) do |pair, hash|
27
+ key, val = pair.match(HASH_MATCHER).captures
28
+ hash[key.to_sym] = may_array(val)
29
+ end
30
+ return @default if compact_hash.empty?
31
+
32
+ Esse::HashUtils.explode_keys(compact_hash)
33
+ end
34
+
35
+ private
36
+
37
+ def may_array(value)
38
+ return cast(value) unless ARRAY_SEPARATOR.match?(value)
39
+
40
+ value.split(ARRAY_SEPARATOR).map { |v| cast(v) }
41
+ end
42
+
43
+ def cast(value)
44
+ case value
45
+ when *TRUTHY then true
46
+ when *FALSEY then false
47
+ when /\A\d+\z/ then value.to_i
48
+ when /\A\d+\.\d+\z/ then value.to_f
49
+ else
50
+ value
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
data/lib/esse/cli.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'thor'
4
4
 
5
5
  require_relative 'primitives/output'
6
+ require_relative 'cli/parser/bool_or_hash'
6
7
  require_relative 'cli/index'
7
8
  require_relative 'cli/generate'
8
9
  require_relative 'cli/event_listener'
data/lib/esse/events.rb CHANGED
@@ -58,5 +58,9 @@ module Esse
58
58
  register_event 'elasticsearch.get'
59
59
  register_event 'elasticsearch.reindex'
60
60
  register_event 'elasticsearch.update_by_query'
61
+ register_event 'elasticsearch.delete_by_query'
62
+ register_event 'elasticsearch.tasks'
63
+ register_event 'elasticsearch.task'
64
+ register_event 'elasticsearch.cancel_task'
61
65
  end
62
66
  end
@@ -315,6 +315,20 @@ module Esse
315
315
  cluster.api.update_by_query(**definition)
316
316
  end
317
317
 
318
+ # Delete documents by query
319
+ #
320
+ # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
321
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
322
+ #
323
+ # @return [Hash] The elasticsearch response hash
324
+ def delete_by_query(suffix: nil, **options)
325
+ definition = {
326
+ index: index_name(suffix: suffix),
327
+ }.merge(options)
328
+ cluster.may_update_type!(definition)
329
+ cluster.api.delete_by_query(**definition)
330
+ end
331
+
318
332
  protected
319
333
 
320
334
  def document?(doc)
@@ -53,8 +53,11 @@ module Esse
53
53
 
54
54
  suffix ||= Esse.timestamp
55
55
  suffix = Esse.timestamp while index_exist?(suffix: suffix)
56
+ syncronous_import = true
57
+ syncronous_import = false if reindex.is_a?(Hash) && reindex[:wait_for_completion] == false
56
58
 
57
- if optimize && import
59
+ optimized_creation = optimize && syncronous_import && (import || reindex)
60
+ if optimized_creation
58
61
  definition = [settings_hash(settings: settings), mappings_hash].reduce(&:merge)
59
62
  number_of_replicas = definition.dig(Esse::SETTING_ROOT_KEY, :index, :number_of_replicas)
60
63
  refresh_interval = definition.dig(Esse::SETTING_ROOT_KEY, :index, :refresh_interval)
@@ -68,28 +71,55 @@ module Esse
68
71
  if index_exist? && aliases.none?
69
72
  cluster.api.delete_index(index: index_name)
70
73
  end
74
+
71
75
  if import
72
76
  import_kwargs = import.is_a?(Hash) ? import : {}
73
- import_kwargs[:refresh] ||= refresh if refresh
77
+ import_kwargs[:refresh] ||= refresh unless refresh.nil?
74
78
  import(**options, **import_kwargs, suffix: suffix)
75
79
  elsif reindex && (source_indexes = indices_pointing_to_alias).any?
76
80
  reindex_kwargs = reindex.is_a?(Hash) ? reindex : {}
77
- reindex_kwargs[:wait_for_completion] = true unless reindex_kwargs.key?(:wait_for_completion)
81
+ reindex_kwargs[:refresh] ||= refresh unless refresh.nil?
78
82
  source_indexes.each do |from|
79
- cluster.api.reindex(**options, body: { source: { index: from }, dest: { index: index_name(suffix: suffix) } }, refresh: refresh)
83
+ reindex(**reindex_kwargs, body: {
84
+ source: { index: from },
85
+ dest: { index: index_name(suffix: suffix) }
86
+ })
80
87
  end
81
88
  end
82
89
 
83
- if optimize && import && number_of_replicas != new_number_of_replicas || refresh_interval != new_refresh_interval
90
+ if optimized_creation && number_of_replicas != new_number_of_replicas || refresh_interval != new_refresh_interval
84
91
  update_settings(suffix: suffix, settings: settings)
85
92
  refresh(suffix: suffix)
86
93
  end
87
94
 
88
- update_aliases(suffix: suffix)
95
+ update_aliases(suffix: suffix) if syncronous_import
89
96
 
90
97
  true
91
98
  end
92
99
 
100
+ # Copies documents from a source to a destination.
101
+ #
102
+ # To avoid http timeout, we are sending the request with `wait_for_completion: false` and polling the task
103
+ # until it is completed.
104
+ #
105
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
106
+ def reindex(body:, wait_for_completion: true, scroll: '30m', poll_interval: 5, **options)
107
+ resp = cluster.api.reindex(**options, body: body, scroll: scroll, wait_for_completion: false)
108
+ return resp unless wait_for_completion
109
+
110
+ task_id = resp['task']
111
+ task = nil
112
+ begin
113
+ while (task = cluster.api.task(id: task_id))['completed'] == false
114
+ sleep poll_interval.to_i
115
+ end
116
+ rescue Interrupt => e
117
+ cluster.api.cancel_task(id: task_id)
118
+ raise e
119
+ end
120
+ task
121
+ end
122
+
93
123
  # Checks the index existance. Returns true or false
94
124
  #
95
125
  # UsersIndex.index_exist? #=> true
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ class Transport
5
+ module InstanceMethods
6
+ # Returns basic information about the health of the cluster.
7
+ #
8
+ # @option [List] :index Limit the information returned to a specific index
9
+ # @option [String] :expand_wildcards Whether to expand wildcard expression to concrete indices that are open, closed or both. (options: open, closed, hidden, none, all)
10
+ # @option [String] :level Specify the level of detail for returned information (options: cluster, indices, shards)
11
+ # @option [Boolean] :local Return local information, do not retrieve the state from master node (default: false)
12
+ # @option [Time] :master_timeout Explicit operation timeout for connection to master node
13
+ # @option [Time] :timeout Explicit operation timeout
14
+ # @option [String] :wait_for_active_shards Wait until the specified number of shards is active
15
+ # @option [String] :wait_for_nodes Wait until the specified number of nodes is available
16
+ # @option [String] :wait_for_events Wait until all currently queued events with the given priority are processed (options: immediate, urgent, high, normal, low, languid)
17
+ # @option [Boolean] :wait_for_no_relocating_shards Whether to wait until there are no relocating shards in the cluster
18
+ # @option [Boolean] :wait_for_no_initializing_shards Whether to wait until there are no initializing shards in the cluster
19
+ # @option [String] :wait_for_status Wait until cluster is in a specific state (options: green, yellow, red)
20
+ # @option [Hash] :headers Custom HTTP headers
21
+ #
22
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html
23
+ def health(**options)
24
+ coerce_exception { client.cluster.health(**options) }
25
+ end
26
+
27
+ # Returns information about the tasks currently executing on one or more nodes in the cluster.
28
+ #
29
+ # @option arguments [String] :format a short version of the Accept header, e.g. json, yaml
30
+ # @option arguments [List] :nodes A comma-separated list of node IDs or names to limit the returned information; use `_local` to return information from the node you're connecting to, leave empty to get information from all nodes
31
+ # @option arguments [List] :actions A comma-separated list of actions that should be returned. Leave empty to return all.
32
+ # @option arguments [Boolean] :detailed Return detailed task information (default: false)
33
+ # @option arguments [String] :parent_task_id Return tasks with specified parent task id (node_id:task_number). Set to -1 to return all.
34
+ # @option arguments [List] :h Comma-separated list of column names to display
35
+ # @option arguments [Boolean] :help Return help information
36
+ # @option arguments [List] :s Comma-separated list of column names or column aliases to sort by
37
+ # @option arguments [String] :time The unit in which to display time values (options: d, h, m, s, ms, micros, nanos)
38
+ # @option arguments [Boolean] :v Verbose mode. Display column headers
39
+ # @option arguments [Hash] :headers Custom HTTP headers
40
+ #
41
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html
42
+ def tasks(**options)
43
+ Esse::Events.instrument('elasticsearch.tasks') do |payload|
44
+ payload[:request] = options
45
+ payload[:response] = coerce_exception { client.tasks.list(**options) }
46
+ end
47
+ end
48
+
49
+ def task(id:, **options)
50
+ Esse::Events.instrument('elasticsearch.task') do |payload|
51
+ payload[:request] = { id: id }.merge(options)
52
+ payload[:response] = coerce_exception { client.tasks.get(task_id: id, **options) }
53
+ end
54
+ end
55
+
56
+ def cancel_task(id:, **options)
57
+ Esse::Events.instrument('elasticsearch.cancel_task') do |payload|
58
+ payload[:request] = { id: id }.merge(options)
59
+ payload[:response] = coerce_exception { client.tasks.cancel(task_id: id, **options) }
60
+ end
61
+ end
62
+ end
63
+
64
+ include InstanceMethods
65
+ end
66
+ end
@@ -192,6 +192,104 @@ module Esse
192
192
  response
193
193
  end
194
194
  end
195
+
196
+
197
+ # Performs an update on every document in the index without changing the source,
198
+ # for example to pick up a mapping change.
199
+ #
200
+ # @option arguments [List] :index A comma-separated list of index names to search; use `_all` or empty string to perform the operation on all indices (*Required*)
201
+ # @option arguments [String] :analyzer The analyzer to use for the query string
202
+ # @option arguments [Boolean] :analyze_wildcard Specify whether wildcard and prefix queries should be analyzed (default: false)
203
+ # @option arguments [String] :default_operator The default operator for query string query (AND or OR) (options: AND, OR)
204
+ # @option arguments [String] :df The field to use as default where no field prefix is given in the query string
205
+ # @option arguments [Number] :from Starting offset (default: 0)
206
+ # @option arguments [Boolean] :ignore_unavailable Whether specified concrete indices should be ignored when unavailable (missing or closed)
207
+ # @option arguments [Boolean] :allow_no_indices Whether to ignore if a wildcard indices expression resolves into no concrete indices. (This includes `_all` string or when no indices have been specified)
208
+ # @option arguments [String] :conflicts What to do when the update by query hits version conflicts? (options: abort, proceed)
209
+ # @option arguments [String] :expand_wildcards Whether to expand wildcard expression to concrete indices that are open, closed or both. (options: open, closed, hidden, none, all)
210
+ # @option arguments [Boolean] :lenient Specify whether format-based query failures (such as providing text to a numeric field) should be ignored
211
+ # @option arguments [String] :pipeline Ingest pipeline to set on index requests made by this action. (default: none)
212
+ # @option arguments [String] :preference Specify the node or shard the operation should be performed on (default: random)
213
+ # @option arguments [String] :q Query in the Lucene query string syntax
214
+ # @option arguments [List] :routing A comma-separated list of specific routing values
215
+ # @option arguments [Time] :scroll Specify how long a consistent view of the index should be maintained for scrolled search
216
+ # @option arguments [String] :search_type Search operation type (options: query_then_fetch, dfs_query_then_fetch)
217
+ # @option arguments [Time] :search_timeout Explicit timeout for each search request. Defaults to no timeout.
218
+ # @option arguments [Number] :size Deprecated, please use `max_docs` instead
219
+ # @option arguments [Number] :max_docs Maximum number of documents to process (default: all documents)
220
+ # @option arguments [List] :sort A comma-separated list of <field>:<direction> pairs
221
+ # @option arguments [List] :_source True or false to return the _source field or not, or a list of fields to return
222
+ # @option arguments [List] :_source_excludes A list of fields to exclude from the returned _source field
223
+ # @option arguments [List] :_source_includes A list of fields to extract and return from the _source field
224
+ # @option arguments [Number] :terminate_after The maximum number of documents to collect for each shard, upon reaching which the query execution will terminate early.
225
+ # @option arguments [List] :stats Specific 'tag' of the request for logging and statistical purposes
226
+ # @option arguments [Boolean] :version Specify whether to return document version as part of a hit
227
+ # @option arguments [Boolean] :version_type Should the document increment the version number (internal) on hit or not (reindex)
228
+ # @option arguments [Boolean] :request_cache Specify if request cache should be used for this request or not, defaults to index level setting
229
+ # @option arguments [Boolean] :refresh Should the affected indexes be refreshed?
230
+ # @option arguments [Time] :timeout Time each individual bulk request should wait for shards that are unavailable.
231
+ # @option arguments [String] :wait_for_active_shards Sets the number of shard copies that must be active before proceeding with the update by query operation. Defaults to 1, meaning the primary shard only. Set to `all` for all shard copies, otherwise set to any non-negative value less than or equal to the total number of copies for the shard (number of replicas + 1)
232
+ # @option arguments [Number] :scroll_size Size on the scroll request powering the update by query
233
+ # @option arguments [Boolean] :wait_for_completion Should the request should block until the update by query operation is complete.
234
+ # @option arguments [Number] :requests_per_second The throttle to set on this request in sub-requests per second. -1 means no throttle.
235
+ # @option arguments [Number|string] :slices The number of slices this task should be divided into. Defaults to 1, meaning the task isn't sliced into subtasks. Can be set to `auto`.
236
+ # @option arguments [Hash] :headers Custom HTTP headers
237
+ # @option arguments [Hash] :body The search definition using the Query DSL
238
+ #
239
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
240
+ def update_by_query(index:, **options)
241
+ throw_error_when_readonly!
242
+
243
+ Esse::Events.instrument('elasticsearch.update_by_query') do |payload|
244
+ payload[:request] = opts = options.merge(index: index)
245
+ payload[:response] = coerce_exception { client.update_by_query(**opts) }
246
+ end
247
+ end
248
+
249
+ # Deletes documents matching the provided query.
250
+ #
251
+ # @option arguments [List] :index A comma-separated list of index names to search; use `_all` or empty string to perform the operation on all indices
252
+ # @option arguments [String] :analyzer The analyzer to use for the query string
253
+ # @option arguments [Boolean] :analyze_wildcard Specify whether wildcard and prefix queries should be analyzed (default: false)
254
+ # @option arguments [String] :default_operator The default operator for query string query (AND or OR) (options: AND, OR)
255
+ # @option arguments [String] :df The field to use as default where no field prefix is given in the query string
256
+ # @option arguments [Number] :from Starting offset (default: 0)
257
+ # @option arguments [Boolean] :ignore_unavailable Whether specified concrete indices should be ignored when unavailable (missing or closed)
258
+ # @option arguments [Boolean] :allow_no_indices Whether to ignore if a wildcard indices expression resolves into no concrete indices. (This includes `_all` string or when no indices have been specified)
259
+ # @option arguments [String] :conflicts What to do when the delete by query hits version conflicts? (options: abort, proceed)
260
+ # @option arguments [String] :expand_wildcards Whether to expand wildcard expression to concrete indices that are open, closed or both. (options: open, closed, hidden, none, all)
261
+ # @option arguments [Boolean] :lenient Specify whether format-based query failures (such as providing text to a numeric field) should be ignored
262
+ # @option arguments [String] :preference Specify the node or shard the operation should be performed on (default: random)
263
+ # @option arguments [String] :q Query in the Lucene query string syntax
264
+ # @option arguments [List] :routing A comma-separated list of specific routing values
265
+ # @option arguments [Time] :scroll Specify how long a consistent view of the index should be maintained for scrolled search
266
+ # @option arguments [String] :search_type Search operation type (options: query_then_fetch, dfs_query_then_fetch)
267
+ # @option arguments [Time] :search_timeout Explicit timeout for each search request. Defaults to no timeout.
268
+ # @option arguments [Number] :max_docs Maximum number of documents to process (default: all documents)
269
+ # @option arguments [List] :sort A comma-separated list of <field>:<direction> pairs
270
+ # @option arguments [Number] :terminate_after The maximum number of documents to collect for each shard, upon reaching which the query execution will terminate early.
271
+ # @option arguments [List] :stats Specific 'tag' of the request for logging and statistical purposes
272
+ # @option arguments [Boolean] :version Specify whether to return document version as part of a hit
273
+ # @option arguments [Boolean] :request_cache Specify if request cache should be used for this request or not, defaults to index level setting
274
+ # @option arguments [Boolean] :refresh Should the affected indexes be refreshed?
275
+ # @option arguments [Time] :timeout Time each individual bulk request should wait for shards that are unavailable.
276
+ # @option arguments [String] :wait_for_active_shards Sets the number of shard copies that must be active before proceeding with the delete by query operation. Defaults to 1, meaning the primary shard only. Set to `all` for all shard copies, otherwise set to any non-negative value less than or equal to the total number of copies for the shard (number of replicas + 1)
277
+ # @option arguments [Number] :scroll_size Size on the scroll request powering the delete by query
278
+ # @option arguments [Boolean] :wait_for_completion Should the request should block until the delete by query is complete.
279
+ # @option arguments [Number] :requests_per_second The throttle for this request in sub-requests per second. -1 means no throttle.
280
+ # @option arguments [Number|string] :slices The number of slices this task should be divided into. Defaults to 1, meaning the task isn't sliced into subtasks. Can be set to `auto`.
281
+ # @option arguments [Hash] :headers Custom HTTP headers
282
+ # @option arguments [Hash] :body The search definition using the Query DSL (*Required*)
283
+ #
284
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
285
+ def delete_by_query(index:, **options)
286
+ throw_error_when_readonly!
287
+
288
+ Esse::Events.instrument('elasticsearch.delete_by_query') do |payload|
289
+ payload[:request] = opts = options.merge(index: index)
290
+ payload[:response] = coerce_exception { client.delete_by_query(**opts) }
291
+ end
292
+ end
195
293
  end
196
294
 
197
295
  include InstanceMethods
@@ -210,58 +210,6 @@ module Esse
210
210
  payload[:response] = coerce_exception { client.reindex(**opts) }
211
211
  end
212
212
  end
213
-
214
- # Performs an update on every document in the index without changing the source,
215
- # for example to pick up a mapping change.
216
- #
217
- # @option arguments [List] :index A comma-separated list of index names to search; use `_all` or empty string to perform the operation on all indices (*Required*)
218
- # @option arguments [String] :analyzer The analyzer to use for the query string
219
- # @option arguments [Boolean] :analyze_wildcard Specify whether wildcard and prefix queries should be analyzed (default: false)
220
- # @option arguments [String] :default_operator The default operator for query string query (AND or OR) (options: AND, OR)
221
- # @option arguments [String] :df The field to use as default where no field prefix is given in the query string
222
- # @option arguments [Number] :from Starting offset (default: 0)
223
- # @option arguments [Boolean] :ignore_unavailable Whether specified concrete indices should be ignored when unavailable (missing or closed)
224
- # @option arguments [Boolean] :allow_no_indices Whether to ignore if a wildcard indices expression resolves into no concrete indices. (This includes `_all` string or when no indices have been specified)
225
- # @option arguments [String] :conflicts What to do when the update by query hits version conflicts? (options: abort, proceed)
226
- # @option arguments [String] :expand_wildcards Whether to expand wildcard expression to concrete indices that are open, closed or both. (options: open, closed, hidden, none, all)
227
- # @option arguments [Boolean] :lenient Specify whether format-based query failures (such as providing text to a numeric field) should be ignored
228
- # @option arguments [String] :pipeline Ingest pipeline to set on index requests made by this action. (default: none)
229
- # @option arguments [String] :preference Specify the node or shard the operation should be performed on (default: random)
230
- # @option arguments [String] :q Query in the Lucene query string syntax
231
- # @option arguments [List] :routing A comma-separated list of specific routing values
232
- # @option arguments [Time] :scroll Specify how long a consistent view of the index should be maintained for scrolled search
233
- # @option arguments [String] :search_type Search operation type (options: query_then_fetch, dfs_query_then_fetch)
234
- # @option arguments [Time] :search_timeout Explicit timeout for each search request. Defaults to no timeout.
235
- # @option arguments [Number] :size Deprecated, please use `max_docs` instead
236
- # @option arguments [Number] :max_docs Maximum number of documents to process (default: all documents)
237
- # @option arguments [List] :sort A comma-separated list of <field>:<direction> pairs
238
- # @option arguments [List] :_source True or false to return the _source field or not, or a list of fields to return
239
- # @option arguments [List] :_source_excludes A list of fields to exclude from the returned _source field
240
- # @option arguments [List] :_source_includes A list of fields to extract and return from the _source field
241
- # @option arguments [Number] :terminate_after The maximum number of documents to collect for each shard, upon reaching which the query execution will terminate early.
242
- # @option arguments [List] :stats Specific 'tag' of the request for logging and statistical purposes
243
- # @option arguments [Boolean] :version Specify whether to return document version as part of a hit
244
- # @option arguments [Boolean] :version_type Should the document increment the version number (internal) on hit or not (reindex)
245
- # @option arguments [Boolean] :request_cache Specify if request cache should be used for this request or not, defaults to index level setting
246
- # @option arguments [Boolean] :refresh Should the affected indexes be refreshed?
247
- # @option arguments [Time] :timeout Time each individual bulk request should wait for shards that are unavailable.
248
- # @option arguments [String] :wait_for_active_shards Sets the number of shard copies that must be active before proceeding with the update by query operation. Defaults to 1, meaning the primary shard only. Set to `all` for all shard copies, otherwise set to any non-negative value less than or equal to the total number of copies for the shard (number of replicas + 1)
249
- # @option arguments [Number] :scroll_size Size on the scroll request powering the update by query
250
- # @option arguments [Boolean] :wait_for_completion Should the request should block until the update by query operation is complete.
251
- # @option arguments [Number] :requests_per_second The throttle to set on this request in sub-requests per second. -1 means no throttle.
252
- # @option arguments [Number|string] :slices The number of slices this task should be divided into. Defaults to 1, meaning the task isn't sliced into subtasks. Can be set to `auto`.
253
- # @option arguments [Hash] :headers Custom HTTP headers
254
- # @option arguments [Hash] :body The search definition using the Query DSL
255
- #
256
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
257
- def update_by_query(index:, **options)
258
- throw_error_when_readonly!
259
-
260
- Esse::Events.instrument('elasticsearch.update_by_query') do |payload|
261
- payload[:request] = opts = options.merge(index: index)
262
- payload[:response] = coerce_exception { client.update_by_query(**opts) }
263
- end
264
- end
265
213
  end
266
214
 
267
215
  include InstanceMethods
@@ -3,7 +3,7 @@
3
3
  module Esse
4
4
  class Transport
5
5
  require_relative './transport/aliases'
6
- require_relative './transport/health'
6
+ require_relative './transport/cluster'
7
7
  require_relative './transport/indices'
8
8
  require_relative './transport/search'
9
9
  require_relative './transport/documents'
data/lib/esse/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Esse
4
- VERSION = '0.4.0.rc2'
4
+ VERSION = '0.4.0.rc4'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: esse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.rc2
4
+ version: 0.4.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcos G. Zimmermann
8
8
  autorequire:
9
9
  bindir: exec
10
10
  cert_chain: []
11
- date: 2024-09-11 00:00:00.000000000 Z
11
+ date: 2024-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -228,6 +228,7 @@ files:
228
228
  - lib/esse/cli/index/update_aliases.rb
229
229
  - lib/esse/cli/index/update_mapping.rb
230
230
  - lib/esse/cli/index/update_settings.rb
231
+ - lib/esse/cli/parser/bool_or_hash.rb
231
232
  - lib/esse/cli/templates/collection.rb.erb
232
233
  - lib/esse/cli/templates/config.rb.erb
233
234
  - lib/esse/cli/templates/document.rb.erb
@@ -296,8 +297,8 @@ files:
296
297
  - lib/esse/template_loader.rb
297
298
  - lib/esse/transport.rb
298
299
  - lib/esse/transport/aliases.rb
300
+ - lib/esse/transport/cluster.rb
299
301
  - lib/esse/transport/documents.rb
300
- - lib/esse/transport/health.rb
301
302
  - lib/esse/transport/indices.rb
302
303
  - lib/esse/transport/search.rb
303
304
  - lib/esse/version.rb
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Esse
4
- class Transport
5
- module InstanceMethods
6
- # Returns basic information about the health of the cluster.
7
- #
8
- # @option [List] :index Limit the information returned to a specific index
9
- # @option [String] :expand_wildcards Whether to expand wildcard expression to concrete indices that are open, closed or both. (options: open, closed, hidden, none, all)
10
- # @option [String] :level Specify the level of detail for returned information (options: cluster, indices, shards)
11
- # @option [Boolean] :local Return local information, do not retrieve the state from master node (default: false)
12
- # @option [Time] :master_timeout Explicit operation timeout for connection to master node
13
- # @option [Time] :timeout Explicit operation timeout
14
- # @option [String] :wait_for_active_shards Wait until the specified number of shards is active
15
- # @option [String] :wait_for_nodes Wait until the specified number of nodes is available
16
- # @option [String] :wait_for_events Wait until all currently queued events with the given priority are processed (options: immediate, urgent, high, normal, low, languid)
17
- # @option [Boolean] :wait_for_no_relocating_shards Whether to wait until there are no relocating shards in the cluster
18
- # @option [Boolean] :wait_for_no_initializing_shards Whether to wait until there are no initializing shards in the cluster
19
- # @option [String] :wait_for_status Wait until cluster is in a specific state (options: green, yellow, red)
20
- # @option [Hash] :headers Custom HTTP headers
21
- #
22
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html
23
- def health(**options)
24
- coerce_exception { client.cluster.health(**options) }
25
- end
26
- end
27
-
28
- include InstanceMethods
29
- end
30
- end