esse 0.0.2 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exec/esse +3 -1
- data/lib/esse/backend/index/aliases.rb +8 -4
- data/lib/esse/backend/index/close.rb +54 -0
- data/lib/esse/backend/index/create.rb +21 -10
- data/lib/esse/backend/index/delete.rb +15 -14
- data/lib/esse/backend/index/documents.rb +2 -2
- data/lib/esse/backend/index/existance.rb +2 -3
- data/lib/esse/backend/index/open.rb +54 -0
- data/lib/esse/backend/index/refresh.rb +43 -0
- data/lib/esse/backend/index/reset.rb +33 -0
- data/lib/esse/backend/index/update.rb +128 -4
- data/lib/esse/backend/index.rb +20 -4
- data/lib/esse/backend/index_type/documents.rb +53 -42
- data/lib/esse/backend/index_type.rb +7 -2
- data/lib/esse/cli/event_listener.rb +87 -0
- data/lib/esse/cli/generate.rb +9 -4
- data/lib/esse/cli/index/base_operation.rb +76 -0
- data/lib/esse/cli/index/close.rb +26 -0
- data/lib/esse/cli/index/create.rb +26 -0
- data/lib/esse/cli/index/delete.rb +26 -0
- data/lib/esse/cli/index/open.rb +26 -0
- data/lib/esse/cli/index/reset.rb +26 -0
- data/lib/esse/cli/index/update_aliases.rb +32 -0
- data/lib/esse/cli/index/update_mapping.rb +33 -0
- data/lib/esse/cli/index/update_settings.rb +26 -0
- data/lib/esse/cli/index.rb +70 -2
- data/lib/esse/cli/templates/config.rb.erb +20 -0
- data/lib/esse/cli/templates/index.rb.erb +76 -11
- data/lib/esse/cli/templates/type_collection.rb.erb +41 -0
- data/lib/esse/cli/templates/{mappings.json → type_mappings.json} +0 -0
- data/lib/esse/cli/templates/type_serializer.rb.erb +23 -0
- data/lib/esse/cli.rb +75 -3
- data/lib/esse/cluster.rb +22 -6
- data/lib/esse/config.rb +39 -5
- data/lib/esse/core.rb +18 -36
- data/lib/esse/errors.rb +47 -0
- data/lib/esse/events/bus.rb +103 -0
- data/lib/esse/events/event.rb +64 -0
- data/lib/esse/events/publisher.rb +119 -0
- data/lib/esse/events.rb +49 -0
- data/lib/esse/index/backend.rb +2 -1
- data/lib/esse/index/base.rb +4 -6
- data/lib/esse/index/mappings.rb +4 -6
- data/lib/esse/index/settings.rb +6 -8
- data/lib/esse/index.rb +2 -1
- data/lib/esse/index_mapping.rb +2 -2
- data/lib/esse/index_setting.rb +8 -4
- data/lib/esse/index_type/actions.rb +2 -1
- data/lib/esse/index_type/backend.rb +2 -1
- data/lib/esse/index_type/mappings.rb +3 -3
- data/lib/esse/index_type.rb +6 -1
- data/lib/esse/logging.rb +19 -0
- data/lib/esse/object_document_mapper.rb +96 -0
- data/lib/esse/primitives/hash_utils.rb +29 -0
- data/lib/esse/primitives/hstring.rb +4 -3
- data/lib/esse/primitives/output.rb +64 -0
- data/lib/esse/primitives.rb +1 -0
- data/lib/esse/template_loader.rb +1 -1
- data/lib/esse/version.rb +1 -1
- data/lib/esse.rb +14 -2
- metadata +127 -24
- data/.gitignore +0 -12
- data/.rubocop.yml +0 -128
- data/CHANGELOG.md +0 -0
- data/Gemfile +0 -7
- data/Gemfile.lock +0 -60
- data/LICENSE.txt +0 -21
- data/README.md +0 -50
- data/Rakefile +0 -4
- data/bin/console +0 -22
- data/bin/setup +0 -8
- data/esse.gemspec +0 -39
- data/lib/esse/cli/templates/serializer.rb.erb +0 -14
- data/lib/esse/index_type/serializer.rb +0 -87
- 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
|
-
|
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
|
-
# @
|
24
|
-
# @
|
25
|
-
# @
|
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
|
-
|
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
|
-
# @
|
63
|
-
# @
|
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
|
-
|
72
|
+
index: index_name(suffix: suffix), type: type_name, id: id, body: body, **options
|
70
73
|
)
|
71
74
|
end
|
72
|
-
|
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
|
-
# @
|
80
|
-
# @
|
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
|
-
|
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
|
-
# @
|
97
|
-
# @
|
98
|
-
# @
|
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
|
-
|
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
|
-
# @
|
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
|
-
# @
|
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
|
-
# @
|
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
|
-
# @
|
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
|
-
# @
|
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
|
-
# @
|
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
|
data/lib/esse/cli/generate.rb
CHANGED
@@ -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{
|
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 =
|
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/
|
33
|
+
'templates/type_mappings.json',
|
33
34
|
base_dir.join(index_name, 'templates', "#{@type}_mapping.json"),
|
34
35
|
)
|
35
36
|
template(
|
36
|
-
'templates/
|
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
|