esse 0.0.2 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/exec/esse +3 -1
  3. data/lib/esse/backend/index/aliases.rb +8 -4
  4. data/lib/esse/backend/index/close.rb +54 -0
  5. data/lib/esse/backend/index/create.rb +21 -10
  6. data/lib/esse/backend/index/delete.rb +15 -14
  7. data/lib/esse/backend/index/documents.rb +2 -2
  8. data/lib/esse/backend/index/existance.rb +2 -3
  9. data/lib/esse/backend/index/open.rb +54 -0
  10. data/lib/esse/backend/index/refresh.rb +43 -0
  11. data/lib/esse/backend/index/reset.rb +33 -0
  12. data/lib/esse/backend/index/update.rb +128 -4
  13. data/lib/esse/backend/index.rb +20 -4
  14. data/lib/esse/backend/index_type/documents.rb +53 -42
  15. data/lib/esse/backend/index_type.rb +7 -2
  16. data/lib/esse/cli/event_listener.rb +87 -0
  17. data/lib/esse/cli/generate.rb +9 -4
  18. data/lib/esse/cli/index/base_operation.rb +76 -0
  19. data/lib/esse/cli/index/close.rb +26 -0
  20. data/lib/esse/cli/index/create.rb +26 -0
  21. data/lib/esse/cli/index/delete.rb +26 -0
  22. data/lib/esse/cli/index/open.rb +26 -0
  23. data/lib/esse/cli/index/reset.rb +26 -0
  24. data/lib/esse/cli/index/update_aliases.rb +32 -0
  25. data/lib/esse/cli/index/update_mapping.rb +33 -0
  26. data/lib/esse/cli/index/update_settings.rb +26 -0
  27. data/lib/esse/cli/index.rb +70 -2
  28. data/lib/esse/cli/templates/config.rb.erb +20 -0
  29. data/lib/esse/cli/templates/index.rb.erb +76 -11
  30. data/lib/esse/cli/templates/type_collection.rb.erb +41 -0
  31. data/lib/esse/cli/templates/{mappings.json → type_mappings.json} +0 -0
  32. data/lib/esse/cli/templates/type_serializer.rb.erb +23 -0
  33. data/lib/esse/cli.rb +75 -3
  34. data/lib/esse/cluster.rb +22 -6
  35. data/lib/esse/config.rb +39 -5
  36. data/lib/esse/core.rb +18 -36
  37. data/lib/esse/errors.rb +47 -0
  38. data/lib/esse/events/bus.rb +103 -0
  39. data/lib/esse/events/event.rb +64 -0
  40. data/lib/esse/events/publisher.rb +119 -0
  41. data/lib/esse/events.rb +49 -0
  42. data/lib/esse/index/backend.rb +2 -1
  43. data/lib/esse/index/base.rb +4 -6
  44. data/lib/esse/index/mappings.rb +4 -6
  45. data/lib/esse/index/settings.rb +6 -8
  46. data/lib/esse/index.rb +2 -1
  47. data/lib/esse/index_mapping.rb +2 -2
  48. data/lib/esse/index_setting.rb +8 -4
  49. data/lib/esse/index_type/actions.rb +2 -1
  50. data/lib/esse/index_type/backend.rb +2 -1
  51. data/lib/esse/index_type/mappings.rb +3 -3
  52. data/lib/esse/index_type.rb +6 -1
  53. data/lib/esse/logging.rb +19 -0
  54. data/lib/esse/object_document_mapper.rb +96 -0
  55. data/lib/esse/primitives/hash_utils.rb +29 -0
  56. data/lib/esse/primitives/hstring.rb +4 -3
  57. data/lib/esse/primitives/output.rb +64 -0
  58. data/lib/esse/primitives.rb +1 -0
  59. data/lib/esse/template_loader.rb +1 -1
  60. data/lib/esse/version.rb +1 -1
  61. data/lib/esse.rb +14 -2
  62. metadata +127 -24
  63. data/.gitignore +0 -12
  64. data/.rubocop.yml +0 -128
  65. data/CHANGELOG.md +0 -0
  66. data/Gemfile +0 -7
  67. data/Gemfile.lock +0 -60
  68. data/LICENSE.txt +0 -21
  69. data/README.md +0 -50
  70. data/Rakefile +0 -4
  71. data/bin/console +0 -22
  72. data/bin/setup +0 -8
  73. data/esse.gemspec +0 -39
  74. data/lib/esse/cli/templates/serializer.rb.erb +0 -14
  75. data/lib/esse/index_type/serializer.rb +0 -87
  76. data/lib/esse/types/mapping.rb +0 -0
@@ -7,26 +7,28 @@ module Esse
7
7
  # Resolve collection and index data
8
8
  #
9
9
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
10
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
10
11
  # @option [Hash] :context The collection context. This value will be passed as argument to the collection
11
12
  # May be SQL condition or any other filter you have defined on the collection.
12
- def import(context: {}, **options)
13
+ def import(context: {}, suffix: nil, **options)
13
14
  each_serialized_batch(context || {}) do |batch|
14
- bulk(index: batch, **options)
15
+ bulk(index: batch, suffix: suffix, **options)
15
16
  end
16
17
  end
17
- alias import! import
18
+ alias_method :import!, :import
18
19
 
19
20
  # Performs multiple indexing or delete operations in a single API call.
20
21
  # This reduces overhead and can greatly increase indexing speed.
21
22
  #
22
23
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
23
- # @param options [Array] :index list of serialized documents to be indexed(Optional)
24
- # @param options [Array] :delete list of serialized documents to be deleted(Optional)
25
- # @param options [Array] :create list of serialized documents to be created(Optional)
24
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
25
+ # @option [Array] :index list of serialized documents to be indexed(Optional)
26
+ # @option [Array] :delete list of serialized documents to be deleted(Optional)
27
+ # @option [Array] :create list of serialized documents to be created(Optional)
26
28
  # @return [Hash, nil] the elasticsearch response or nil if there is no data.
27
29
  #
28
30
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-bulk.html
29
- def bulk(index: nil, delete: nil, create: nil, **options)
31
+ def bulk(index: nil, delete: nil, create: nil, suffix: nil, **options)
30
32
  body = []
31
33
  Array(index).each do |entry|
32
34
  id, data = Esse.doc_id!(entry)
@@ -44,14 +46,14 @@ module Esse
44
46
  return if body.empty?
45
47
 
46
48
  definition = {
47
- index: index_name,
49
+ index: index_name(suffix: suffix),
48
50
  type: type_name,
49
51
  body: body,
50
52
  }.merge(options)
51
53
 
52
54
  client.bulk(definition)
53
55
  end
54
- alias bulk! bulk
56
+ alias_method :bulk!, :bulk
55
57
 
56
58
  # Adds a JSON document to the specified index and makes it searchable. If the document
57
59
  # already exists, updates the document and increments its version.
@@ -59,32 +61,34 @@ module Esse
59
61
  # UsersIndex::User.index(id: 1, body: { name: 'name' }) # { '_id' => 1, ...}
60
62
  #
61
63
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
62
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
63
- # @param options [Hash] :body The JSON document that will be indexed (Required)
64
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
65
+ # @option [Hash] :body The JSON document that will be indexed (Required)
66
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
64
67
  # @return [Hash] the elasticsearch response Hash
65
68
  #
66
69
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-index_.html
67
- def index(id:, body:, **options)
70
+ def index(id:, body:, suffix: nil, **options)
68
71
  client.index(
69
- options.merge(index: index_name, type: type_name, id: id, body: body),
72
+ index: index_name(suffix: suffix), type: type_name, id: id, body: body, **options
70
73
  )
71
74
  end
72
- alias index! index
75
+ alias_method :index!, :index
73
76
 
74
77
  # Updates a document using the specified script.
75
78
  #
76
79
  # UsersIndex::User.update!(id: 1, body: { doc: { ... } }) # { '_id' => 1, ...}
77
80
  #
78
81
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
79
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
80
- # @param options [Hash] :body the body of the request
82
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
83
+ # @option [Hash] :body the body of the request
84
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
81
85
  # @raise [Elasticsearch::Transport::Transport::Errors::NotFound] when the doc does not exist
82
86
  # @return [Hash] elasticsearch response hash
83
87
  #
84
88
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-update.html
85
- def update!(id:, body:, **options)
89
+ def update!(id:, body:, suffix: nil, **options)
86
90
  client.update(
87
- options.merge(index: index_name, type: type_name, id: id, body: body),
91
+ index: index_name(suffix: suffix), type: type_name, id: id, body: body, **options
88
92
  )
89
93
  end
90
94
 
@@ -93,15 +97,16 @@ module Esse
93
97
  # UsersIndex::User.update(id: 1, body: { doc: { ... } }) # { '_id' => 1, ...}
94
98
  #
95
99
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
96
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
97
- # @param options [Hash] :body the body of the request
98
- # @return [Hash, false] the elasticsearch response hash, or false in case of failure
100
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
101
+ # @option [Hash] :body the body of the request
102
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
103
+ # @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
99
104
  #
100
105
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-update.html
101
- def update(id:, body:, **options)
102
- update!(id: id, body: body, **options)
106
+ def update(id:, body:, suffix: nil, **options)
107
+ update!(id: id, body: body, suffix: suffix, **options)
103
108
  rescue Elasticsearch::Transport::Transport::Errors::NotFound
104
- false
109
+ { 'errors' => true }
105
110
  end
106
111
 
107
112
  # Removes a JSON document from the specified index.
@@ -110,13 +115,14 @@ module Esse
110
115
  # UsersIndex::User.delete!(id: 'missing') # raise Elasticsearch::Transport::Transport::Errors::NotFound
111
116
  #
112
117
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
113
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
118
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
119
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
114
120
  # @raise [Elasticsearch::Transport::Transport::Errors::NotFound] when the doc does not exist
115
121
  # @return [Boolean] true when the operation is successfully completed
116
122
  #
117
123
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-delete.html
118
- def delete!(id:, **options)
119
- client.delete(options.merge(index: index_name, type: type_name, id: id))
124
+ def delete!(id:, suffix: nil, **options)
125
+ client.delete(options.merge(index: index_name(suffix: suffix), type: type_name, id: id))
120
126
  end
121
127
 
122
128
  # Removes a JSON document from the specified index.
@@ -125,13 +131,14 @@ module Esse
125
131
  # UsersIndex::User.delete(id: 'missing') # false
126
132
  #
127
133
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
128
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
134
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
135
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
129
136
  # @raise [Elasticsearch::Transport::Transport::Errors::NotFound] when the doc does not exist
130
137
  # @return [Boolean] true when the operation is successfully completed
131
138
  #
132
139
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-delete.html
133
- def delete(id:, **options)
134
- delete!(id: id, **options)
140
+ def delete(id:, suffix: nil, **options)
141
+ delete!(id: id, suffix: suffix, **options)
135
142
  rescue Elasticsearch::Transport::Transport::Errors::NotFound
136
143
  false
137
144
  end
@@ -142,12 +149,13 @@ module Esse
142
149
  # UsersIndex::User.count(body: { ... }) # 32
143
150
  #
144
151
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
145
- # @param options [Hash] :body A query to restrict the results specified with the Query DSL (optional)
152
+ # @option [Hash] :body A query to restrict the results specified with the Query DSL (optional)
153
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
146
154
  # @return [Integer] amount of documents found
147
155
  #
148
156
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/search-count.html
149
- def count(**options)
150
- response = client.count(options.merge(index: index_name, type: type_name))
157
+ def count(suffix: nil, **options)
158
+ response = client.count(options.merge(index: index_name(suffix: suffix), type: type_name))
151
159
  response['count']
152
160
  rescue Elasticsearch::Transport::Transport::Errors::NotFound
153
161
  0
@@ -159,10 +167,11 @@ module Esse
159
167
  # UsersIndex::User.exist?(id: 'missing') # false
160
168
  #
161
169
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
162
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
170
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
171
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
163
172
  # @return [Boolean] true if the document exists
164
- def exist?(id:, **options)
165
- client.exists(options.merge(index: index_name, type: type_name, id: id))
173
+ def exist?(id:, suffix: nil, **options)
174
+ client.exists(options.merge(index: index_name(suffix: suffix), type: type_name, id: id))
166
175
  end
167
176
 
168
177
  # Retrieves the specified JSON document from an index.
@@ -171,13 +180,14 @@ module Esse
171
180
  # UsersIndex::User.find!(id: 'missing') # raise Elasticsearch::Transport::Transport::Errors::NotFound
172
181
  #
173
182
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
174
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
183
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
184
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
175
185
  # @raise [Elasticsearch::Transport::Transport::Errors::NotFound] when the doc does not exist
176
186
  # @return [Hash] The elasticsearch document.
177
187
  #
178
188
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-get.html
179
- def find!(id:, **options)
180
- client.get(options.merge(index: index_name, type: type_name, id: id))
189
+ def find!(id:, suffix: nil, **options)
190
+ client.get(options.merge(index: index_name(suffix: suffix), type: type_name, id: id))
181
191
  end
182
192
 
183
193
  # Retrieves the specified JSON document from an index.
@@ -186,12 +196,13 @@ module Esse
186
196
  # UsersIndex::User.find(id: 'missing') # nil
187
197
  #
188
198
  # @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
189
- # @param options [String, Integer] :id The `_id` of the elasticsearch document
199
+ # @option [String, Integer] :id The `_id` of the elasticsearch document
200
+ # @option [String, nil] :suffix The index suffix. Defaults to the nil.
190
201
  # @return [Hash, nil] The elasticsearch document
191
202
  #
192
203
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-get.html
193
- def find(id:, **options)
194
- find!(id: id, **options)
204
+ def find(id:, suffix: nil, **options)
205
+ find!(id: id, suffix: suffix, **options)
195
206
  rescue Elasticsearch::Transport::Transport::Errors::NotFound
196
207
  nil
197
208
  end
@@ -11,8 +11,6 @@ module Esse
11
11
 
12
12
  # Type delegators
13
13
  def_delegators :@index_type, :type_name, :each_serialized_batch, :serialize
14
- # Index delegators
15
- def_delegators :index_class, :index_name
16
14
 
17
15
  def initialize(type)
18
16
  @index_type = type
@@ -20,6 +18,13 @@ module Esse
20
18
 
21
19
  protected
22
20
 
21
+ def index_name(suffix: nil)
22
+ suffix = Hstring.new(suffix).underscore.presence
23
+ return index_class.index_name unless suffix
24
+
25
+ [index_class.index_name, suffix].join('_')
26
+ end
27
+
23
28
  def index_class
24
29
  @index_type.index
25
30
  end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../primitives'
4
+
5
+ module Esse
6
+ module CLI
7
+ module EventListener
8
+ extend Output
9
+
10
+ module_function
11
+
12
+ def [](event_name)
13
+ method_name = Hstring.new(event_name).underscore.to_sym
14
+ return unless respond_to?(method_name)
15
+
16
+ method(method_name)
17
+ end
18
+
19
+ def elasticsearch_create_index(event)
20
+ print_message '[%<runtime>s] Index %<name>s successfuly created',
21
+ name: colorize(event[:request][:index], :bold),
22
+ runtime: formatted_runtime(event[:runtime])
23
+ if (aliases = event.to_h.dig(:request, :body, :aliases)).is_a?(Hash)
24
+ print_message ' --> Aliases: %<aliases>s', aliases: aliases.keys.join(', ')
25
+ end
26
+ end
27
+
28
+ def elasticsearch_delete_index(event)
29
+ print_message '[%<runtime>s] Index %<name>s successfuly deleted',
30
+ name: colorize(event[:request][:index], :bold),
31
+ runtime: formatted_runtime(event[:runtime])
32
+ end
33
+
34
+ def elasticsearch_close(event)
35
+ print_message '[%<runtime>s] Index %<name>s successfuly closed',
36
+ name: colorize(event[:request][:index], :bold),
37
+ runtime: formatted_runtime(event[:runtime])
38
+ end
39
+
40
+ def elasticsearch_open(event)
41
+ print_message '[%<runtime>s] Index %<name>s successfuly opened',
42
+ name: colorize(event[:request][:index], :bold),
43
+ runtime: formatted_runtime(event[:runtime])
44
+ end
45
+
46
+ def elasticsearch_update_mapping(event)
47
+ if event[:request][:type]
48
+ print_message '[%<runtime>s] Index %<name>s mapping for type %<type>s successfuly updated',
49
+ name: colorize(event[:request][:index], :bold),
50
+ type: event[:request][:type],
51
+ runtime: formatted_runtime(event[:runtime])
52
+ else
53
+ print_message '[%<runtime>s] Index %<name>s successfuly updated mapping',
54
+ name: colorize(event[:request][:index], :bold),
55
+ runtime: formatted_runtime(event[:runtime])
56
+ end
57
+ end
58
+
59
+ def elasticsearch_update_settings(event)
60
+ print_message '[%<runtime>s] Index %<name>s successfuly updated settings',
61
+ name: colorize(event[:request][:index], :bold),
62
+ runtime: formatted_runtime(event[:runtime])
63
+ end
64
+
65
+ def elasticsearch_update_aliases(event)
66
+ actions = event[:request][:body][:actions]
67
+ removed = actions.select { |a| a.key?(:remove) }
68
+ added = actions.select { |a| a.key?(:add) }
69
+ print_message '[%<runtime>s] Successfuly updated aliases:',
70
+ runtime: formatted_runtime(event[:runtime])
71
+
72
+ removed.each do |action|
73
+ print_message '%<padding>s-> Index %<name>s removed from alias %<alias>s',
74
+ name: colorize(action[:remove][:index], :bold),
75
+ alias: colorize(action[:remove][:alias], :bold),
76
+ padding: runtime_padding(event[:runtime])
77
+ end
78
+ added.each do |action|
79
+ print_message '%<padding>s-> Index %<name>s added to alias %<alias>s',
80
+ name: colorize(action[:add][:index], :bold),
81
+ alias: colorize(action[:add][:alias], :bold),
82
+ padding: runtime_padding(event[:runtime])
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -7,7 +7,7 @@ require_relative 'base'
7
7
  module Esse
8
8
  module CLI
9
9
  class Generate < Base
10
- NAMESPACE_PATTERN_RE = %r{\:|/|\\}i.freeze
10
+ NAMESPACE_PATTERN_RE = %r{:|/|\\}i.freeze
11
11
 
12
12
  def self.source_root
13
13
  File.dirname(__FILE__)
@@ -17,11 +17,12 @@ module Esse
17
17
  def index(name, *types)
18
18
  ns_path = name.split(NAMESPACE_PATTERN_RE).tap(&:pop)
19
19
  @index_name = Hstring.new(name.to_s).modulize.sub(/Index$/, '') + 'Index'
20
+ @index_name = Hstring.new(@index_name)
20
21
  @types = types.map { |type| Hstring.new(type) }
21
22
  @base_class = base_index_class(*ns_path)
22
23
 
23
24
  base_dir = Esse.config.indices_directory.join(*ns_path)
24
- index_name = Hstring.new(@index_name).demodulize.underscore.to_s
25
+ index_name = @index_name.demodulize.underscore.to_s
25
26
  template(
26
27
  'templates/index.rb.erb',
27
28
  base_dir.join("#{index_name}.rb"),
@@ -29,13 +30,17 @@ module Esse
29
30
  @types.each do |type|
30
31
  @type = Hstring.new(type).underscore
31
32
  copy_file(
32
- 'templates/mappings.json',
33
+ 'templates/type_mappings.json',
33
34
  base_dir.join(index_name, 'templates', "#{@type}_mapping.json"),
34
35
  )
35
36
  template(
36
- 'templates/serializer.rb.erb',
37
+ 'templates/type_serializer.rb.erb',
37
38
  base_dir.join(index_name, 'serializers', "#{@type}_serializer.rb"),
38
39
  )
40
+ template(
41
+ 'templates/type_collection.rb.erb',
42
+ base_dir.join(index_name, 'collections', "#{@type}_collection.rb"),
43
+ )
39
44
  end
40
45
  end
41
46
 
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Esse
4
+ module CLI
5
+ class Index::BaseOperation
6
+ include Output
7
+
8
+ def initialize(indices:, **options)
9
+ @indices = Array(indices)
10
+ @options = options
11
+ end
12
+
13
+ # @abstract
14
+ # @void
15
+ def run
16
+ raise NotImplementedError
17
+ end
18
+
19
+ private
20
+
21
+ def validate_indices_option!
22
+ if @indices.empty?
23
+ raise InvalidOption.new(<<~END)
24
+ You must specify at least one index class.
25
+
26
+ Example:
27
+ > esse index create CityIndex
28
+ > esse index create CityIndex, StateIndex
29
+ END
30
+ end
31
+ end
32
+
33
+ def indices
34
+ eager_load_indices!
35
+ @indices.map do |class_name|
36
+ const_exist = begin
37
+ Kernel.const_defined?(class_name)
38
+ rescue NameError
39
+ false
40
+ end
41
+
42
+ raise InvalidOption.new(<<~END, class_name: class_name) unless const_exist
43
+ Unrecognized index class: %<class_name>p. Are you sure you specified the correct index class?
44
+ END
45
+
46
+ klass = Kernel.const_get(class_name)
47
+ unless klass < Esse::Index
48
+ path = Esse.config.indices_directory.join(Hstring.new(class_name).underscore.to_s)
49
+ raise InvalidOption.new(<<~END, class_name: class_name, path: path)
50
+ %<class_name>s must be a subclass of Esse::Index.
51
+
52
+ Example:
53
+ # %<path>s.rb
54
+ class %<class_name>s < Esse::Index
55
+ # the index definition goes here
56
+ end
57
+ END
58
+ end
59
+
60
+ klass
61
+ end
62
+ end
63
+
64
+ def eager_load_indices!
65
+ return false unless Esse.config.indices_directory.exist?
66
+
67
+ Esse.config.indices_directory.each_child do |path|
68
+ next unless path.extname == '.rb'
69
+
70
+ require(path.expand_path.to_s)
71
+ end
72
+ true
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::Close < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.close!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::Create < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.create_index!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::Delete < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.delete_index!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::Open < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.open!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::Reset < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.reset_index!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::UpdateAliases < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.update_aliases!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+
24
+ if @options[:suffix].nil?
25
+ raise InvalidOption.new(<<~END)
26
+ You must specify a suffix to update the aliases.
27
+ END
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::UpdateMapping < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ if index.type_hash.any?
12
+ index.type_hash.each_value do |type|
13
+ # @idea Add update_mapping! to IndexType and use it here
14
+ index.elasticsearch.update_mapping!(type: type.type_name, **options)
15
+ end
16
+ else
17
+ index.elasticsearch.update_mapping!(**options)
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def options
25
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
26
+ end
27
+
28
+ def validate_options!
29
+ validate_indices_option!
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_operation'
4
+
5
+ module Esse
6
+ module CLI
7
+ class Index::UpdateSettings < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.update_settings!(**options)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def options
18
+ @options.slice(*@options.keys - CLI_IGNORE_OPTS)
19
+ end
20
+
21
+ def validate_options!
22
+ validate_indices_option!
23
+ end
24
+ end
25
+ end
26
+ end