elasticsearch_record 1.2.3 → 1.3.0

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: cdb71bb8689c67cd7a2ef1add3b7ad0ab6710cbb5833313cb3f474267c39e43e
4
- data.tar.gz: 06ec37ac16f5adb110da8ffa08c9c44fc20993be3db12bf8033315cfa9611fc3
3
+ metadata.gz: 0e7302cf1310d0d583125bf9a9e526203feb42d000569b6daca266d88ae7bb50
4
+ data.tar.gz: e67b0946f566b44232827244c323aa2e221796f4d0ac91adf4696179f4ba56e1
5
5
  SHA512:
6
- metadata.gz: 929f5df6456203e7bce466d62836805bb9a75ff5a89856c75cd1ba187a95e05f51aa3ad676c3058d7ad95d1295db1422571964240182000bef59a8cdb95181bc
7
- data.tar.gz: 7f785864f92bc6f3243ea081236327ff7c600833cdf74a11d59239f31551d928dc7b8bb1b4952ec38aadaa8d0174ac2a7ceeebae100a247c3534ef4c1609e484
6
+ metadata.gz: 3fbf9f25937e5c77520af89de811c72bc9e2a51a49cbb1c6f7a77d0b2af8d2e533b3cc2fc11acf3f8b9a78ed5616c97c068cc88a1171e85bcc5611252960b345
7
+ data.tar.gz: f8d77b26a20ddd8db5495638fdd98da72bcd1bd6978f17d6a1a794ab436fc184e3dafa153c67b364f6c89e59c5bca1eb0a59e09b240c4ea8e6055c017eb4738c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- elasticsearch_record (1.2.3)
4
+ elasticsearch_record (1.2.4)
5
5
  activerecord (~> 7.0.0)
6
6
  elasticsearch (~> 8.4)
7
7
 
@@ -28,7 +28,7 @@ GEM
28
28
  elasticsearch-api (= 8.5.2)
29
29
  elasticsearch-api (8.5.2)
30
30
  multi_json
31
- faraday (2.7.1)
31
+ faraday (2.7.2)
32
32
  faraday-net_http (>= 2.0, < 3.1)
33
33
  ruby2_keywords (>= 0.0.4)
34
34
  faraday-net_http (3.0.2)
data/README.md CHANGED
@@ -198,6 +198,7 @@ total = scope.total
198
198
  - kind
199
199
  - configure
200
200
  - aggregate
201
+ - refresh
201
202
  - query
202
203
  - filter
203
204
  - must_not
@@ -274,6 +275,8 @@ Access these methods through the model's connection.
274
275
  - meta_exists?
275
276
  - max_result_window
276
277
  - cluster_info
278
+ - cluster_settings
279
+ - cluster_health
277
280
 
278
281
  ## Active Record Schema migration methods
279
282
  Access these methods through the model's connection or within any `Migration`.
@@ -285,26 +288,30 @@ Access these methods through the model's connection or within any `Migration`.
285
288
  - close_tables
286
289
  - truncate_table
287
290
  - truncate_tables
291
+ - refresh_table
292
+ - refresh_tables
288
293
  - drop_table
289
294
  - block_table
290
295
  - unblock_table
291
296
  - clone_table
292
297
  - create_table
293
298
  - change_table
299
+ - rename_table
294
300
 
295
301
  **table actions:**
296
302
  - change_meta
297
- - delete_meta
303
+ - remove_meta
298
304
  - add_mapping
299
305
  - change_mapping
300
306
  - change_mapping_meta
301
307
  - change_mapping_attributes
308
+ - remove_mapping
302
309
  - add_setting
303
310
  - change_setting
304
- - delete_setting
311
+ - remove_setting
305
312
  - add_alias
306
313
  - change_alias
307
- - delete_alias
314
+ - remove_alias
308
315
 
309
316
  ```ruby
310
317
  # Example migration
@@ -322,6 +329,11 @@ class AddTests < ActiveRecord::Migration[7.0]
322
329
  # changes the auto-increment value
323
330
  change_meta "assignments", :auto_increment, 3625
324
331
 
332
+ # removes the mapping 'updated_at' from the 'assignments' index.
333
+ # the flag 'recreate' is required, since 'remove' is not supported for elasticsearch.
334
+ # this will recreate the whole index (data will be LOST!!!)
335
+ remove_mapping :assignments, :updated_at, recreate: true
336
+
325
337
  create_table "settings", force: true do |t|
326
338
  t.mapping :created_at, :date
327
339
  t.mapping :key, :integer do |m|
@@ -347,8 +359,8 @@ class AddTests < ActiveRecord::Migration[7.0]
347
359
  t.add_alias('supersettings')
348
360
  end
349
361
 
350
- delete_alias('settings', :supersettings)
351
- delete_setting('settings', 'index.search.idle.after')
362
+ remove_alias('settings', :supersettings)
363
+ remove_setting('settings', 'index.search.idle.after')
352
364
 
353
365
  change_table 'settings', force: true do |t|
354
366
  t.integer :amount_of_newbies
@@ -357,10 +369,14 @@ class AddTests < ActiveRecord::Migration[7.0]
357
369
  create_table "vintage", force: true do |t|
358
370
  t.primary_key :number
359
371
  t.string :name
372
+ t.string :comments
360
373
  t.timestamps
361
374
  end
362
375
 
363
- change_mapping_attributes "vintage", :number, fields: {raw: {type: :keyword}}
376
+ change_table 'vintage', if_exists: true, recreate: true do |t|
377
+ t.change_mapping :number, fields: {raw: {type: :keyword}}
378
+ t.remove_mapping :number
379
+ end
364
380
  end
365
381
 
366
382
  def down
data/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # ElasticsearchRecord - CHANGELOG
2
2
 
3
+ ## [1.3.0] - 2023-01-17
4
+ * [add] 'metas: {}' param for `CreateTableDefinition` to provide individual meta information without providing them through 'mappings'
5
+ * [add] 'change_'- & 'remove_'-methods for _mapping, setting & alias_ for `CreateTableDefinition`
6
+ * [add] `ActiveRecord::ConnectionAdapters::Elasticsearch::TableMappingDefinition#meta` for easier access
7
+ * [add] `UpdateTableDefinition#remove_mapping` to always raise an ArgumentError (now created @ `CreateTableDefinition` through change_table(x, recreate: true) )
8
+ * [add] `_env_table_name`-syntax to `ActiveRecord::ConnectionAdapters::Elasticsearch::SchemaDumper#table` for prefixed & suffixed tables in connections
9
+ * [add] `#cluster_health`, `#refresh_table`, `#refresh_tables` & `#rename_table` methods to 'connection'
10
+ * [add] `#change_table` 'recreate: false' parameter to switch between a 'change' or 'recreate' of an index
11
+ * [add] `#refresh` method to relations to explicit set the refresh value of the generated query
12
+ * [ref] `CloneTableDefinition` to adapt settings (number_of_shards & number_of_replicas) from source table by default
13
+ * [ref] `CreateTableDefinition#transform_mappings!` also support simple 'key->attributes' assignment of custom provided mappings
14
+ * [ref] 'delete_'-methods into more common 'remove_' for `UpdateTableDefinition`
15
+ * [ref] `UpdateTableDefinition#change_mapping` to always raise an ArgumentError (now moved to `CreateTableDefinition` through change_table(x, recreate: true) )
16
+ * [ref] `#change_table` missing '&block'
17
+ * [ref] 'delete_'-methods into more common 'remove_' to 'connection'
18
+ * [ref] ':\_\_claim\_\_'-operator to ':\_\_query\_\_' within `Arel::Collectors::ElasticsearchQuery`
19
+ * [ref] update & delete queries to preset a 'refresh: true' as default _(can be overwritten through 'relation.refresh(false)' )_
20
+ * [rem] `#clone_table` unusable '&block'
21
+ * [rem] `#compute_table_name`-method - must be explicit provided with `#_env_table_name(name)`
22
+ * [fix] `#where!` & `#build_where_clause` methods to also build a valid 'where_clause' in nested 'where' & 'or'
23
+
24
+ ## [1.2.4] - 2022-12-15
25
+ * [fix] missing `#visit_Arel_Nodes_In` method in `Arel::Visitors::ElasticsearchQuery` to build array conditions
26
+ * [fix] resolving buckets from relation `ElasticsearchRecord::Result#buckets` not recognizing sub-buckets
27
+
3
28
  ## [1.2.3] - 2022-12-12
4
29
  * [fix] `change_table` 'if_exists: true' returns at the wrong state
5
30
 
@@ -16,6 +16,9 @@ module ActiveRecord
16
16
  @settings = HashWithIndifferentAccess.new
17
17
  @aliases = HashWithIndifferentAccess.new
18
18
 
19
+ # before assigning new settings, we need to resolve some defaults
20
+ assign_default_clone_settings!
21
+
19
22
  transform_settings!(settings) if settings.present?
20
23
  transform_aliases!(aliases) if aliases.present?
21
24
  end
@@ -64,6 +67,12 @@ module ActiveRecord
64
67
 
65
68
  private
66
69
 
70
+ def assign_default_clone_settings!
71
+ settings = table_settings(name)
72
+ setting('index.number_of_shards', (settings.dig('index.number_of_shards') || 1))
73
+ setting('index.number_of_replicas', (settings.dig('index.number_of_replicas') || 0))
74
+ end
75
+
67
76
  def _before_exec
68
77
  block_table(self.name, :write)
69
78
  end
@@ -6,7 +6,7 @@ module ActiveRecord
6
6
  module ConnectionAdapters
7
7
  module Elasticsearch
8
8
  class CreateTableDefinition < TableDefinition
9
- def initialize(conn, name, settings: nil, mappings: nil, aliases: nil, **opts)
9
+ def initialize(conn, name, settings: nil, mappings: nil, aliases: nil, metas: nil, **opts)
10
10
  super(conn, name, **opts)
11
11
 
12
12
  @settings = HashWithIndifferentAccess.new
@@ -17,6 +17,9 @@ module ActiveRecord
17
17
  transform_settings!(settings) if settings.present?
18
18
  transform_mappings!(mappings) if mappings.present?
19
19
  transform_aliases!(aliases) if aliases.present?
20
+ # PLEASE NOTE: metas are already provided through the mappings (['_meta']),
21
+ # but this will support individually provided key<->values...
22
+ transform_metas!(metas) if metas.present?
20
23
  end
21
24
 
22
25
  # returns an array with all +TableSettingDefinition+.
@@ -64,18 +67,23 @@ module ActiveRecord
64
67
  self
65
68
  end
66
69
 
70
+ def change_meta(name, value, **options)
71
+ # simply force full overwrite
72
+ meta(name, value, force: true, **options)
73
+ end
74
+
67
75
  def remove_meta(name)
68
76
  @metas.delete(name)
69
77
  end
70
78
 
71
79
  # adds a new mapping
72
- def mapping(name, type, force: false, **options, &block)
80
+ def mapping(name, type, if_not_exists: false, force: false, **options, &block)
81
+ return if if_not_exists && @mappings.key?(name)
73
82
  raise ArgumentError, "you cannot define an already defined mapping '#{name}'!" if @mappings.key?(name) && !force?(force)
74
83
 
75
84
  mapping = new_mapping_definition(name, type, **options, &block)
76
85
  @mappings[name] = mapping
77
86
 
78
-
79
87
  # check if the mapping is assigned as primary_key
80
88
  if mapping.primary_key?
81
89
  meta :primary_key, mapping.name
@@ -86,16 +94,51 @@ module ActiveRecord
86
94
  end
87
95
 
88
96
  # provide backwards compatibility to columns
89
- alias column mapping
97
+ alias :column :mapping
98
+ alias :add_mapping :mapping
99
+ alias :add_column :mapping
100
+
101
+ def change_mapping(name, type, if_exists: false, **options, &block)
102
+ return if if_exists && !@mappings.key?(name)
103
+
104
+ raise ArgumentError, "you cannot change an unknown mapping '#{name}'" unless @mappings.key?(name)
105
+
106
+ mapping(name, type, force: true, **options, &block)
107
+ end
108
+
109
+ alias :change_column :change_mapping
110
+ alias :change :change_mapping
111
+
112
+ def change_mapping_meta(name, **options)
113
+ raise ArgumentError, "you cannot change the 'meta' parameter for an unknown mapping '#{name}'" unless @mappings.key?(name)
114
+
115
+ # merge mapping options
116
+ opts = @mappings[name].attributes
117
+ opts['meta'] = @mappings[name].meta.merge(options)
118
+
119
+ mapping(name, @mappings[name].type, force: true, **opts)
120
+ end
121
+
122
+ def change_mapping_attributes(name, if_exists: false, **options, &block)
123
+ return if if_exists && !@mappings.key?(name)
124
+
125
+ raise ArgumentError, "you cannot change an unknown mapping '#{name}'" unless @mappings.key?(name)
126
+
127
+ # merge mapping attributes
128
+ opts = @mappings[name].attributes.merge(options)
129
+
130
+ mapping(name, @mappings[name].type, force: true, **opts, &block)
131
+ end
90
132
 
91
133
  def remove_mapping(name)
92
134
  @mappings.delete(name)
93
135
  end
94
136
 
95
137
  # provide backwards compatibility to columns
96
- alias remove_column remove_mapping
138
+ alias :remove_column :remove_mapping
97
139
 
98
- def setting(name, value, force: false, **options, &block)
140
+ def setting(name, value, if_not_exists: false, force: false, **options, &block)
141
+ return if if_not_exists && @settings.key?(name)
99
142
  raise ArgumentError, "you cannot define an already defined setting '#{name}'!" if @settings.key?(name) && !force?(force)
100
143
 
101
144
  @settings[name] = new_setting_definition(name, value, **options, &block)
@@ -103,13 +146,19 @@ module ActiveRecord
103
146
  self
104
147
  end
105
148
 
149
+ def change_setting(name, value, if_exists: false, **options, &block)
150
+ return if if_exists && !@settings.key?(name)
151
+
152
+ # simply force full overwrite
153
+ setting(name, value, force: true, **options, &block)
154
+ end
155
+
106
156
  def remove_setting(name)
107
157
  @settings.delete name
108
158
  end
109
159
 
110
- # we can use +alias+ here, since the instance method is not a reserved keyword!
111
-
112
- def alias(name, force: false, **options, &block)
160
+ def add_alias(name, if_not_exists: false, force: false, **options, &block)
161
+ return if if_not_exists && @aliases.key?(name)
113
162
  raise ArgumentError, "you cannot define an already defined alias '#{name}'." if @aliases.key?(name) && !force?(force)
114
163
 
115
164
  @aliases[name] = new_alias_definition(name, **options, &block)
@@ -117,6 +166,13 @@ module ActiveRecord
117
166
  self
118
167
  end
119
168
 
169
+ def change_alias(name, if_exists: false, **options, &block)
170
+ return if if_exists && !@aliases.key?(name)
171
+
172
+ # simply force full overwrite
173
+ add_alias(name, force: true, **options, &block)
174
+ end
175
+
120
176
  def remove_alias(name)
121
177
  @aliases.delete name
122
178
  end
@@ -154,6 +210,51 @@ module ActiveRecord
154
210
  def state
155
211
  nil
156
212
  end
213
+
214
+ def transform_mappings!(mappings)
215
+ # transform +_meta+ mappings
216
+ if mappings['_meta'].present?
217
+ mappings['_meta'].each do |name, value|
218
+ self.meta(name, value, force: true)
219
+ end
220
+ end
221
+
222
+ # transform properties (=columns)
223
+ if mappings['properties'].present?
224
+ mappings['properties'].each do |name, attributes|
225
+ self.mapping(name, attributes.delete('type'), force: true, **attributes)
226
+ end
227
+ elsif mappings.present? && mappings.values[0].is_a?(Hash)
228
+ # raw settings where provided with just (key => attributes)
229
+ mappings.each do |name, attributes|
230
+ self.mapping(name, attributes.delete('type'), force: true, **attributes)
231
+ end
232
+ end
233
+ end
234
+
235
+ def transform_settings!(settings)
236
+ # exclude settings, that are provided through the API but are not part of the index-settings
237
+ settings
238
+ .with_indifferent_access
239
+ .each { |name, value|
240
+ # don't transform ignored names
241
+ next if ActiveRecord::ConnectionAdapters::Elasticsearch::TableSettingDefinition.match_ignore_names?(name)
242
+
243
+ self.setting(name, value, force: true)
244
+ }
245
+ end
246
+
247
+ def transform_aliases!(aliases)
248
+ aliases.each do |name, attributes|
249
+ self.alias(name, force: true, **attributes)
250
+ end
251
+ end
252
+
253
+ def transform_metas!(metas)
254
+ metas.each do |name, value|
255
+ self.meta(name, value, force: true)
256
+ end
257
+ end
157
258
  end
158
259
  end
159
260
  end
@@ -147,40 +147,6 @@ module ActiveRecord
147
147
  def strict?(strict = nil)
148
148
  opts.fetch(:strict, false) || strict
149
149
  end
150
-
151
- def transform_mappings!(mappings)
152
- # transform +_meta+ mappings
153
- if mappings['_meta'].present?
154
- mappings['_meta'].each do |name, value|
155
- self.meta(name, value)
156
- end
157
- end
158
-
159
- # transform properties (=columns)
160
- if mappings['properties'].present?
161
- mappings['properties'].each do |name, attributes|
162
- self.mapping(name, attributes.delete('type'), **attributes)
163
- end
164
- end
165
- end
166
-
167
- def transform_settings!(settings)
168
- # exclude settings, that are provided through the API but are not part of the index-settings
169
- settings
170
- .with_indifferent_access
171
- .each { |name, value|
172
- # don't transform ignored names
173
- next if ActiveRecord::ConnectionAdapters::Elasticsearch::TableSettingDefinition.match_ignore_names?(name)
174
-
175
- self.setting(name, value)
176
- }
177
- end
178
-
179
- def transform_aliases!(aliases)
180
- aliases.each do |name, attributes|
181
- self.alias(name, **attributes)
182
- end
183
- end
184
150
  end
185
151
  end
186
152
  end
@@ -99,6 +99,12 @@ module ActiveRecord
99
99
  _lazy_attributes[:auto_increment] = value
100
100
  end
101
101
 
102
+ # returns the meta hash
103
+ # @param [Hash]
104
+ def meta
105
+ __get_attribute(:meta) || {}
106
+ end
107
+
102
108
  def meta=(value)
103
109
  if value.nil?
104
110
  __remove_attribute(:meta)
@@ -8,15 +8,13 @@ module ActiveRecord
8
8
  module Elasticsearch
9
9
  class UpdateTableDefinition < TableDefinition
10
10
 
11
- attr_reader :definitions
12
-
13
11
  # defines which definitions can be executed composite
14
12
  COMPOSITE_DEFINITIONS = [
15
13
  AddMappingDefinition,
16
14
  ChangeMappingDefinition,
17
15
  ChangeMetaDefinition,
18
16
  AddSettingDefinition,
19
- DeleteAliasDefinition
17
+ RemoveAliasDefinition
20
18
  ].freeze
21
19
 
22
20
  def add_mapping(name, type, if_not_exists: false, **options, &block)
@@ -35,23 +33,14 @@ module ActiveRecord
35
33
  define! ChangeMetaDefinition, new_meta_definition(name, value, **options)
36
34
  end
37
35
 
38
- def delete_meta(name, **options)
36
+ def remove_meta(name, **options)
39
37
  load_meta_definition!
40
38
 
41
39
  define! ChangeMetaDefinition, new_meta_definition(name, nil, **options)
42
40
  end
43
41
 
44
- def change_mapping(name, type, if_exists: false, **options, &block)
45
- return if if_exists && !mapping_exists?(self.name, name, type)
46
-
47
- mapping = new_mapping_definition(name, type, **options, &block)
48
- define! ChangeMappingDefinition, mapping
49
-
50
- # check if the mapping is assigned as primary_key
51
- if mapping.primary_key?
52
- change_meta :primary_key, mapping.name
53
- change_meta(:auto_increment, mapping.auto_increment) if mapping.auto_increment?
54
- end
42
+ def change_mapping(name, type, **options, &block)
43
+ raise ArgumentError, "you cannot change the mapping '#{name}' without the 'recreate: true' flag in the '#change_table' call"
55
44
  end
56
45
 
57
46
  alias :change_column :change_mapping
@@ -67,16 +56,28 @@ module ActiveRecord
67
56
  define! ChangeMappingDefinition, new_mapping_definition(name, mapping['type'], meta: meta)
68
57
  end
69
58
 
70
- def change_mapping_attributes(name, **options, &block)
71
- mapping = table_mappings(self.name).dig('properties', name.to_s)
72
- raise ArgumentError, "you cannot change parameters for an unknown mapping '#{name}'" if mapping.blank?
59
+ def change_mapping_attributes(name, if_exists: false, **options, &block)
60
+ return if if_exists && !mapping_exists?(self.name, name)
61
+
62
+ # receive current mapping
63
+ current_mapping = table_mappings(self.name).dig('properties', name.to_s)
64
+ raise ArgumentError, "you cannot change an unknown mapping '#{name}'" if current_mapping.blank?
73
65
 
74
- options = mapping.with_indifferent_access.except(:type).merge(options) if options.present?
66
+ # build new mapping
67
+ mapping = new_mapping_definition(name, current_mapping[:type], **options, &block)
68
+ define! ChangeMappingDefinition, mapping
75
69
 
76
- define! ChangeMappingDefinition, new_mapping_definition(name, mapping['type'], **options, &block)
70
+ # check if the mapping is assigned as new primary_key
71
+ if mapping.primary_key?
72
+ change_meta :primary_key, mapping.name
73
+ change_meta(:auto_increment, mapping.auto_increment) if mapping.auto_increment?
74
+ end
77
75
  end
78
76
 
79
- alias :change_mapping_attribute :change_mapping_attributes
77
+ def remove_mapping(name)
78
+ raise ArgumentError, "you cannot remove the mapping '#{name}' without the 'recreate: true' flag in the '#change_table' call"
79
+ end
80
+ alias :remove_column :remove_mapping
80
81
 
81
82
  def add_setting(name, value, if_not_exists: false, **options, &block)
82
83
  return if if_not_exists && setting_exists?(self.name, name)
@@ -90,10 +91,10 @@ module ActiveRecord
90
91
  define! ChangeSettingDefinition, new_setting_definition(name, value, **options, &block)
91
92
  end
92
93
 
93
- def delete_setting(name, if_exists: false, **options, &block)
94
+ def remove_setting(name, if_exists: false, **options, &block)
94
95
  return if if_exists && !setting_exists?(self.name, name)
95
96
 
96
- define! DeleteSettingDefinition, new_setting_definition(name, nil, **options, &block)
97
+ define! RemoveSettingDefinition, new_setting_definition(name, nil, **options, &block)
97
98
  end
98
99
 
99
100
  def add_alias(name, if_not_exists: false, **options, &block)
@@ -108,10 +109,10 @@ module ActiveRecord
108
109
  define! ChangeAliasDefinition, new_alias_definition(name, **options, &block)
109
110
  end
110
111
 
111
- def delete_alias(name, if_exists: false, **, &block)
112
+ def remove_alias(name, if_exists: false, **, &block)
112
113
  return if if_exists && !alias_exists?(self.name, name)
113
114
 
114
- define! DeleteAliasDefinition, new_alias_definition(name, &block)
115
+ define! RemoveAliasDefinition, new_alias_definition(name, &block)
115
116
  end
116
117
 
117
118
  # Appends <tt>:datetime</tt> columns <tt>:created_at</tt> and
@@ -123,6 +124,11 @@ module ActiveRecord
123
124
  add_mapping(:updated_at, :datetime, if_not_exists: true, **options)
124
125
  end
125
126
 
127
+ # returns the definitions hash
128
+ def definitions
129
+ @definitions ||= {}
130
+ end
131
+
126
132
  private
127
133
 
128
134
  # loads existing meta definitions from table_mappings
@@ -130,16 +136,14 @@ module ActiveRecord
130
136
  return if @load_meta_definition
131
137
  @load_meta_definition = true
132
138
 
133
-
134
139
  table_metas(self.name).each do |name, value|
135
140
  define! ChangeMetaDefinition, new_meta_definition(name, value)
136
141
  end
137
142
  end
138
143
 
139
144
  def define!(klass, item)
140
- @definitions ||= {}
141
- @definitions[klass] ||= []
142
- @definitions[klass] << item
145
+ self.definitions[klass] ||= []
146
+ self.definitions[klass] << item
143
147
  end
144
148
 
145
149
  def _before_assign
@@ -157,6 +161,7 @@ module ActiveRecord
157
161
  # reset table state
158
162
  clear_state!
159
163
  end
164
+
160
165
  alias :_rescue_assign :_after_exec
161
166
  alias :_rescue_exec :_after_exec
162
167
 
@@ -14,12 +14,12 @@ module ActiveRecord
14
14
  # setting definitions
15
15
  AddSettingDefinition = Struct.new(:items) # composite
16
16
  ChangeSettingDefinition = Struct.new(:items) # composite
17
- DeleteSettingDefinition = Struct.new(:items) # composite
17
+ RemoveSettingDefinition = Struct.new(:items) # composite
18
18
 
19
19
  # alias definitions
20
20
  AddAliasDefinition = Struct.new(:item) # single
21
21
  ChangeAliasDefinition = Struct.new(:item) # single
22
- DeleteAliasDefinition = Struct.new(:items) # composite
22
+ RemoveAliasDefinition = Struct.new(:items) # composite
23
23
  end
24
24
  end
25
25
  end
@@ -20,6 +20,11 @@ module ActiveRecord
20
20
  @options[:table_name_suffix] = @connection.table_name_suffix if @options[:table_name_suffix].blank?
21
21
  end
22
22
 
23
+ # returns true if the connection has table-names, that are environment related
24
+ def _has_env_table_names?
25
+ @options[:table_name_prefix].present? || @options[:table_name_suffix].present?
26
+ end
27
+
23
28
  # overwrite the method to 'fix' a possible ActiveRecord bug:
24
29
  # If a +table_name_prefix+ or +table_name_suffix+ was provided we also only want to dump those tables,
25
30
  # which matches the prefix/suffix. So possible, environment-related tables will be ignored
@@ -35,7 +40,7 @@ module ActiveRecord
35
40
  return true if @options[:table_name_prefix].present? && !table_name.start_with?(@options[:table_name_prefix].to_s)
36
41
 
37
42
  # if the table ends NOT with +suffix+ it must be ignored
38
- return true if @options[:table_name_suffix].present? && !table_name.end_with?(@options[:table_name_suffix].to_s)
43
+ return true if @options[:table_name_suffix].present? && !table_name.end_with?(@options[:table_name_suffix].to_s)
39
44
 
40
45
  false
41
46
  end
@@ -50,7 +55,14 @@ module ActiveRecord
50
55
  # resolve string printer
51
56
  tbl = StringIO.new
52
57
 
53
- tbl.print " create_table #{remove_prefix_and_suffix(table).inspect}"
58
+ tbl.print " create_table"
59
+
60
+ if _has_env_table_names?
61
+ tbl.print " _env_table_name(#{remove_prefix_and_suffix(table).inspect})"
62
+ else
63
+ tbl.print " #{remove_prefix_and_suffix(table).inspect}"
64
+ end
65
+
54
66
  tbl.print ", force: true do |t|"
55
67
 
56
68
  # META
@@ -399,6 +399,12 @@ module ActiveRecord
399
399
  settings['persistent'].merge(settings['transient'])
400
400
  end
401
401
 
402
+ # returns the cluster health
403
+ # @return [Hash]
404
+ def cluster_health(**options)
405
+ api(:cluster, :health, options, 'CLUSTER HEALTH').to_h
406
+ end
407
+
402
408
  # transforms provided schema-type to a sql-type
403
409
  # overwrite original methods to provide a elasticsearch version
404
410
  # @param [String, Symbol] type
@@ -467,7 +473,7 @@ module ActiveRecord
467
473
 
468
474
  # overwrite original methods to provide a elasticsearch version
469
475
  def extract_table_options!(options)
470
- options.extract!(:settings, :mappings, :aliases, :force, :strict)
476
+ options.extract!(:settings, :mappings, :aliases, :metas, :force, :strict)
471
477
  end
472
478
  end
473
479
  end