esse 0.4.0.rc2 → 0.4.0.rc4

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 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