esse 0.0.5 → 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 +7 -3
- data/lib/esse/backend/index/close.rb +6 -3
- data/lib/esse/backend/index/create.rb +19 -8
- data/lib/esse/backend/index/delete.rb +13 -8
- data/lib/esse/backend/index/documents.rb +2 -2
- data/lib/esse/backend/index/existance.rb +1 -1
- data/lib/esse/backend/index/open.rb +6 -3
- data/lib/esse/backend/index/refresh.rb +2 -2
- data/lib/esse/backend/index/reset.rb +2 -4
- data/lib/esse/backend/index/update.rb +37 -12
- data/lib/esse/backend/index.rb +5 -1
- data/lib/esse/backend/index_type/documents.rb +7 -7
- data/lib/esse/cli/event_listener.rb +87 -0
- data/lib/esse/cli/generate.rb +7 -3
- 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 +74 -9
- 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/{serializer.rb.erb → type_serializer.rb.erb} +9 -4
- data/lib/esse/cli.rb +75 -3
- data/lib/esse/cluster.rb +18 -2
- data/lib/esse/config.rb +39 -5
- data/lib/esse/core.rb +15 -33
- 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 +2 -3
- data/lib/esse/index/settings.rb +7 -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 +2 -2
- 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 +12 -3
- metadata +106 -22
- data/.gitignore +0 -12
- data/.rubocop.yml +0 -128
- data/.tool-versions +0 -1
- data/.yardopts +0 -2
- data/CHANGELOG.md +0 -0
- data/Gemfile +0 -7
- data/Gemfile.lock +0 -62
- data/LICENSE.txt +0 -21
- data/README.md +0 -52
- data/Rakefile +0 -4
- data/bin/console +0 -22
- data/bin/setup +0 -8
- data/esse.gemspec +0 -40
- data/lib/esse/index_type/serializer.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74a999f5083a3e258834ca27ac444c63e8f10e20940106f1415331d8a5e772b7
|
4
|
+
data.tar.gz: e7e2853b5fe1296795e6a5d306d12e2ac5c91e88cba671e2cd980ee1b1edfb2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04a5efa492606d9385b07d8f076966b85bf825ffb49d37c9e35edd8fa5be5c4d283ac193097733f16583f920472aa83e2f1c05a00188649932c2c63ce6f14e53
|
7
|
+
data.tar.gz: 34b4426c3014edfcfe2c1320da019ba6b5c2566842baeb78e14e73df1df173f7a3a7298505b94128180a094aa953ee83dbf09a0e48791d65aa70f04f9e2c5fd9
|
data/exec/esse
CHANGED
@@ -47,7 +47,11 @@ module Esse
|
|
47
47
|
{ add: {index: build_real_index_name(suffix), alias: index_name } }
|
48
48
|
],
|
49
49
|
}
|
50
|
-
|
50
|
+
|
51
|
+
Esse::Events.instrument('elasticsearch.update_aliases') do |payload|
|
52
|
+
payload[:request] = options
|
53
|
+
payload[:response] = client.indices.update_aliases(options)
|
54
|
+
end
|
51
55
|
end
|
52
56
|
|
53
57
|
# Replaces all existing aliases by the respective suffixed index from argument.
|
@@ -55,11 +59,11 @@ module Esse
|
|
55
59
|
# @param options [Hash] Hash of paramenters that will be passed along to elasticsearch request
|
56
60
|
# @option [String] :suffix The suffix of the index used for versioning.
|
57
61
|
# @raise [Elasticsearch::Transport::Transport::Errors::NotFound] in case of failure
|
58
|
-
# @return [Hash
|
62
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
59
63
|
def update_aliases(suffix:, **options)
|
60
64
|
update_aliases!(suffix: suffix, **options)
|
61
65
|
rescue Elasticsearch::Transport::Transport::Errors::NotFound
|
62
|
-
|
66
|
+
{ 'errors' => true }
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
@@ -21,7 +21,10 @@ module Esse
|
|
21
21
|
#
|
22
22
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html
|
23
23
|
def close!(suffix: index_version, **options)
|
24
|
-
|
24
|
+
Esse::Events.instrument('elasticsearch.close') do |payload|
|
25
|
+
payload[:request] = attributes = options.merge(index: index_name(suffix: suffix))
|
26
|
+
payload[:response] = client.indices.close(**attributes)
|
27
|
+
end
|
25
28
|
end
|
26
29
|
|
27
30
|
# Close an index (keep the data on disk, but deny operations with the index).
|
@@ -35,13 +38,13 @@ module Esse
|
|
35
38
|
# @option options [Boolean] :ignore_unavailable Whether specified concrete indices should be ignored when
|
36
39
|
# unavailable (missing, closed, etc)
|
37
40
|
# @option options [Time] :timeout Explicit operation timeout
|
38
|
-
# @return [Hash
|
41
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
39
42
|
#
|
40
43
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-close.html
|
41
44
|
def close(suffix: index_version, **options)
|
42
45
|
close!(suffix: suffix, **options)
|
43
46
|
rescue Elasticsearch::Transport::Transport::ServerError
|
44
|
-
|
47
|
+
{ 'errors' => true }
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
@@ -10,43 +10,54 @@ module Esse
|
|
10
10
|
|
11
11
|
# Creates index and applies mappings and settings.
|
12
12
|
#
|
13
|
-
# UsersIndex.
|
13
|
+
# UsersIndex.elasticsearch.create_index # creates index named `<prefix_>users_<suffix|index_version|timestamp>`
|
14
14
|
#
|
15
15
|
# @param options [Hash] Options hash
|
16
16
|
# @option options [Boolean] :alias Update `index_name` alias along with the new index
|
17
17
|
# @option options [String] :suffix The index suffix. Defaults to the `IndexClass#index_version` or
|
18
18
|
# `Esse.timestamp`. Suffixed index names might be used for zero-downtime mapping change.
|
19
|
-
# @return [Hash
|
19
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
20
20
|
#
|
21
21
|
# @see http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/
|
22
|
-
def create_index(suffix:
|
22
|
+
def create_index(suffix: index_version, **options)
|
23
23
|
create_index!(suffix: suffix, **options)
|
24
24
|
rescue Elasticsearch::Transport::Transport::Errors::BadRequest
|
25
|
-
|
25
|
+
{ 'errors' => true }
|
26
26
|
end
|
27
27
|
|
28
28
|
# Creates index and applies mappings and settings.
|
29
29
|
#
|
30
|
-
# UsersIndex.
|
30
|
+
# UsersIndex.elasticsearch.create_index! # creates index named `<prefix_>users_<suffix|index_version|timestamp>`
|
31
31
|
#
|
32
32
|
# @param options [Hash] Options hash
|
33
33
|
# @option options [Boolean] :alias Update `index_name` alias along with the new index
|
34
34
|
# @option options [String] :suffix The index suffix. Defaults to the `IndexClass#index_version` or
|
35
35
|
# `Esse.timestamp`. Suffixed index names might be used for zero-downtime mapping change.
|
36
|
+
# @option arguments [String] :wait_for_active_shards Set the number of active shards
|
37
|
+
# to wait for before the operation returns.
|
38
|
+
# @option arguments [Time] :timeout Explicit operation timeout
|
39
|
+
# @option arguments [Time] :master_timeout Specify timeout for connection to master
|
40
|
+
# @option arguments [Hash] :headers Custom HTTP headers
|
41
|
+
# @option arguments [Hash] :body The configuration for the index (`settings` and `mappings`)
|
36
42
|
# @raise [Elasticsearch::Transport::Transport::Errors::NotFound] when index already exists
|
37
43
|
# @return [Hash] the elasticsearch response
|
38
44
|
#
|
39
45
|
# @see http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/
|
40
|
-
def create_index!(suffix:
|
46
|
+
def create_index!(suffix: index_version, **options)
|
41
47
|
options = DEFAULT_OPTIONS.merge(options)
|
42
48
|
name = build_real_index_name(suffix)
|
43
49
|
definition = [settings_hash, mappings_hash].reduce(&:merge)
|
44
50
|
|
45
|
-
if options
|
51
|
+
if options.delete(:alias) && name != index_name
|
46
52
|
definition[:aliases] = { index_name => {} }
|
47
53
|
end
|
48
54
|
|
49
|
-
|
55
|
+
Esse::Events.instrument('elasticsearch.create_index') do |payload|
|
56
|
+
payload[:request] = opts = options.merge(index: name, body: definition)
|
57
|
+
payload[:response] = response = client.indices.create(**opts)
|
58
|
+
cluster.wait_for_status! if response
|
59
|
+
response
|
60
|
+
end
|
50
61
|
end
|
51
62
|
end
|
52
63
|
|
@@ -6,25 +6,30 @@ module Esse
|
|
6
6
|
module InstanceMethods
|
7
7
|
# Deletes ES index
|
8
8
|
#
|
9
|
-
# UsersIndex.
|
9
|
+
# UsersIndex.elasticsearch.delete_index! # deletes `<prefix_>users<_suffix|_index_version|_timestamp>` index
|
10
10
|
#
|
11
11
|
# @param suffix [String, nil] The index suffix Use nil if you want to delete the current index.
|
12
12
|
# @raise [Elasticsearch::Transport::Transport::Errors::NotFound] when index does not exists
|
13
13
|
# @return [Hash] elasticsearch response
|
14
|
-
def delete_index!(suffix:)
|
15
|
-
|
14
|
+
def delete_index!(suffix: index_version, **options)
|
15
|
+
Esse::Events.instrument('elasticsearch.delete_index') do |payload|
|
16
|
+
payload[:request] = opts = options.merge(index: index_name(suffix: suffix))
|
17
|
+
payload[:response] = response = client.indices.delete(**opts)
|
18
|
+
cluster.wait_for_status! if response
|
19
|
+
response
|
20
|
+
end
|
16
21
|
end
|
17
22
|
|
18
23
|
# Deletes ES index
|
19
24
|
#
|
20
|
-
# UsersIndex.
|
25
|
+
# UsersIndex.elasticsearch.delete_index # deletes `<prefix_>users<_suffix|_index_version|_timestamp>` index
|
21
26
|
#
|
22
27
|
# @param suffix [String, nil] The index suffix Use nil if you want to delete the current index.
|
23
|
-
# @return [Hash
|
24
|
-
def delete_index(suffix: index_version)
|
25
|
-
delete_index!(suffix: suffix)
|
28
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
29
|
+
def delete_index(suffix: index_version, **options)
|
30
|
+
delete_index!(suffix: suffix, **options)
|
26
31
|
rescue Elasticsearch::Transport::Transport::Errors::NotFound
|
27
|
-
|
32
|
+
{ 'errors' => true }
|
28
33
|
end
|
29
34
|
end
|
30
35
|
|
@@ -6,13 +6,13 @@ module Esse
|
|
6
6
|
module InstanceMethods
|
7
7
|
def import!(**options)
|
8
8
|
type_hash.each_value do |type|
|
9
|
-
type.
|
9
|
+
type.elasticsearch.import!(**options)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
def import(**options)
|
14
14
|
type_hash.each_value do |type|
|
15
|
-
type.
|
15
|
+
type.elasticsearch.import(**options)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -6,7 +6,7 @@ module Esse
|
|
6
6
|
module InstanceMethods
|
7
7
|
# Checks the index existance. Returns true or false
|
8
8
|
#
|
9
|
-
# UsersIndex.
|
9
|
+
# UsersIndex.elasticsearch.exist? #=> true
|
10
10
|
#
|
11
11
|
# @param options [Hash] Options hash
|
12
12
|
# @option options [String, nil] :suffix The index suffix. Defaults to the index_version.
|
@@ -21,7 +21,10 @@ module Esse
|
|
21
21
|
#
|
22
22
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-open.html
|
23
23
|
def open!(suffix: index_version, **options)
|
24
|
-
|
24
|
+
Esse::Events.instrument('elasticsearch.open') do |payload|
|
25
|
+
payload[:request] = attributes = options.merge(index: index_name(suffix: suffix))
|
26
|
+
payload[:response] = client.indices.open(**attributes)
|
27
|
+
end
|
25
28
|
end
|
26
29
|
|
27
30
|
# Open a previously closed index
|
@@ -35,13 +38,13 @@ module Esse
|
|
35
38
|
# @option options [Boolean] :ignore_unavailable Whether specified concrete indices should be ignored when
|
36
39
|
# unavailable (missing, closed, etc)
|
37
40
|
# @option options [Time] :timeout Explicit operation timeout
|
38
|
-
# @return [Hash
|
41
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
39
42
|
#
|
40
43
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-open-open.html
|
41
44
|
def open(suffix: index_version, **options)
|
42
45
|
open!(suffix: suffix, **options)
|
43
46
|
rescue Elasticsearch::Transport::Transport::ServerError
|
44
|
-
|
47
|
+
{ 'errors' => true }
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
@@ -27,13 +27,13 @@ module Esse
|
|
27
27
|
# @param :suffix [String, nil] :suffix The index suffix. Defaults to the index_version.
|
28
28
|
# A uniq index name will be generated if one index already exist with the given alias.
|
29
29
|
# @param options [Hash] Options hash
|
30
|
-
# @return [Hash
|
30
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
31
31
|
#
|
32
32
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-refresh.html
|
33
33
|
def refresh(suffix: index_version, **options)
|
34
34
|
refresh!(suffix: suffix, **options)
|
35
35
|
rescue Elasticsearch::Transport::Transport::ServerError
|
36
|
-
|
36
|
+
{ 'errors' => true }
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -17,14 +17,12 @@ module Esse
|
|
17
17
|
def reset_index!(suffix: index_version, **options)
|
18
18
|
existing = []
|
19
19
|
suffix ||= Esse.timestamp
|
20
|
-
while exist?(suffix: suffix).tap { |exist| existing << suffix if exist }
|
21
|
-
suffix = Esse.timestamp
|
22
|
-
end
|
20
|
+
suffix = Esse.timestamp while exist?(suffix: suffix).tap { |exist| existing << suffix if exist }
|
23
21
|
|
24
22
|
create_index!(suffix: suffix, **options)
|
25
23
|
import!(suffix: suffix, **options)
|
26
24
|
update_aliases!(suffix: suffix)
|
27
|
-
existing.each { |
|
25
|
+
existing.each { |_s| delete_index!(suffix: suffix, **options) }
|
28
26
|
true
|
29
27
|
end
|
30
28
|
end
|
@@ -27,7 +27,14 @@ module Esse
|
|
27
27
|
#
|
28
28
|
# @see http://www.elasticsearch.org/guide/reference/api/admin-indices-put-mapping/
|
29
29
|
def update_mapping!(suffix: index_version, **options)
|
30
|
-
|
30
|
+
Esse::Events.instrument('elasticsearch.update_mapping') do |payload|
|
31
|
+
body = mappings_hash.fetch(Esse::MAPPING_ROOT_KEY)
|
32
|
+
if (type = options[:type])
|
33
|
+
body = body[type.to_s] || body[type.to_sym]
|
34
|
+
end
|
35
|
+
payload[:request] = opts = options.merge(index: index_name(suffix: suffix), body: body)
|
36
|
+
payload[:response] = client.indices.put_mapping(**opts)
|
37
|
+
end
|
31
38
|
end
|
32
39
|
|
33
40
|
# Create or update a mapping
|
@@ -47,16 +54,15 @@ module Esse
|
|
47
54
|
# with the same name across all types
|
48
55
|
# @option options [Time] :timeout Explicit operation timeout
|
49
56
|
# @option options [Boolean] :master_timeout Timeout for connection to master
|
50
|
-
# @return [Hash
|
57
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
51
58
|
#
|
52
59
|
# @see http://www.elasticsearch.org/guide/reference/api/admin-indices-put-mapping/
|
53
60
|
def update_mapping(suffix: index_version, **options)
|
54
61
|
update_mapping!(suffix: suffix, **options)
|
55
62
|
rescue Elasticsearch::Transport::Transport::ServerError
|
56
|
-
|
63
|
+
{ 'errors' => true }
|
57
64
|
end
|
58
65
|
|
59
|
-
|
60
66
|
# Closes the index for read/write operations, updates the index settings, and open it again
|
61
67
|
#
|
62
68
|
# @option options [String] :expand_wildcards Whether to expand wildcard expression to concrete indices that
|
@@ -78,12 +84,31 @@ module Esse
|
|
78
84
|
def update_settings!(suffix: index_version, **options)
|
79
85
|
response = nil
|
80
86
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
open
|
87
|
+
settings = settings_hash.fetch(Esse::SETTING_ROOT_KEY).transform_keys(&:to_s)
|
88
|
+
settings.delete('number_of_shards') # Can't change number of shards for an index
|
89
|
+
analysis = settings.delete('analysis')
|
90
|
+
|
91
|
+
if settings.any?
|
92
|
+
# When changing the number of replicas the index needs to be open. Changing the number of replicas on a
|
93
|
+
# closed index might prevent the index to be opened correctly again.
|
94
|
+
Esse::Events.instrument('elasticsearch.update_settings') do |payload|
|
95
|
+
payload[:request] = opts = options.merge(index: index_name(suffix: suffix), body: { index: settings })
|
96
|
+
payload[:response] = response = client.indices.put_settings(**opts)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
if analysis
|
101
|
+
# It is also possible to define new analyzers for the index. But it is required to close the
|
102
|
+
# index first and open it after the changes are made.
|
103
|
+
close!(suffix: suffix)
|
104
|
+
begin
|
105
|
+
Esse::Events.instrument('elasticsearch.update_settings') do |payload|
|
106
|
+
payload[:request] = opts = options.merge(index: index_name(suffix: suffix), body: { analysis: analysis })
|
107
|
+
payload[:response] = response = client.indices.put_settings(**opts)
|
108
|
+
end
|
109
|
+
ensure
|
110
|
+
open!(suffix: suffix)
|
111
|
+
end
|
87
112
|
end
|
88
113
|
|
89
114
|
response
|
@@ -102,13 +127,13 @@ module Esse
|
|
102
127
|
# If set to `true` existing settings on an index remain unchanged, the default is `false`
|
103
128
|
# @option options [Time] :master_timeout Specify timeout for connection to master
|
104
129
|
# @option options [Boolean] :flat_settings Return settings in flat format (default: false)
|
105
|
-
# @return [Hash
|
130
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
106
131
|
#
|
107
132
|
# @see http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/
|
108
133
|
def update_settings(suffix: index_version, **options)
|
109
134
|
update_settings!(suffix: suffix, **options)
|
110
135
|
rescue Elasticsearch::Transport::Transport::ServerError
|
111
|
-
|
136
|
+
{ 'errors' => true }
|
112
137
|
end
|
113
138
|
end
|
114
139
|
|
data/lib/esse/backend/index.rb
CHANGED
@@ -15,7 +15,7 @@ module Esse
|
|
15
15
|
bulk(index: batch, suffix: suffix, **options)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
alias_method :import!, :import
|
19
19
|
|
20
20
|
# Performs multiple indexing or delete operations in a single API call.
|
21
21
|
# This reduces overhead and can greatly increase indexing speed.
|
@@ -53,7 +53,7 @@ module Esse
|
|
53
53
|
|
54
54
|
client.bulk(definition)
|
55
55
|
end
|
56
|
-
|
56
|
+
alias_method :bulk!, :bulk
|
57
57
|
|
58
58
|
# Adds a JSON document to the specified index and makes it searchable. If the document
|
59
59
|
# already exists, updates the document and increments its version.
|
@@ -69,10 +69,10 @@ module Esse
|
|
69
69
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-index_.html
|
70
70
|
def index(id:, body:, suffix: nil, **options)
|
71
71
|
client.index(
|
72
|
-
|
72
|
+
index: index_name(suffix: suffix), type: type_name, id: id, body: body, **options
|
73
73
|
)
|
74
74
|
end
|
75
|
-
|
75
|
+
alias_method :index!, :index
|
76
76
|
|
77
77
|
# Updates a document using the specified script.
|
78
78
|
#
|
@@ -88,7 +88,7 @@ module Esse
|
|
88
88
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-update.html
|
89
89
|
def update!(id:, body:, suffix: nil, **options)
|
90
90
|
client.update(
|
91
|
-
|
91
|
+
index: index_name(suffix: suffix), type: type_name, id: id, body: body, **options
|
92
92
|
)
|
93
93
|
end
|
94
94
|
|
@@ -100,13 +100,13 @@ module Esse
|
|
100
100
|
# @option [String, Integer] :id The `_id` of the elasticsearch document
|
101
101
|
# @option [Hash] :body the body of the request
|
102
102
|
# @option [String, nil] :suffix The index suffix. Defaults to the nil.
|
103
|
-
# @return [Hash
|
103
|
+
# @return [Hash] the elasticsearch response, or an hash with 'errors' as true in case of failure
|
104
104
|
#
|
105
105
|
# @see https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-update.html
|
106
106
|
def update(id:, body:, suffix: nil, **options)
|
107
107
|
update!(id: id, body: body, suffix: suffix, **options)
|
108
108
|
rescue Elasticsearch::Transport::Transport::Errors::NotFound
|
109
|
-
|
109
|
+
{ 'errors' => true }
|
110
110
|
end
|
111
111
|
|
112
112
|
# Removes a JSON document from the specified index.
|
@@ -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__)
|
@@ -30,13 +30,17 @@ module Esse
|
|
30
30
|
@types.each do |type|
|
31
31
|
@type = Hstring.new(type).underscore
|
32
32
|
copy_file(
|
33
|
-
'templates/
|
33
|
+
'templates/type_mappings.json',
|
34
34
|
base_dir.join(index_name, 'templates', "#{@type}_mapping.json"),
|
35
35
|
)
|
36
36
|
template(
|
37
|
-
'templates/
|
37
|
+
'templates/type_serializer.rb.erb',
|
38
38
|
base_dir.join(index_name, 'serializers', "#{@type}_serializer.rb"),
|
39
39
|
)
|
40
|
+
template(
|
41
|
+
'templates/type_collection.rb.erb',
|
42
|
+
base_dir.join(index_name, 'collections', "#{@type}_collection.rb"),
|
43
|
+
)
|
40
44
|
end
|
41
45
|
end
|
42
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
|