esse 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/esse/cli/event_listener.rb +4 -5
  3. data/lib/esse/cli/generate.rb +14 -16
  4. data/lib/esse/cli/index/close.rb +1 -1
  5. data/lib/esse/cli/index/create.rb +1 -1
  6. data/lib/esse/cli/index/delete.rb +1 -1
  7. data/lib/esse/cli/index/import.rb +2 -2
  8. data/lib/esse/cli/index/open.rb +1 -1
  9. data/lib/esse/cli/index/reset.rb +1 -1
  10. data/lib/esse/cli/index/update_aliases.rb +2 -2
  11. data/lib/esse/cli/index/update_mapping.rb +8 -3
  12. data/lib/esse/cli/index/update_settings.rb +1 -1
  13. data/lib/esse/cli/index.rb +9 -4
  14. data/lib/esse/cli/templates/collection.rb.erb +6 -6
  15. data/lib/esse/cli/templates/{serializer.rb.erb → document.rb.erb} +6 -6
  16. data/lib/esse/cli/templates/index.rb.erb +39 -34
  17. data/lib/esse/cli.rb +5 -0
  18. data/lib/esse/cluster.rb +38 -12
  19. data/lib/esse/core.rb +7 -3
  20. data/lib/esse/deprecations/cluster.rb +5 -5
  21. data/lib/esse/deprecations/deprecate.rb +29 -0
  22. data/lib/esse/deprecations/index.rb +21 -3
  23. data/lib/esse/deprecations/index_backend_delegator.rb +217 -0
  24. data/lib/esse/deprecations/repository.rb +19 -4
  25. data/lib/esse/deprecations/repository_backend_delegator.rb +110 -0
  26. data/lib/esse/deprecations/serializer.rb +14 -0
  27. data/lib/esse/deprecations.rb +4 -0
  28. data/lib/esse/{serializer.rb → document.rb} +17 -2
  29. data/lib/esse/dynamic_template.rb +4 -0
  30. data/lib/esse/errors.rb +8 -1
  31. data/lib/esse/events.rb +13 -5
  32. data/lib/esse/hash_document.rb +1 -1
  33. data/lib/esse/import/bulk.rb +21 -11
  34. data/lib/esse/index/aliases.rb +50 -0
  35. data/lib/esse/index/attributes.rb +14 -5
  36. data/lib/esse/index/base.rb +17 -53
  37. data/lib/esse/index/documents.rb +236 -0
  38. data/lib/esse/index/indices.rb +171 -0
  39. data/lib/esse/index/object_document_mapper.rb +0 -59
  40. data/lib/esse/index/type.rb +2 -3
  41. data/lib/esse/index.rb +4 -3
  42. data/lib/esse/null_document.rb +1 -1
  43. data/lib/esse/repository/{backend.rb → documents.rb} +2 -3
  44. data/lib/esse/repository/object_document_mapper.rb +20 -20
  45. data/lib/esse/repository.rb +1 -2
  46. data/lib/esse/search/query.rb +8 -8
  47. data/lib/esse/template_loader.rb +1 -1
  48. data/lib/esse/transport/aliases.rb +36 -0
  49. data/lib/esse/transport/documents.rb +199 -0
  50. data/lib/esse/transport/health.rb +30 -0
  51. data/lib/esse/transport/indices.rb +192 -0
  52. data/lib/esse/{client_proxy → transport}/search.rb +9 -5
  53. data/lib/esse/transport.rb +44 -0
  54. data/lib/esse/version.rb +1 -1
  55. metadata +28 -28
  56. data/lib/esse/backend/index/aliases.rb +0 -73
  57. data/lib/esse/backend/index/close.rb +0 -54
  58. data/lib/esse/backend/index/create.rb +0 -67
  59. data/lib/esse/backend/index/delete.rb +0 -39
  60. data/lib/esse/backend/index/documents.rb +0 -270
  61. data/lib/esse/backend/index/existance.rb +0 -22
  62. data/lib/esse/backend/index/open.rb +0 -54
  63. data/lib/esse/backend/index/refresh.rb +0 -45
  64. data/lib/esse/backend/index/reset.rb +0 -33
  65. data/lib/esse/backend/index/update.rb +0 -143
  66. data/lib/esse/backend/index.rb +0 -56
  67. data/lib/esse/backend/repository_backend.rb +0 -105
  68. data/lib/esse/client_proxy.rb +0 -32
  69. data/lib/esse/index/backend.rb +0 -14
@@ -3,17 +3,35 @@
3
3
  module Esse
4
4
  class Index
5
5
  class << self
6
- extend Gem::Deprecate
6
+ extend Esse::Deprecations::Deprecate
7
7
 
8
8
  def define_type(name, *args, **kwargs, &block)
9
9
  repository(name, *args, **kwargs, &block)
10
10
  end
11
- deprecate :define_type, :repository, 2022, 8
11
+ deprecate :define_type, :repository, 2023, 12
12
12
 
13
13
  def type_hash
14
14
  repo_hash
15
15
  end
16
- deprecate :type_hash, :repo_hash, 2022, 8
16
+ deprecate :type_hash, :repo_hash, 2023, 12
17
+
18
+ def index_version
19
+ index_suffix
20
+ end
21
+ deprecate :index_version, :index_suffix, 2023, 12
22
+
23
+ def index_version=(value)
24
+ self.index_suffix = value
25
+ end
26
+ deprecate :index_version=, :index_suffix=, 2023, 12
27
+
28
+ def elasticsearch
29
+ Esse::Deprecations::IndexBackendDelegator.new(:elasticsearch, self)
30
+ end
31
+
32
+ def backend
33
+ Esse::Deprecations::IndexBackendDelegator.new(:backend, self)
34
+ end
17
35
  end
18
36
  end
19
37
  end
@@ -0,0 +1,217 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ module Deprecations
5
+ class IndexBackendDelegator
6
+ extend Esse::Deprecations::Deprecate
7
+
8
+ def initialize(namespace, index)
9
+ @namespace = namespace
10
+ @index = index
11
+ end
12
+
13
+ def aliases(**kwargs)
14
+ warning("#{@index}.#{@namespace}.aliases", "#{@index}.aliases", 2023, 12)
15
+ @index.aliases(**kwargs)
16
+ end
17
+
18
+ def indices(**kwargs)
19
+ warning("#{@index}.#{@namespace}.indices", "#{@index}.indices_pointing_to_alias", 2023, 12)
20
+ @index.indices_pointing_to_alias(**kwargs)
21
+ end
22
+
23
+ def update_aliases!(**kwargs)
24
+ warning("#{@index}.#{@namespace}.update_aliases!", "#{@index}.update_aliases", 2023, 12)
25
+ @index.update_aliases(**kwargs)
26
+ end
27
+
28
+ def update_aliases(**kwargs)
29
+ warning("#{@index}.#{@namespace}.update_aliases", "#{@index}.update_aliases", 2023, 12)
30
+
31
+ @index.update_aliases(**kwargs)
32
+ rescue Esse::Transport::NotFoundError
33
+ { 'errors' => true }
34
+ end
35
+
36
+ def create_index(**kwargs)
37
+ warning("#{@index}.#{@namespace}.create_index", "#{@index}.create_index", 2023, 12)
38
+
39
+ @index.create_index(**kwargs)
40
+ end
41
+
42
+ def create_index!(**kwargs)
43
+ warning("#{@index}.#{@namespace}.create_index!", "#{@index}.create_index", 2023, 12)
44
+
45
+ @index.create_index(**kwargs)
46
+ end
47
+
48
+ def close(**kwargs)
49
+ warning("#{@index}.#{@namespace}.close", "#{@index}.close", 2023, 12)
50
+
51
+ @index.close(**kwargs)
52
+ end
53
+
54
+ def close!(**kwargs)
55
+ warning("#{@index}.#{@namespace}.close!", "#{@index}.close", 2023, 12)
56
+
57
+ @index.close(**kwargs)
58
+ end
59
+
60
+ def open(**kwargs)
61
+ warning("#{@index}.#{@namespace}.open", "#{@index}.open", 2023, 12)
62
+
63
+ @index.open(**kwargs)
64
+ end
65
+
66
+ def open!(**kwargs)
67
+ warning("#{@index}.#{@namespace}.open!", "#{@index}.open", 2023, 12)
68
+
69
+ @index.open(**kwargs)
70
+ end
71
+
72
+ def refresh(**kwargs)
73
+ warning("#{@index}.#{@namespace}.refresh", "#{@index}.refresh", 2023, 12)
74
+
75
+ @index.refresh(**kwargs)
76
+ end
77
+
78
+ def refresh!(**kwargs)
79
+ warning("#{@index}.#{@namespace}.refresh!", "#{@index}.refresh", 2023, 12)
80
+
81
+ @index.refresh(**kwargs)
82
+ end
83
+
84
+ def delete_index(**kwargs)
85
+ warning("#{@index}.#{@namespace}.delete_index", "#{@index}.delete_index", 2023, 12)
86
+
87
+ @index.delete_index(**kwargs)
88
+ end
89
+
90
+ def delete_index!(**kwargs)
91
+ warning("#{@index}.#{@namespace}.delete_index!", "#{@index}.delete_index", 2023, 12)
92
+
93
+ @index.delete_index(**kwargs)
94
+ end
95
+
96
+ def index_exist?(**kwargs)
97
+ warning("#{@index}.#{@namespace}.index_exist?", "#{@index}.index_exist?", 2023, 12)
98
+
99
+ @index.index_exist?(**kwargs)
100
+ end
101
+
102
+ def update_mapping!(**kwargs)
103
+ warning("#{@index}.#{@namespace}.update_mapping!", "#{@index}.update_mapping", 2023, 12)
104
+
105
+ @index.update_mapping(**kwargs)
106
+ end
107
+
108
+ def update_mapping(**kwargs)
109
+ warning("#{@index}.#{@namespace}.update_mapping", "#{@index}.update_mapping", 2023, 12)
110
+
111
+ @index.update_mapping(**kwargs)
112
+ end
113
+
114
+ def update_settings!(**kwargs)
115
+ warning("#{@index}.#{@namespace}.update_settings!", "#{@index}.update_settings", 2023, 12)
116
+
117
+ @index.update_settings(**kwargs)
118
+ end
119
+
120
+ def update_settings(**kwargs)
121
+ warning("#{@index}.#{@namespace}.update_settings", "#{@index}.update_settings", 2023, 12)
122
+
123
+ @index.update_settings(**kwargs)
124
+ end
125
+
126
+ def reset_index!(**kwargs)
127
+ warning("#{@index}.#{@namespace}.reset_index!", "#{@index}.reset_index", 2023, 12)
128
+
129
+ @index.reset_index(**kwargs)
130
+ end
131
+
132
+ def import(**kwargs)
133
+ warning("#{@index}.#{@namespace}.import", "#{@index}.import", 2023, 12)
134
+
135
+ @index.import(**kwargs)
136
+ end
137
+
138
+ def import!(**kwargs)
139
+ warning("#{@index}.#{@namespace}.import!", "#{@index}.import", 2023, 12)
140
+
141
+ @index.import(**kwargs)
142
+ end
143
+
144
+ def bulk!(**kwargs)
145
+ warning("#{@index}.#{@namespace}.bulk!", "#{@index}.bulk", 2023, 12)
146
+
147
+ @index.bulk(**kwargs)
148
+ end
149
+
150
+ def bulk(**kwargs)
151
+ warning("#{@index}.#{@namespace}.bulk", "#{@index}.bulk", 2023, 12)
152
+
153
+ @index.bulk(**kwargs)
154
+ end
155
+
156
+ def index!(**kwargs)
157
+ warning("#{@index}.#{@namespace}.index!", "#{@index}.index", 2023, 12)
158
+
159
+ @index.index(**kwargs)
160
+ end
161
+
162
+ def index(**kwargs)
163
+ warning("#{@index}.#{@namespace}.index", "#{@index}.index", 2023, 12)
164
+
165
+ @index.index(**kwargs)
166
+ end
167
+
168
+ def update!(**kwargs)
169
+ warning("#{@index}.#{@namespace}.update!", "#{@index}.update", 2023, 12)
170
+
171
+ @index.update(**kwargs)
172
+ end
173
+
174
+ def update(**kwargs)
175
+ warning("#{@index}.#{@namespace}.update", "#{@index}.update", 2023, 12)
176
+
177
+ @index.update(**kwargs)
178
+ end
179
+
180
+ def delete!(**kwargs)
181
+ warning("#{@index}.#{@namespace}.delete!", "#{@index}.delete", 2023, 12)
182
+
183
+ @index.delete(**kwargs)
184
+ end
185
+
186
+ def delete(**kwargs)
187
+ warning("#{@index}.#{@namespace}.delete", "#{@index}.delete", 2023, 12)
188
+
189
+ @index.delete(**kwargs)
190
+ end
191
+
192
+ def count(**kwargs)
193
+ warning("#{@index}.#{@namespace}.count", "#{@index}.count", 2023, 12)
194
+
195
+ @index.count(**kwargs)
196
+ end
197
+
198
+ def exist?(**kwargs)
199
+ warning("#{@index}.#{@namespace}.exist?", "#{@index}.exist?", 2023, 12)
200
+
201
+ @index.exist?(**kwargs)
202
+ end
203
+
204
+ def find!(**kwargs)
205
+ warning("#{@index}.#{@namespace}.find!", "#{@index}.get", 2023, 12)
206
+
207
+ @index.get(**kwargs)
208
+ end
209
+
210
+ def find(**kwargs)
211
+ warning("#{@index}.#{@namespace}.find", "#{@index}.get", 2023, 12)
212
+
213
+ @index.get(**kwargs)
214
+ end
215
+ end
216
+ end
217
+ end
@@ -3,17 +3,32 @@
3
3
  module Esse
4
4
  class Repository
5
5
  class << self
6
- extend Gem::Deprecate
6
+ extend Esse::Deprecations::Deprecate
7
7
 
8
8
  def type_name
9
- document_type
9
+ repo_name
10
10
  end
11
- deprecate :type_name, :document_type, 2022, 10
11
+ deprecate :type_name, :repo_type, 2023, 12
12
12
 
13
13
  def mappings(*args, &block)
14
+ warning("#{self}.mappings", "#{index}.mappings", 2023, 12)
15
+
14
16
  index.mappings(*args, &block)
15
17
  end
16
- deprecate :mappings, "Esse::Index.mappings", 2022, 10
18
+
19
+ def serializer(*args, **kwargs, &block)
20
+ warning("#{self}.serializer", "#{self}.document", 2023, 12)
21
+
22
+ document(*args, **kwargs, &block)
23
+ end
24
+
25
+ def elasticsearch
26
+ Esse::Deprecations::RepositoryBackendDelegator.new(:elasticsearch, self)
27
+ end
28
+
29
+ def backend
30
+ Esse::Deprecations::RepositoryBackendDelegator.new(:backend, self)
31
+ end
17
32
  end
18
33
  end
19
34
  end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ module Deprecations
5
+ class RepositoryBackendDelegator
6
+ extend Esse::Deprecations::Deprecate
7
+
8
+ def initialize(namespace, repo)
9
+ @namespace = namespace
10
+ @repo = repo
11
+ end
12
+
13
+ def import(**kwargs)
14
+ warning("#{@repo}.#{@namespace}.import", "#{@repo}.import", 2023, 12)
15
+
16
+ @repo.import(**kwargs)
17
+ end
18
+
19
+ def import!(**kwargs)
20
+ warning("#{@repo}.#{@namespace}.import!", "#{@repo}.import", 2023, 12)
21
+
22
+ @repo.import(**kwargs)
23
+ end
24
+
25
+ def bulk(**kwargs)
26
+ warning("#{@repo}.#{@namespace}.bulk", "#{@repo.index}.bulk", 2023, 12)
27
+
28
+ @repo.index.bulk(**kwargs)
29
+ end
30
+
31
+ def bulk!(**kwargs)
32
+ warning("#{@repo}.#{@namespace}.bulk!", "#{@repo.index}.bulk", 2023, 12)
33
+
34
+ @repo.index.bulk(**kwargs)
35
+ end
36
+
37
+ def index(**kwargs)
38
+ warning("#{@repo}.#{@namespace}.index", "#{@repo.index}.index", 2023, 12)
39
+
40
+ @repo.index.index(**kwargs)
41
+ end
42
+
43
+ def index!(**kwargs)
44
+ warning("#{@repo}.#{@namespace}.index!", "#{@repo.index}.index", 2023, 12)
45
+
46
+ @repo.index.index(**kwargs)
47
+ end
48
+
49
+ def index_document(*args, **kwargs)
50
+ warning("#{@repo}.#{@namespace}.index_document", "#{@repo.index}.index", 2023, 12)
51
+
52
+ @repo.index.index(*args, **kwargs)
53
+ end
54
+
55
+ def update!(**kwargs)
56
+ warning("#{@repo}.#{@namespace}.update!", "#{@repo.index}.update", 2023, 12)
57
+
58
+ @repo.index.update(**kwargs)
59
+ end
60
+
61
+ def update(**kwargs)
62
+ warning("#{@repo}.#{@namespace}.update", "#{@repo.index}.update", 2023, 12)
63
+
64
+ @repo.index.update(**kwargs)
65
+ end
66
+
67
+ def delete!(**kwargs)
68
+ warning("#{@repo}.#{@namespace}.delete!", "#{@repo.index}.delete", 2023, 12)
69
+
70
+ @repo.index.delete(**kwargs)
71
+ end
72
+
73
+ def delete(**kwargs)
74
+ warning("#{@repo}.#{@namespace}.delete", "#{@repo.index}.delete", 2023, 12)
75
+
76
+ @repo.index.delete(**kwargs)
77
+ end
78
+
79
+ def delete_document(*args, **kwargs)
80
+ warning("#{@repo}.#{@namespace}.delete_document", "#{@repo.index}.delete", 2023, 12)
81
+
82
+ @repo.index.delete(*args, **kwargs)
83
+ end
84
+
85
+ def count(**kwargs)
86
+ warning("#{@repo}.#{@namespace}.count", "#{@repo.index}.count", 2023, 12)
87
+
88
+ @repo.index.count(**kwargs)
89
+ end
90
+
91
+ def exist?(**kwargs)
92
+ warning("#{@repo}.#{@namespace}.exist?", "#{@repo.index}.exist?", 2023, 12)
93
+
94
+ @repo.index.exist?(**kwargs)
95
+ end
96
+
97
+ def find!(**kwargs)
98
+ warning("#{@repo}.#{@namespace}.find!", "#{@repo.index}.get", 2023, 12)
99
+
100
+ @repo.index.get(**kwargs)
101
+ end
102
+
103
+ def find(**kwargs)
104
+ warning("#{@repo}.#{@namespace}.find", "#{@repo.index}.get", 2023, 12)
105
+
106
+ @repo.index.get(**kwargs)
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ class Serializer < Esse::Document
5
+ class << self
6
+ extend Esse::Deprecations::Deprecate
7
+
8
+ def inherited(subclass)
9
+ warning 'Esse::Serializer', 'Esse::Document', 2023, 12
10
+ super(subclass)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,7 @@
1
+ require_relative 'deprecations/deprecate'
2
+ require_relative 'deprecations/serializer'
3
+ require_relative 'deprecations/index_backend_delegator'
1
4
  require_relative 'deprecations/index'
2
5
  require_relative 'deprecations/cluster'
6
+ require_relative 'deprecations/repository_backend_delegator'
3
7
  require_relative 'deprecations/repository'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Esse
4
- class Serializer
4
+ class Document
5
5
  attr_reader :object, :options
6
6
 
7
7
  def initialize(object, **options)
@@ -21,12 +21,27 @@ module Esse
21
21
  nil
22
22
  end
23
23
 
24
+ # @return [Boolean] whether the document has type
25
+ def type?
26
+ !type.nil?
27
+ end
28
+
24
29
  # @return [String, nil] the document routing
25
30
  # @abstract Override this method to return the document routing
26
31
  def routing
27
32
  nil
28
33
  end
29
34
 
35
+ # @return [Boolean] whether the document has routing
36
+ def routing?
37
+ !routing.nil?
38
+ end
39
+
40
+ # @TODO allow import, index, bulk to accept a suffix to tell which index to use
41
+ # def index_suffix
42
+ # nil
43
+ # end
44
+
30
45
  # @return [Hash] the document meta
31
46
  # @abstract Override this method to return the document meta
32
47
  def meta
@@ -54,7 +69,7 @@ module Esse
54
69
  { _id: id }.tap do |h|
55
70
  h[:data] = source&.to_h if data
56
71
  h[:_type] = type if type
57
- h[:routing] = routing if routing
72
+ h[:routing] = routing if routing?
58
73
  h.merge!(meta)
59
74
  end
60
75
  end
@@ -11,6 +11,10 @@ module Esse
11
11
  @hash = HashUtils.deep_merge(@hash, normalize(value))
12
12
  end
13
13
 
14
+ def []=(key, value)
15
+ merge!(key => value)
16
+ end
17
+
14
18
  def to_a
15
19
  @hash.map do |name, value|
16
20
  { name => value }
data/lib/esse/errors.rb CHANGED
@@ -5,9 +5,16 @@ module Esse
5
5
  end
6
6
 
7
7
  # @todo Rename this
8
- module Backend
8
+ class Transport
9
9
  class ServerError < ::Esse::Error; end
10
10
 
11
+ # exception to raise when the cluster is readonly
12
+ class ReadonlyClusterError < ::Esse::Error
13
+ def initialize
14
+ super('You cannot perform this operation on a readonly cluster')
15
+ end
16
+ end
17
+
11
18
  ES_TRANSPORT_ERRORS = {
12
19
  'MultipleChoices' => 'MultipleChoicesError', # 300
13
20
  'MovedPermanently' => 'MovedPermanentlyError', # 301
data/lib/esse/events.rb CHANGED
@@ -38,15 +38,23 @@ module Esse
38
38
  module Events
39
39
  include Publisher
40
40
 
41
+ register_event 'elasticsearch.bulk'
41
42
  register_event 'elasticsearch.close'
42
- register_event 'elasticsearch.open'
43
43
  register_event 'elasticsearch.create_index'
44
44
  register_event 'elasticsearch.delete_index'
45
+ register_event 'elasticsearch.execute_search_query'
46
+ register_event 'elasticsearch.index_exist'
47
+ register_event 'elasticsearch.open'
48
+ register_event 'elasticsearch.refresh'
49
+ register_event 'elasticsearch.search'
50
+ register_event 'elasticsearch.update_aliases'
45
51
  register_event 'elasticsearch.update_mapping'
46
52
  register_event 'elasticsearch.update_settings'
47
- register_event 'elasticsearch.update_aliases'
48
- register_event 'elasticsearch.bulk'
49
- register_event 'elasticsearch.search'
50
- register_event 'elasticsearch.execute_search_query'
53
+ register_event 'elasticsearch.index'
54
+ register_event 'elasticsearch.update'
55
+ register_event 'elasticsearch.delete'
56
+ register_event 'elasticsearch.exist'
57
+ register_event 'elasticsearch.count'
58
+ register_event 'elasticsearch.get'
51
59
  end
52
60
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Esse
4
- class HashDocument < Esse::Serializer
4
+ class HashDocument < Esse::Document
5
5
  META_KEYS = %i[_id _type _routing routing].freeze
6
6
 
7
7
  def initialize(object)
@@ -1,15 +1,21 @@
1
1
  module Esse
2
2
  module Import
3
3
  class Bulk
4
- def initialize(index: nil, delete: nil, create: nil)
4
+ def initialize(type: nil, index: nil, delete: nil, create: nil)
5
5
  @index = Array(index).select(&method(:valid_doc?)).reject(&:ignore_on_index?).map do |doc|
6
- { index: doc.to_bulk }
6
+ value = doc.to_bulk
7
+ value[:_type] ||= type if type
8
+ { index: value }
7
9
  end
8
10
  @create = Array(create).select(&method(:valid_doc?)).reject(&:ignore_on_index?).map do |doc|
9
- { create: doc.to_bulk }
11
+ value = doc.to_bulk
12
+ value[:_type] ||= type if type
13
+ { create: value }
10
14
  end
11
15
  @delete = Array(delete).select(&method(:valid_doc?)).reject(&:ignore_on_delete?).map do |doc|
12
- { delete: doc.to_bulk(data: false) }
16
+ value = doc.to_bulk(data: false)
17
+ value[:_type] ||= type if type
18
+ { delete: value }
13
19
  end
14
20
  end
15
21
 
@@ -22,26 +28,31 @@ module Esse
22
28
  #
23
29
  # @yield [RequestBody] A request body instance
24
30
  def each_request(max_retries: 3)
31
+ # @TODO create indexes when by checking all the index suffixes (if mapping is not empty)
25
32
  requests = [optimistic_request]
26
33
  retry_count = 0
27
34
 
28
35
  begin
29
36
  requests.each do |request|
30
- yield(request) if request.body?
37
+ next unless request.body?
38
+ resp = yield request
39
+ if resp&.[]('errors')
40
+ raise resp&.fetch('items', [])&.select { |item| item.values.first['error'] }&.join("\n")
41
+ end
31
42
  end
32
- rescue Faraday::TimeoutError, Esse::Backend::RequestTimeoutError => e
43
+ rescue Faraday::TimeoutError, Esse::Transport::RequestTimeoutError => e
33
44
  retry_count += 1
34
- raise Esse::Backend::RequestTimeoutError.new(e.message) if retry_count >= max_retries
45
+ raise Esse::Transport::RequestTimeoutError.new(e.message) if retry_count >= max_retries
35
46
  wait_interval = (retry_count**4) + 15 + (rand(10) * (retry_count + 1))
36
47
  Esse.logger.warn "Timeout error, retrying in #{wait_interval} seconds"
37
48
  sleep(wait_interval)
38
49
  retry
39
- rescue Esse::Backend::RequestEntityTooLargeError => e
50
+ rescue Esse::Transport::RequestEntityTooLargeError => e
40
51
  retry_count += 1
41
52
  raise e if retry_count > 1 # only retry once on this error
42
53
  requests = balance_requests_size(e)
43
54
  Esse.logger.warn <<~MSG
44
- Request entity too large, retrying with a bulk with: #{requests.map(&:bytesize).join(" + ")}.
55
+ Request entity too large, retrying with a bulk with: #{requests.map(&:bytesize).join(' + ')}.
45
56
  Note that this cause performance degradation, consider adjusting the batch_size of the index or increasing the bulk size.
46
57
  MSG
47
58
  retry
@@ -51,7 +62,7 @@ module Esse
51
62
  private
52
63
 
53
64
  def valid_doc?(doc)
54
- doc && doc.is_a?(Esse::Serializer) && doc.id
65
+ Esse.document?(doc)
55
66
  end
56
67
 
57
68
  def optimistic_request
@@ -90,7 +101,6 @@ module Esse
90
101
  raise err
91
102
  end
92
103
  end
93
-
94
104
  end
95
105
  end
96
106
  end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ class Index
5
+ module ClassMethods
6
+ # Get the aliases for the index.
7
+ def aliases(**options)
8
+ response = cluster.api.aliases(**options, index: index_name, name: '*')
9
+ idx_name = response.keys.find { |idx| idx.start_with?(index_name) }
10
+ return [] unless idx_name
11
+
12
+ response.dig(idx_name, 'aliases')&.keys || []
13
+ rescue Esse::Transport::NotFoundError
14
+ []
15
+ end
16
+
17
+ # Return list of real index names for the virtual index name(alias)
18
+ def indices_pointing_to_alias(**options)
19
+ cluster.api.aliases(**options, name: index_name).keys
20
+ rescue Esse::Transport::NotFoundError
21
+ []
22
+ end
23
+
24
+ # Replaces all existing aliases by the respective suffixed index from argument.
25
+ #
26
+ # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
27
+ # @option [Array<String>] :suffix One or more index suffixes to point the alias to.
28
+ # @raise [Esse::Transport::ServerError] in case of failure
29
+ # @return [Hash] the elasticsearch response
30
+ def update_aliases(suffix:, **options)
31
+ cluster.throw_error_when_readonly!
32
+ raise(ArgumentError, 'index suffix cannot be nil') if suffix.nil?
33
+
34
+ options[:body] = {
35
+ actions: [
36
+ *indices_pointing_to_alias.map do |index|
37
+ { remove: { index: index, alias: index_name } }
38
+ end,
39
+ *Array(suffix).map do |value|
40
+ { add: { index: build_real_index_name(value), alias: index_name } }
41
+ end,
42
+ ],
43
+ }
44
+ cluster.api.update_aliases(**options)
45
+ end
46
+ end
47
+
48
+ extend ClassMethods
49
+ end
50
+ end