esse 0.2.2 → 0.2.3

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