esse 0.0.3 → 0.1.2

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 (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 +6 -5
  5. data/lib/esse/backend/index/create.rb +20 -9
  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 +6 -5
  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 +37 -15
  13. data/lib/esse/backend/index.rb +18 -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/import.rb +26 -0
  23. data/lib/esse/cli/index/open.rb +26 -0
  24. data/lib/esse/cli/index/reset.rb +26 -0
  25. data/lib/esse/cli/index/update_aliases.rb +32 -0
  26. data/lib/esse/cli/index/update_mapping.rb +33 -0
  27. data/lib/esse/cli/index/update_settings.rb +26 -0
  28. data/lib/esse/cli/index.rb +78 -2
  29. data/lib/esse/cli/templates/config.rb.erb +20 -0
  30. data/lib/esse/cli/templates/index.rb.erb +76 -11
  31. data/lib/esse/cli/templates/type_collection.rb.erb +41 -0
  32. data/lib/esse/cli/templates/{mappings.json → type_mappings.json} +0 -0
  33. data/lib/esse/cli/templates/type_serializer.rb.erb +23 -0
  34. data/lib/esse/cli.rb +75 -3
  35. data/lib/esse/cluster.rb +22 -6
  36. data/lib/esse/config.rb +39 -5
  37. data/lib/esse/core.rb +18 -36
  38. data/lib/esse/errors.rb +47 -0
  39. data/lib/esse/events/bus.rb +103 -0
  40. data/lib/esse/events/event.rb +64 -0
  41. data/lib/esse/events/publisher.rb +119 -0
  42. data/lib/esse/events.rb +49 -0
  43. data/lib/esse/index/backend.rb +2 -1
  44. data/lib/esse/index/base.rb +4 -6
  45. data/lib/esse/index/mappings.rb +2 -3
  46. data/lib/esse/index/settings.rb +7 -8
  47. data/lib/esse/index.rb +2 -1
  48. data/lib/esse/index_mapping.rb +2 -2
  49. data/lib/esse/index_setting.rb +8 -4
  50. data/lib/esse/index_type/actions.rb +2 -1
  51. data/lib/esse/index_type/backend.rb +2 -1
  52. data/lib/esse/index_type/mappings.rb +2 -2
  53. data/lib/esse/index_type.rb +6 -1
  54. data/lib/esse/logging.rb +19 -0
  55. data/lib/esse/object_document_mapper.rb +96 -0
  56. data/lib/esse/primitives/hash_utils.rb +40 -0
  57. data/lib/esse/primitives/hstring.rb +4 -3
  58. data/lib/esse/primitives/output.rb +64 -0
  59. data/lib/esse/primitives.rb +1 -0
  60. data/lib/esse/template_loader.rb +1 -1
  61. data/lib/esse/version.rb +1 -1
  62. data/lib/esse.rb +12 -3
  63. metadata +124 -21
  64. data/.gitignore +0 -12
  65. data/.rubocop.yml +0 -128
  66. data/CHANGELOG.md +0 -0
  67. data/Gemfile +0 -7
  68. data/Gemfile.lock +0 -60
  69. data/LICENSE.txt +0 -21
  70. data/README.md +0 -52
  71. data/Rakefile +0 -4
  72. data/bin/console +0 -22
  73. data/bin/setup +0 -8
  74. data/esse.gemspec +0 -39
  75. data/lib/esse/cli/templates/serializer.rb.erb +0 -14
  76. data/lib/esse/index_type/serializer.rb +0 -87
@@ -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::Import < Index::BaseOperation
8
+ def run
9
+ validate_options!
10
+ indices.each do |index|
11
+ index.elasticsearch.import!(**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