esse 0.2.2 → 0.2.3
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.
- checksums.yaml +4 -4
- data/lib/esse/cli/event_listener.rb +4 -5
- data/lib/esse/cli/generate.rb +14 -16
- data/lib/esse/cli/index/close.rb +1 -1
- data/lib/esse/cli/index/create.rb +1 -1
- data/lib/esse/cli/index/delete.rb +1 -1
- data/lib/esse/cli/index/import.rb +2 -2
- data/lib/esse/cli/index/open.rb +1 -1
- data/lib/esse/cli/index/reset.rb +1 -1
- data/lib/esse/cli/index/update_aliases.rb +2 -2
- data/lib/esse/cli/index/update_mapping.rb +8 -3
- data/lib/esse/cli/index/update_settings.rb +1 -1
- data/lib/esse/cli/index.rb +9 -4
- data/lib/esse/cli/templates/collection.rb.erb +6 -6
- data/lib/esse/cli/templates/{serializer.rb.erb → document.rb.erb} +6 -6
- data/lib/esse/cli/templates/index.rb.erb +39 -34
- data/lib/esse/cli.rb +5 -0
- data/lib/esse/cluster.rb +38 -12
- data/lib/esse/core.rb +7 -3
- data/lib/esse/deprecations/cluster.rb +5 -5
- data/lib/esse/deprecations/deprecate.rb +29 -0
- data/lib/esse/deprecations/index.rb +21 -3
- data/lib/esse/deprecations/index_backend_delegator.rb +217 -0
- data/lib/esse/deprecations/repository.rb +19 -4
- data/lib/esse/deprecations/repository_backend_delegator.rb +110 -0
- data/lib/esse/deprecations/serializer.rb +14 -0
- data/lib/esse/deprecations.rb +4 -0
- data/lib/esse/{serializer.rb → document.rb} +17 -2
- data/lib/esse/dynamic_template.rb +4 -0
- data/lib/esse/errors.rb +8 -1
- data/lib/esse/events.rb +13 -5
- data/lib/esse/hash_document.rb +1 -1
- data/lib/esse/import/bulk.rb +21 -11
- data/lib/esse/index/aliases.rb +50 -0
- data/lib/esse/index/attributes.rb +14 -5
- data/lib/esse/index/base.rb +17 -53
- data/lib/esse/index/documents.rb +236 -0
- data/lib/esse/index/indices.rb +171 -0
- data/lib/esse/index/object_document_mapper.rb +0 -59
- data/lib/esse/index/type.rb +2 -3
- data/lib/esse/index.rb +4 -3
- data/lib/esse/null_document.rb +1 -1
- data/lib/esse/repository/{backend.rb → documents.rb} +2 -3
- data/lib/esse/repository/object_document_mapper.rb +20 -20
- data/lib/esse/repository.rb +1 -2
- data/lib/esse/search/query.rb +8 -8
- data/lib/esse/template_loader.rb +1 -1
- data/lib/esse/transport/aliases.rb +36 -0
- data/lib/esse/transport/documents.rb +199 -0
- data/lib/esse/transport/health.rb +30 -0
- data/lib/esse/transport/indices.rb +192 -0
- data/lib/esse/{client_proxy → transport}/search.rb +9 -5
- data/lib/esse/transport.rb +44 -0
- data/lib/esse/version.rb +1 -1
- metadata +28 -28
- data/lib/esse/backend/index/aliases.rb +0 -73
- data/lib/esse/backend/index/close.rb +0 -54
- data/lib/esse/backend/index/create.rb +0 -67
- data/lib/esse/backend/index/delete.rb +0 -39
- data/lib/esse/backend/index/documents.rb +0 -270
- data/lib/esse/backend/index/existance.rb +0 -22
- data/lib/esse/backend/index/open.rb +0 -54
- data/lib/esse/backend/index/refresh.rb +0 -45
- data/lib/esse/backend/index/reset.rb +0 -33
- data/lib/esse/backend/index/update.rb +0 -143
- data/lib/esse/backend/index.rb +0 -56
- data/lib/esse/backend/repository_backend.rb +0 -105
- data/lib/esse/client_proxy.rb +0 -32
- data/lib/esse/index/backend.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30ce86d71e0cf9b67506dd0caf1651b91ae836c9e7981e46a238446c8afde078
|
4
|
+
data.tar.gz: 9ec1069cbb8106743d5832f94fbce5d2c937037a62a746350e736385f3b78cdc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2a5012e3d3dab0b3894f8e8fb1665be2a57c8538a3fc02bce2ac089510bd63b982f8f919554a9f16d6e8dafe5d93d9f5614d99ca4f170d82cc41e413fec0209
|
7
|
+
data.tar.gz: 034b15fd5cfc4f6ebdd97ba9d73ed284f50c209225b2c6a43b27216a57578ca1b91d9c92d4e020c4a1c7910038cf5978054bfa4b491bafb431bcfc1dcbc0a706
|
@@ -84,17 +84,16 @@ module Esse
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def elasticsearch_bulk(event)
|
87
|
-
print_message(
|
87
|
+
print_message('[%<runtime>s] Bulk index %<name>s%<type>s%<wait_interval>s: ',
|
88
88
|
runtime: formatted_runtime(event[:runtime]),
|
89
89
|
name: colorize(event[:request][:index], :bold),
|
90
90
|
type: (event[:request][:type] ? " for type #{colorize(event[:request][:type], :bold)}" : ''),
|
91
91
|
wait_interval: (event[:wait_interval].nonzero? ? " (wait interval #{event[:wait_interval]}s)" : ''),
|
92
|
-
newline: false,
|
93
|
-
|
94
|
-
stats = event[:request][:body_stats].select {|_, v| v.nonzero? }.map do |type, count|
|
92
|
+
newline: false,)
|
93
|
+
stats = event[:request][:body_stats].select { |_, v| v.nonzero? }.map do |type, count|
|
95
94
|
"#{colorize(type, :bold)}: #{count} docs"
|
96
95
|
end
|
97
|
-
print_message(stats.join(
|
96
|
+
print_message(stats.join(', ') + '.')
|
98
97
|
end
|
99
98
|
end
|
100
99
|
end
|
data/lib/esse/cli/generate.rb
CHANGED
@@ -16,19 +16,17 @@ module Esse
|
|
16
16
|
desc 'index NAME *TYPES', 'Creates a new index'
|
17
17
|
option :settings, type: :boolean, default: false, desc: 'Generate settings'
|
18
18
|
option :mappings, type: :boolean, default: false, desc: 'Generate mappings'
|
19
|
-
option :
|
19
|
+
option :documents, type: :boolean, default: false, desc: 'Generate documents'
|
20
20
|
option :collections, type: :boolean, default: false, desc: 'Generate collections'
|
21
21
|
option :active_record, type: :boolean, default: false, desc: 'Generate ActiveRecord models'
|
22
22
|
option :cluster_id, type: :string, desc: 'Elasticsearch cluster ID'
|
23
|
-
def index(name, *
|
23
|
+
def index(name, *repos)
|
24
24
|
ns_path = name.split(NAMESPACE_PATTERN_RE).tap(&:pop)
|
25
25
|
@index_name = Hstring.new(name.to_s).modulize.sub(/Index$/, '') + 'Index'
|
26
26
|
@index_name = Hstring.new(@index_name)
|
27
|
-
@
|
27
|
+
@repos = repos.map { |repo| Hstring.new(repo) }
|
28
28
|
@base_class = base_index_class(*ns_path)
|
29
|
-
|
30
|
-
@base_class += format('(:%s)', options[:cluster_id])
|
31
|
-
end
|
29
|
+
@index_cluster_id = options[:cluster_id]
|
32
30
|
@cli_options = options
|
33
31
|
|
34
32
|
base_dir = Esse.config.indices_directory.join(*ns_path.map { |n| Hstring.new(n).underscore.to_s })
|
@@ -52,11 +50,11 @@ module Esse
|
|
52
50
|
)
|
53
51
|
end
|
54
52
|
|
55
|
-
if @
|
56
|
-
if options[:
|
53
|
+
if @repos.empty?
|
54
|
+
if options[:documents]
|
57
55
|
template(
|
58
|
-
'templates/
|
59
|
-
base_dir.join(index_name, '
|
56
|
+
'templates/document.rb.erb',
|
57
|
+
base_dir.join(index_name, 'documents', 'document.rb'),
|
60
58
|
)
|
61
59
|
end
|
62
60
|
if options[:collections] && !options[:active_record]
|
@@ -67,19 +65,19 @@ module Esse
|
|
67
65
|
end
|
68
66
|
end
|
69
67
|
|
70
|
-
@
|
71
|
-
@
|
68
|
+
@repos.each do |type|
|
69
|
+
@repo = Hstring.new(type).underscore
|
72
70
|
|
73
|
-
if options[:
|
71
|
+
if options[:documents]
|
74
72
|
template(
|
75
|
-
'templates/
|
76
|
-
base_dir.join(index_name, '
|
73
|
+
'templates/document.rb.erb',
|
74
|
+
base_dir.join(index_name, 'documents', "#{@repo}_document.rb"),
|
77
75
|
)
|
78
76
|
end
|
79
77
|
if options[:collections] && !options[:active_record]
|
80
78
|
template(
|
81
79
|
'templates/collection.rb.erb',
|
82
|
-
base_dir.join(index_name, 'collections', "#{@
|
80
|
+
base_dir.join(index_name, 'collections', "#{@repo}_collection.rb"),
|
83
81
|
)
|
84
82
|
end
|
85
83
|
end
|
data/lib/esse/cli/index/close.rb
CHANGED
@@ -9,9 +9,9 @@ module Esse
|
|
9
9
|
validate_options!
|
10
10
|
indices.each do |index|
|
11
11
|
if (repo = @options[:repo])
|
12
|
-
index.
|
12
|
+
index.import(repo, **options)
|
13
13
|
else
|
14
|
-
index.
|
14
|
+
index.import(**options)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/lib/esse/cli/index/open.rb
CHANGED
data/lib/esse/cli/index/reset.rb
CHANGED
@@ -8,7 +8,7 @@ module Esse
|
|
8
8
|
def run
|
9
9
|
validate_options!
|
10
10
|
indices.each do |index|
|
11
|
-
index.
|
11
|
+
index.update_aliases(**options)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -21,7 +21,7 @@ module Esse
|
|
21
21
|
def validate_options!
|
22
22
|
validate_indices_option!
|
23
23
|
|
24
|
-
if @options[:suffix].nil?
|
24
|
+
if @options[:suffix].nil? || @options[:suffix].empty?
|
25
25
|
raise InvalidOption.new(<<~END)
|
26
26
|
You must specify a suffix to update the aliases.
|
27
27
|
END
|
@@ -9,11 +9,16 @@ module Esse
|
|
9
9
|
validate_options!
|
10
10
|
indices.each do |index|
|
11
11
|
if !index.mapping_single_type?
|
12
|
-
|
13
|
-
|
12
|
+
# Elasticsearch 6.x and older have multiple types per index.
|
13
|
+
# This gem supports multiple types per index for backward compatibility, but we recommend to update
|
14
|
+
# your elasticsearch to a at least 7.x version and use a single type per index.
|
15
|
+
#
|
16
|
+
# Note that the repository name will be used as the document type.
|
17
|
+
index.repo_hash.keys.each do |doc_type|
|
18
|
+
index.update_mapping(type: doc_type, **options)
|
14
19
|
end
|
15
20
|
else
|
16
|
-
index.
|
21
|
+
index.update_mapping(**options)
|
17
22
|
end
|
18
23
|
end
|
19
24
|
end
|
data/lib/esse/cli/index.rb
CHANGED
@@ -21,12 +21,14 @@ module Esse
|
|
21
21
|
Reset.new(indices: index_classes, **options.to_h.transform_keys(&:to_sym)).run
|
22
22
|
end
|
23
23
|
|
24
|
+
# @TODO Add reindex task to create a new index and import documents from the old index using _reindex API
|
25
|
+
|
24
26
|
desc 'create *INDEX_CLASSES', 'Creates indices for the given classes'
|
25
27
|
long_desc <<-DESC
|
26
28
|
Creates index and applies mapping and settings for the given classes.
|
27
29
|
|
28
30
|
Indices are created with the following naming convention:
|
29
|
-
<cluster.index_prefix>_<index_class.index_name>_<index_class.
|
31
|
+
<cluster.index_prefix>_<index_class.index_name>_<index_class.index_suffix>.
|
30
32
|
DESC
|
31
33
|
option :suffix, type: :string, default: nil, aliases: '-s', desc: 'Suffix to append to index name'
|
32
34
|
option :alias, type: :boolean, default: false, aliases: '-a', desc: 'Update alias after create index'
|
@@ -42,11 +44,14 @@ module Esse
|
|
42
44
|
Delete.new(indices: index_classes, **options.to_h.transform_keys(&:to_sym)).run
|
43
45
|
end
|
44
46
|
|
45
|
-
desc 'update_aliases *INDEX_CLASS', 'Replaces all existing aliases by the given suffix'
|
46
|
-
option :suffix, type: :string, aliases: '-s', desc: 'Suffix to append to index name'
|
47
|
+
desc 'update_aliases *INDEX_CLASS', 'Replaces all existing aliases by the given suffix/suffixes'
|
48
|
+
option :suffix, type: :string, aliases: '-s', repeatable: true, desc: 'Suffix to append to index name'
|
47
49
|
def update_aliases(*index_classes)
|
48
50
|
require_relative 'index/update_aliases'
|
49
|
-
|
51
|
+
|
52
|
+
kwargs = options.to_h.transform_keys(&:to_sym)
|
53
|
+
kwargs[:suffix] = (kwargs[:suffix] || []).flat_map { |s| s.split(',') }.uniq
|
54
|
+
UpdateAliases.new(indices: index_classes, **kwargs).run
|
50
55
|
end
|
51
56
|
|
52
57
|
desc 'update_settings *INDEX_CLASS', 'Closes the index for read/write operations, updates the index settings, and open it again'
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
class <%= @index_name %> < <%= @base_class %>
|
4
4
|
module Collections
|
5
|
-
class <%= @
|
6
|
-
<%- if @
|
7
|
-
# @yield [Array<<%= @
|
8
|
-
# @see <%= @index_name %>::<%= @
|
5
|
+
class <%= @repo.camelize if @repo %>Collection < Esse::Collection
|
6
|
+
<%- if @repo -%>
|
7
|
+
# @yield [Array<<%= @repo.camelize %>>]
|
8
|
+
# @see <%= @index_name %>::<%= @repo.camelize %>#collection
|
9
9
|
<%- end -%>
|
10
10
|
def each
|
11
11
|
offset = 0
|
@@ -13,7 +13,7 @@ class <%= @index_name %> < <%= @base_class %>
|
|
13
13
|
break if rows.none?
|
14
14
|
offset += 1
|
15
15
|
yield(rows)
|
16
|
-
# You may also preload associations here or add metadata useful for the
|
16
|
+
# You may also preload associations here or add metadata useful for the document
|
17
17
|
# yield(rows, **preload_associations(rows))
|
18
18
|
end
|
19
19
|
end
|
@@ -22,7 +22,7 @@ class <%= @index_name %> < <%= @base_class %>
|
|
22
22
|
|
23
23
|
# @param offset [Number] Offset to start from
|
24
24
|
def find_all(offset)
|
25
|
-
# @TODO load data from persistent
|
25
|
+
# @TODO load data from persistent storage
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class <%= @index_name %> < <%= @base_class %>
|
4
|
-
module
|
5
|
-
class <%= @
|
4
|
+
module Documents
|
5
|
+
class <%= @repo.camelize if @repo %>Document < Esse::Document
|
6
6
|
<%- if @cli_options[:active_record] -%>
|
7
7
|
delegate :id, to: :object
|
8
8
|
<%- else -%>
|
@@ -14,8 +14,8 @@ class <%= @index_name %> < <%= @base_class %>
|
|
14
14
|
def source
|
15
15
|
{
|
16
16
|
name: object.name,
|
17
|
-
<%- if @
|
18
|
-
type: "<%= @
|
17
|
+
<%- if @repo && defined?(Elasticsearch::VERSION) && Elasticsearch::VERSION > '5' -%>
|
18
|
+
type: "<%= @repo %>",
|
19
19
|
<%- end -%>
|
20
20
|
<%- if @cli_options[:active_record] -%>
|
21
21
|
created_at: object.created_at,
|
@@ -23,10 +23,10 @@ class <%= @index_name %> < <%= @base_class %>
|
|
23
23
|
<%- end -%>
|
24
24
|
}
|
25
25
|
end
|
26
|
-
<%- if @
|
26
|
+
<%- if @repo && defined?(Elasticsearch::VERSION) && Elasticsearch::VERSION <= '5' -%>
|
27
27
|
|
28
28
|
def type
|
29
|
-
'<%= @
|
29
|
+
'<%= @repo %>'
|
30
30
|
end
|
31
31
|
<%- end -%>
|
32
32
|
end
|
@@ -1,43 +1,49 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
<%- @
|
3
|
+
<%- @repos.each do |type| -%>
|
4
4
|
require_relative '<%= @index_name.demodulize.underscore.to_s %>/collections/<%= type.underscore %>_collection'
|
5
5
|
<%- end if @cli_options[:collections] && !@cli_options[:active_record] -%>
|
6
|
-
<%- @
|
7
|
-
require_relative '<%= @index_name.demodulize.underscore.to_s %>/
|
8
|
-
<%- end if @cli_options[:
|
6
|
+
<%- @repos.each do |type| -%>
|
7
|
+
require_relative '<%= @index_name.demodulize.underscore.to_s %>/documents/<%= type.underscore %>_document'
|
8
|
+
<%- end if @cli_options[:documents] -%>
|
9
9
|
class <%= @index_name %> < <%= @base_class %>
|
10
|
+
<%-if @index_cluster_id -%>
|
11
|
+
self.cluster_id = :<%= @index_cluster_id %>
|
12
|
+
<%- end -%>
|
10
13
|
<%- if @cli_options[:active_record] -%>
|
11
14
|
plugin :active_record
|
12
15
|
|
13
16
|
<%- end -%>
|
14
|
-
<%- if @
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
<%- if @repos.empty? -%>
|
18
|
+
repository :default do
|
19
|
+
<%- if @cli_options[:active_record] -%>
|
20
|
+
collection ::<%= @index_name.camelize %>.all
|
21
|
+
<%- elsif @cli_options[:collections] -%>
|
22
|
+
collection Collections::Collection
|
23
|
+
<%- else -%>
|
24
|
+
collection do |**context, &block|
|
25
|
+
query = <%= @index_name.camelize.sub(/Index$/, '') %>.all
|
26
|
+
query = query.where(id: context[:id]) if context[:id]
|
27
|
+
query.find_in_batches(batch_size: 1_000) do |batch|
|
28
|
+
block.call(batch, **context)
|
29
|
+
end
|
25
30
|
end
|
31
|
+
<%- end -%>
|
32
|
+
|
33
|
+
<%- if @cli_options[:documents] -%>
|
34
|
+
document Documents::Document
|
35
|
+
<%- else -%>
|
36
|
+
document do |object, **_context|
|
37
|
+
{
|
38
|
+
id: object.id,
|
39
|
+
name: object.name,
|
40
|
+
}
|
41
|
+
end
|
42
|
+
<%- end # if @cli_options[:documents] -%>
|
26
43
|
end
|
27
|
-
<%- end
|
28
|
-
<%-
|
29
|
-
serializer Serializers::Serializer
|
30
|
-
<%- else -%>
|
31
|
-
serializer do |object, **_context|
|
32
|
-
{
|
33
|
-
id: object.id,
|
34
|
-
name: object.name,
|
35
|
-
}
|
36
|
-
end
|
37
|
-
<%- end # if @cli_options[:serializers] -%>
|
38
|
-
<%- end # /@types.empty?-%>
|
44
|
+
<%- end # /@repos.empty?-%>
|
45
|
+
<%- @repos.each do |type| -%>
|
39
46
|
|
40
|
-
<%- @types.each do |type| -%>
|
41
47
|
repository :<%= type.underscore %> do
|
42
48
|
<%- if @cli_options[:active_record] -%>
|
43
49
|
collection ::<%= type.camelize %>.all
|
@@ -48,14 +54,14 @@ class <%= @index_name %> < <%= @base_class %>
|
|
48
54
|
query = <%= type.camelize %>.all
|
49
55
|
query = query.where(id: context[:id]) if context[:id]
|
50
56
|
query.find_in_batches(batch_size: 1_000) do |batch|
|
51
|
-
block.call(batch)
|
57
|
+
block.call(batch, **context)
|
52
58
|
end
|
53
59
|
end
|
54
60
|
<%- end -%>
|
55
|
-
<%- if @cli_options[:
|
56
|
-
|
61
|
+
<%- if @cli_options[:documents] -%>
|
62
|
+
document Documents::<%= type.camelize %>Document
|
57
63
|
<%- else -%>
|
58
|
-
|
64
|
+
document do |<%= type.underscore %>, **_context|
|
59
65
|
{
|
60
66
|
id: <%= type.underscore %>.id,
|
61
67
|
name: <%= @index_name.underscore %>.name,
|
@@ -63,6 +69,5 @@ class <%= @index_name %> < <%= @base_class %>
|
|
63
69
|
end
|
64
70
|
<%- end -%>
|
65
71
|
end
|
66
|
-
|
67
|
-
<%- end #@types.each do |type| -%>
|
72
|
+
<%- end #@repos.each do |type| -%>
|
68
73
|
end
|
data/lib/esse/cli.rb
CHANGED
@@ -32,6 +32,7 @@ module Esse
|
|
32
32
|
def initialize(*)
|
33
33
|
super
|
34
34
|
|
35
|
+
after_initialize
|
35
36
|
load_app_config(options[:require])
|
36
37
|
setup_listeners if !options[:silent] && Esse.config.cli_event_listeners?
|
37
38
|
end
|
@@ -71,6 +72,10 @@ module Esse
|
|
71
72
|
|
72
73
|
private
|
73
74
|
|
75
|
+
def after_initialize
|
76
|
+
# esse plugins may override this method
|
77
|
+
end
|
78
|
+
|
74
79
|
def setup_listeners
|
75
80
|
Esse::Events.__bus__.events.keys.grep(/^elasticsearch/).each do |event_name|
|
76
81
|
Esse::Events.subscribe(event_name) do |event|
|
data/lib/esse/cluster.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'cluster_engine'
|
4
|
-
require_relative '
|
4
|
+
require_relative 'transport'
|
5
5
|
|
6
6
|
module Esse
|
7
7
|
class Cluster
|
8
|
-
ATTRIBUTES = %i[index_prefix settings mappings client wait_for_status].freeze
|
8
|
+
ATTRIBUTES = %i[index_prefix settings mappings client wait_for_status readonly].freeze
|
9
9
|
WAIT_FOR_STATUSES = %w[green yellow red].freeze
|
10
10
|
|
11
11
|
# The index prefix. For example an index named UsersIndex.
|
@@ -28,12 +28,17 @@ module Esse
|
|
28
28
|
# wait_for_status: green
|
29
29
|
attr_accessor :wait_for_status
|
30
30
|
|
31
|
+
# Disable all writes from the application to the underlying Elasticsearch instance while keeping the
|
32
|
+
# application running and handling search requests.
|
33
|
+
attr_writer :readonly
|
34
|
+
|
31
35
|
attr_reader :id
|
32
36
|
|
33
37
|
def initialize(id:, **options)
|
34
38
|
@id = id.to_sym
|
35
39
|
@settings = {}
|
36
40
|
@mappings = {}
|
41
|
+
@readonly = false
|
37
42
|
assign(options)
|
38
43
|
end
|
39
44
|
|
@@ -61,6 +66,17 @@ module Esse
|
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
69
|
+
# @return [Boolean] Return true if the cluster is readonly
|
70
|
+
def readonly?
|
71
|
+
!!@readonly
|
72
|
+
end
|
73
|
+
|
74
|
+
# @raise [Esse::Transport::ReadonlyClusterError] if the cluster is readonly
|
75
|
+
# @return [void]
|
76
|
+
def throw_error_when_readonly!
|
77
|
+
raise Esse::Transport::ReadonlyClusterError if readonly?
|
78
|
+
end
|
79
|
+
|
64
80
|
# Define the elasticsearch client connection
|
65
81
|
# @param es_client [Elasticsearch::Client, OpenSearch::Client, Hash] an instance of elasticsearch/api client or an hash
|
66
82
|
# with the settings that will be used to initialize the Client
|
@@ -77,24 +93,33 @@ module Esse
|
|
77
93
|
end
|
78
94
|
|
79
95
|
def inspect
|
80
|
-
attrs = ([:id] + ATTRIBUTES - [:client]).map do |method|
|
96
|
+
attrs = ([:id] + ATTRIBUTES - [:client, :readonly]).map do |method|
|
81
97
|
value = public_send(method)
|
82
98
|
format('%<k>s=%<v>p', k: method, v: value) if value
|
83
99
|
end.compact
|
100
|
+
attrs << 'readonly=true' if readonly?
|
84
101
|
attrs << format('client=%p', @client)
|
85
102
|
format('#<Esse::Cluster %<attrs>s>', attrs: attrs.join(' '))
|
86
103
|
end
|
87
104
|
|
88
|
-
|
105
|
+
# Wait until cluster is in a specific state
|
106
|
+
#
|
107
|
+
# @option [String] :status Wait until cluster is in a specific state (options: green, yellow, red)
|
108
|
+
# @option [String] :index Limit the information returned to a specific index
|
109
|
+
def wait_for_status!(status: nil, **kwargs)
|
110
|
+
status ||= wait_for_status
|
89
111
|
return unless WAIT_FOR_STATUSES.include?(status.to_s)
|
90
112
|
|
91
|
-
|
113
|
+
api.health(**kwargs, wait_for_status: status.to_s)
|
92
114
|
end
|
93
115
|
|
94
|
-
# @
|
95
|
-
def
|
96
|
-
|
97
|
-
|
116
|
+
# @return [void]
|
117
|
+
def may_update_type!(hash, key: :type)
|
118
|
+
if (single_type = engine.mapping_default_type)
|
119
|
+
hash[key] = single_type
|
120
|
+
return
|
121
|
+
end
|
122
|
+
hash.delete(key) if engine.mapping_single_type?
|
98
123
|
end
|
99
124
|
|
100
125
|
def info
|
@@ -108,8 +133,9 @@ module Esse
|
|
108
133
|
end
|
109
134
|
|
110
135
|
def engine
|
111
|
-
ClusterEngine.new(**info)
|
136
|
+
@engine ||=ClusterEngine.new(**info)
|
112
137
|
end
|
138
|
+
alias_method :warm_up!, :engine
|
113
139
|
|
114
140
|
# Build a search query for the given indices
|
115
141
|
#
|
@@ -121,9 +147,9 @@ module Esse
|
|
121
147
|
|
122
148
|
# Return the proxy object used to perform low level actions on the elasticsearch cluster through the official api client
|
123
149
|
#
|
124
|
-
# @return [Esse::
|
150
|
+
# @return [Esse::Transport] The cluster api instance
|
125
151
|
def api
|
126
|
-
Esse::
|
152
|
+
Esse::Transport.new(self)
|
127
153
|
end
|
128
154
|
end
|
129
155
|
end
|
data/lib/esse/core.rb
CHANGED
@@ -5,7 +5,7 @@ module Esse
|
|
5
5
|
require_relative 'cluster'
|
6
6
|
require_relative 'primitives'
|
7
7
|
require_relative 'collection'
|
8
|
-
require_relative '
|
8
|
+
require_relative 'document'
|
9
9
|
require_relative 'hash_document'
|
10
10
|
require_relative 'null_document'
|
11
11
|
require_relative 'repository'
|
@@ -15,8 +15,6 @@ module Esse
|
|
15
15
|
require_relative 'template_loader'
|
16
16
|
require_relative 'import/request_body'
|
17
17
|
require_relative 'import/bulk'
|
18
|
-
require_relative 'backend/index'
|
19
|
-
require_relative 'backend/repository_backend'
|
20
18
|
require_relative 'version'
|
21
19
|
require_relative 'logging'
|
22
20
|
require_relative 'events'
|
@@ -85,4 +83,10 @@ module Esse
|
|
85
83
|
end
|
86
84
|
true
|
87
85
|
end
|
86
|
+
|
87
|
+
def self.document?(object)
|
88
|
+
return false unless object
|
89
|
+
|
90
|
+
!!(object.is_a?(Esse::Document) && object.id)
|
91
|
+
end
|
88
92
|
end
|
@@ -2,26 +2,26 @@
|
|
2
2
|
|
3
3
|
module Esse
|
4
4
|
class Cluster
|
5
|
-
extend
|
5
|
+
extend Esse::Deprecations::Deprecate
|
6
6
|
|
7
7
|
def index_settings
|
8
8
|
settings
|
9
9
|
end
|
10
|
-
deprecate :index_settings, :settings,
|
10
|
+
deprecate :index_settings, :settings, 2023, 12
|
11
11
|
|
12
12
|
def index_settings=(value)
|
13
13
|
self.settings = value
|
14
14
|
end
|
15
|
-
deprecate :index_settings=, :settings=,
|
15
|
+
deprecate :index_settings=, :settings=, 2023, 12
|
16
16
|
|
17
17
|
def index_mappings
|
18
18
|
mappings
|
19
19
|
end
|
20
|
-
deprecate :index_mappings, :mappings,
|
20
|
+
deprecate :index_mappings, :mappings, 2023, 12
|
21
21
|
|
22
22
|
def index_mappings=(value)
|
23
23
|
self.mappings = value
|
24
24
|
end
|
25
|
-
deprecate :index_mappings=, :mappings=,
|
25
|
+
deprecate :index_mappings=, :mappings=, 2023, 12
|
26
26
|
end
|
27
27
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Esse
|
4
|
+
module Deprecations
|
5
|
+
module Deprecate
|
6
|
+
def self.extended(base)
|
7
|
+
base.extend Gem::Deprecate
|
8
|
+
base.include InstanceMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
def warning(method, repl, year, month)
|
13
|
+
msg = ["NOTE: #{method} is deprecated"]
|
14
|
+
msg << if repl == :none
|
15
|
+
' with no replacement'
|
16
|
+
elsif repl.respond_to?(:call)
|
17
|
+
"; use #{repl.call} instead"
|
18
|
+
else
|
19
|
+
"; use #{repl} instead"
|
20
|
+
end
|
21
|
+
msg << '. It will be removed on or after %4d-%02d-01.' % [year, month]
|
22
|
+
msg << "\n#{method} called from #{Gem.location_of_caller(2).join(':')}"
|
23
|
+
|
24
|
+
warn "#{msg.join}." unless Gem::Deprecate.skip
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|