esse 0.2.0 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/esse/cli/event_listener.rb +13 -0
- data/lib/esse/cli/generate.rb +53 -14
- data/lib/esse/cli/index/base_operation.rb +5 -13
- 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 +6 -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 +9 -5
- data/lib/esse/cli/index/update_settings.rb +1 -1
- data/lib/esse/cli/index.rb +11 -4
- data/lib/esse/cli/templates/collection.rb.erb +29 -0
- data/lib/esse/cli/templates/config.rb.erb +13 -3
- data/lib/esse/cli/templates/document.rb.erb +34 -0
- data/lib/esse/cli/templates/index.rb.erb +63 -114
- data/lib/esse/cli/templates/mappings.json +27 -0
- data/lib/esse/cli/templates/settings.json +62 -0
- data/lib/esse/cli.rb +5 -0
- data/lib/esse/cluster.rb +93 -12
- data/lib/esse/cluster_engine.rb +42 -0
- data/lib/esse/collection.rb +18 -0
- data/lib/esse/config.rb +14 -2
- data/lib/esse/core.rb +28 -7
- data/lib/esse/deprecations/cluster.rb +27 -0
- data/lib/esse/deprecations/deprecate.rb +29 -0
- data/lib/esse/deprecations/index.rb +37 -0
- data/lib/esse/deprecations/index_backend_delegator.rb +217 -0
- data/lib/esse/deprecations/repository.rb +34 -0
- data/lib/esse/deprecations/repository_backend_delegator.rb +110 -0
- data/lib/esse/deprecations/serializer.rb +14 -0
- data/lib/esse/deprecations.rb +7 -0
- data/lib/esse/document.rb +91 -0
- data/lib/esse/dynamic_template.rb +43 -0
- data/lib/esse/errors.rb +60 -2
- data/lib/esse/events/event.rb +4 -19
- data/lib/esse/events.rb +13 -2
- data/lib/esse/hash_document.rb +38 -0
- data/lib/esse/import/bulk.rb +106 -0
- data/lib/esse/import/request_body.rb +60 -0
- data/lib/esse/index/aliases.rb +50 -0
- data/lib/esse/index/attributes.rb +107 -0
- 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/inheritance.rb +30 -0
- data/lib/esse/index/mappings.rb +6 -19
- data/lib/esse/index/object_document_mapper.rb +36 -0
- data/lib/esse/index/plugins.rb +42 -0
- data/lib/esse/index/search.rb +27 -0
- data/lib/esse/index/settings.rb +2 -2
- data/lib/esse/index/type.rb +51 -11
- data/lib/esse/index.rb +14 -9
- data/lib/esse/index_mapping.rb +10 -2
- data/lib/esse/index_setting.rb +3 -1
- data/lib/esse/null_document.rb +35 -0
- data/lib/esse/plugins.rb +12 -0
- data/lib/esse/primitives/hstring.rb +1 -1
- data/lib/esse/{index_type → repository}/actions.rb +1 -1
- data/lib/esse/repository/documents.rb +13 -0
- data/lib/esse/repository/object_document_mapper.rb +157 -0
- data/lib/esse/repository.rb +17 -0
- data/lib/esse/search/query.rb +105 -0
- data/lib/esse/search/response.rb +46 -0
- 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/transport/search.rb +48 -0
- data/lib/esse/transport.rb +44 -0
- data/lib/esse/version.rb +1 -1
- data/lib/esse.rb +20 -5
- metadata +55 -50
- 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 -23
- 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 -43
- 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 -54
- data/lib/esse/backend/index_type/documents.rb +0 -214
- data/lib/esse/backend/index_type.rb +0 -37
- data/lib/esse/cli/templates/type_collection.rb.erb +0 -41
- data/lib/esse/cli/templates/type_mappings.json +0 -6
- data/lib/esse/cli/templates/type_serializer.rb.erb +0 -23
- data/lib/esse/index/backend.rb +0 -14
- data/lib/esse/index/naming.rb +0 -64
- data/lib/esse/index_type/backend.rb +0 -14
- data/lib/esse/index_type/mappings.rb +0 -42
- data/lib/esse/index_type.rb +0 -15
- data/lib/esse/object_document_mapper.rb +0 -110
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
|
@@ -82,6 +82,19 @@ module Esse
|
|
82
82
|
padding: runtime_padding(event[:runtime])
|
83
83
|
end
|
84
84
|
end
|
85
|
+
|
86
|
+
def elasticsearch_bulk(event)
|
87
|
+
print_message('[%<runtime>s] Bulk index %<name>s%<type>s%<wait_interval>s: ',
|
88
|
+
runtime: formatted_runtime(event[:runtime]),
|
89
|
+
name: colorize(event[:request][:index], :bold),
|
90
|
+
type: (event[:request][:type] ? " for type #{colorize(event[:request][:type], :bold)}" : ''),
|
91
|
+
wait_interval: (event[:wait_interval].nonzero? ? " (wait interval #{event[:wait_interval]}s)" : ''),
|
92
|
+
newline: false,)
|
93
|
+
stats = event[:request][:body_stats].select { |_, v| v.nonzero? }.map do |type, count|
|
94
|
+
"#{colorize(type, :bold)}: #{count} docs"
|
95
|
+
end
|
96
|
+
print_message(stats.join(', ') + '.')
|
97
|
+
end
|
85
98
|
end
|
86
99
|
end
|
87
100
|
end
|
data/lib/esse/cli/generate.rb
CHANGED
@@ -14,34 +14,73 @@ module Esse
|
|
14
14
|
end
|
15
15
|
|
16
16
|
desc 'index NAME *TYPES', 'Creates a new index'
|
17
|
-
|
17
|
+
option :settings, type: :boolean, default: false, desc: 'Generate settings'
|
18
|
+
option :mappings, type: :boolean, default: false, desc: 'Generate mappings'
|
19
|
+
option :documents, type: :boolean, default: false, desc: 'Generate documents'
|
20
|
+
option :collections, type: :boolean, default: false, desc: 'Generate collections'
|
21
|
+
option :active_record, type: :boolean, default: false, desc: 'Generate ActiveRecord models'
|
22
|
+
option :cluster_id, type: :string, desc: 'Elasticsearch cluster ID'
|
23
|
+
def index(name, *repos)
|
18
24
|
ns_path = name.split(NAMESPACE_PATTERN_RE).tap(&:pop)
|
19
25
|
@index_name = Hstring.new(name.to_s).modulize.sub(/Index$/, '') + 'Index'
|
20
26
|
@index_name = Hstring.new(@index_name)
|
21
|
-
@
|
27
|
+
@repos = repos.map { |repo| Hstring.new(repo) }
|
22
28
|
@base_class = base_index_class(*ns_path)
|
29
|
+
@index_cluster_id = options[:cluster_id]
|
30
|
+
@cli_options = options
|
23
31
|
|
24
|
-
base_dir = Esse.config.indices_directory.join(*ns_path)
|
32
|
+
base_dir = Esse.config.indices_directory.join(*ns_path.map { |n| Hstring.new(n).underscore.to_s })
|
25
33
|
index_name = @index_name.demodulize.underscore.to_s
|
26
34
|
template(
|
27
35
|
'templates/index.rb.erb',
|
28
36
|
base_dir.join("#{index_name}.rb"),
|
29
37
|
)
|
30
|
-
|
31
|
-
|
38
|
+
|
39
|
+
if options[:settings]
|
32
40
|
copy_file(
|
33
|
-
'templates/
|
34
|
-
base_dir.join(index_name, 'templates',
|
35
|
-
)
|
36
|
-
template(
|
37
|
-
'templates/type_serializer.rb.erb',
|
38
|
-
base_dir.join(index_name, 'serializers', "#{@type}_serializer.rb"),
|
41
|
+
'templates/settings.json',
|
42
|
+
base_dir.join(index_name, 'templates', 'settings.json'),
|
39
43
|
)
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
end
|
45
|
+
|
46
|
+
if options[:mappings]
|
47
|
+
copy_file(
|
48
|
+
'templates/mappings.json',
|
49
|
+
base_dir.join(index_name, 'templates', 'mappings.json'),
|
43
50
|
)
|
44
51
|
end
|
52
|
+
|
53
|
+
if @repos.empty?
|
54
|
+
if options[:documents]
|
55
|
+
template(
|
56
|
+
'templates/document.rb.erb',
|
57
|
+
base_dir.join(index_name, 'documents', 'document.rb'),
|
58
|
+
)
|
59
|
+
end
|
60
|
+
if options[:collections] && !options[:active_record]
|
61
|
+
template(
|
62
|
+
'templates/collection.rb.erb',
|
63
|
+
base_dir.join(index_name, 'collections', 'collection.rb'),
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
@repos.each do |type|
|
69
|
+
@repo = Hstring.new(type).underscore
|
70
|
+
|
71
|
+
if options[:documents]
|
72
|
+
template(
|
73
|
+
'templates/document.rb.erb',
|
74
|
+
base_dir.join(index_name, 'documents', "#{@repo}_document.rb"),
|
75
|
+
)
|
76
|
+
end
|
77
|
+
if options[:collections] && !options[:active_record]
|
78
|
+
template(
|
79
|
+
'templates/collection.rb.erb',
|
80
|
+
base_dir.join(index_name, 'collections', "#{@repo}_collection.rb"),
|
81
|
+
)
|
82
|
+
end
|
83
|
+
end
|
45
84
|
end
|
46
85
|
|
47
86
|
protected
|
@@ -31,7 +31,10 @@ module Esse
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def indices
|
34
|
-
eager_load_indices!
|
34
|
+
Esse.eager_load_indices!
|
35
|
+
if @indices == ['all']
|
36
|
+
return Esse::Index.descendants.reject(&:abstract_class?)
|
37
|
+
end
|
35
38
|
@indices.map do |class_name|
|
36
39
|
const_exist = begin
|
37
40
|
Kernel.const_defined?(class_name)
|
@@ -58,18 +61,7 @@ module Esse
|
|
58
61
|
end
|
59
62
|
|
60
63
|
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
|
64
|
+
end.reject(&:abstract_class?)
|
73
65
|
end
|
74
66
|
end
|
75
67
|
end
|
data/lib/esse/cli/index/close.rb
CHANGED
@@ -8,14 +8,18 @@ module Esse
|
|
8
8
|
def run
|
9
9
|
validate_options!
|
10
10
|
indices.each do |index|
|
11
|
-
|
11
|
+
if (repo = @options[:repo])
|
12
|
+
index.import(repo, **options)
|
13
|
+
else
|
14
|
+
index.import(**options)
|
15
|
+
end
|
12
16
|
end
|
13
17
|
end
|
14
18
|
|
15
19
|
private
|
16
20
|
|
17
21
|
def options
|
18
|
-
@options.slice(*@options.keys - CLI_IGNORE_OPTS)
|
22
|
+
@options.slice(*@options.keys - CLI_IGNORE_OPTS - [:repo])
|
19
23
|
end
|
20
24
|
|
21
25
|
def validate_options!
|
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
|
@@ -8,13 +8,17 @@ module Esse
|
|
8
8
|
def run
|
9
9
|
validate_options!
|
10
10
|
indices.each do |index|
|
11
|
-
if index.
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
if !index.mapping_single_type?
|
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)
|
15
19
|
end
|
16
20
|
else
|
17
|
-
index.
|
21
|
+
index.update_mapping(**options)
|
18
22
|
end
|
19
23
|
end
|
20
24
|
end
|
data/lib/esse/cli/index.rb
CHANGED
@@ -15,17 +15,20 @@ module Esse
|
|
15
15
|
* Delete the old index.
|
16
16
|
DESC
|
17
17
|
option :suffix, type: :string, default: nil, aliases: '-s', desc: 'Suffix to append to index name'
|
18
|
+
option :import, type: :boolean, default: true, desc: 'Import documents before point alias to the new index'
|
18
19
|
def reset(*index_classes)
|
19
20
|
require_relative 'index/reset'
|
20
21
|
Reset.new(indices: index_classes, **options.to_h.transform_keys(&:to_sym)).run
|
21
22
|
end
|
22
23
|
|
24
|
+
# @TODO Add reindex task to create a new index and import documents from the old index using _reindex API
|
25
|
+
|
23
26
|
desc 'create *INDEX_CLASSES', 'Creates indices for the given classes'
|
24
27
|
long_desc <<-DESC
|
25
28
|
Creates index and applies mapping and settings for the given classes.
|
26
29
|
|
27
30
|
Indices are created with the following naming convention:
|
28
|
-
<cluster.index_prefix>_<index_class.index_name>_<index_class.
|
31
|
+
<cluster.index_prefix>_<index_class.index_name>_<index_class.index_suffix>.
|
29
32
|
DESC
|
30
33
|
option :suffix, type: :string, default: nil, aliases: '-s', desc: 'Suffix to append to index name'
|
31
34
|
option :alias, type: :boolean, default: false, aliases: '-a', desc: 'Update alias after create index'
|
@@ -41,11 +44,14 @@ module Esse
|
|
41
44
|
Delete.new(indices: index_classes, **options.to_h.transform_keys(&:to_sym)).run
|
42
45
|
end
|
43
46
|
|
44
|
-
desc 'update_aliases *INDEX_CLASS', 'Replaces all existing aliases by the given suffix'
|
45
|
-
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'
|
46
49
|
def update_aliases(*index_classes)
|
47
50
|
require_relative 'index/update_aliases'
|
48
|
-
|
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
|
49
55
|
end
|
50
56
|
|
51
57
|
desc 'update_settings *INDEX_CLASS', 'Closes the index for read/write operations, updates the index settings, and open it again'
|
@@ -81,6 +87,7 @@ module Esse
|
|
81
87
|
desc 'import *INDEX_CLASSES', 'Import documents from the given classes'
|
82
88
|
option :suffix, type: :string, default: nil, aliases: '-s', desc: 'Suffix to append to index name'
|
83
89
|
option :context, type: :hash, default: {}, required: true, desc: 'List of options to pass to the index class'
|
90
|
+
option :repo, type: :string, default: nil, alias: '-r', desc: 'Repository to use for import'
|
84
91
|
def import(*index_classes)
|
85
92
|
require_relative 'index/import'
|
86
93
|
Import.new(indices: index_classes, **HashUtils.deep_transform_keys(options.to_h, &:to_sym)).run
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class <%= @index_name %> < <%= @base_class %>
|
4
|
+
module Collections
|
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
|
+
<%- end -%>
|
10
|
+
def each
|
11
|
+
offset = 0
|
12
|
+
while (rows = find_all(offset))
|
13
|
+
break if rows.none?
|
14
|
+
offset += 1
|
15
|
+
yield(rows)
|
16
|
+
# You may also preload associations here or add metadata useful for the document
|
17
|
+
# yield(rows, **preload_associations(rows))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
# @param offset [Number] Offset to start from
|
24
|
+
def find_all(offset)
|
25
|
+
# @TODO load data from persistent storage
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -8,13 +8,23 @@ Esse.configure do |config|
|
|
8
8
|
# you also can add environment to the index prefix if available:
|
9
9
|
# cluster.index_prefix = "esse_#{ENV['RACK_ENV']}"
|
10
10
|
#
|
11
|
-
# Initialize the ElastiSearch client to be used by the default cluster
|
12
|
-
cluster.client = Elasticsearch::Client.new
|
11
|
+
# Initialize the ElastiSearch/OpenSearch client to be used by the default cluster
|
12
|
+
# cluster.client = Elasticsearch::Client.new or OpenSearch::Client.new
|
13
13
|
|
14
14
|
# Global index settings
|
15
|
-
# cluster.
|
15
|
+
# cluster.settings = {
|
16
16
|
# number_of_shards: 5,
|
17
17
|
# number_of_replicas: 0,
|
18
18
|
# }
|
19
|
+
|
20
|
+
# Global index mappings
|
21
|
+
# cluster.mappings = {
|
22
|
+
# dynamic_templates: [
|
23
|
+
# # ... Dynamic templates ...
|
24
|
+
# ],
|
25
|
+
# properties: {
|
26
|
+
# # ... Explicit mapping
|
27
|
+
# },
|
28
|
+
# }
|
19
29
|
end
|
20
30
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class <%= @index_name %> < <%= @base_class %>
|
4
|
+
module Documents
|
5
|
+
class <%= @repo.camelize if @repo %>Document < Esse::Document
|
6
|
+
<%- if @cli_options[:active_record] -%>
|
7
|
+
delegate :id, to: :object
|
8
|
+
<%- else -%>
|
9
|
+
def id
|
10
|
+
object.id
|
11
|
+
end
|
12
|
+
<%- end -%>
|
13
|
+
|
14
|
+
def source
|
15
|
+
{
|
16
|
+
name: object.name,
|
17
|
+
<%- if @repo && defined?(Elasticsearch::VERSION) && Elasticsearch::VERSION > '5' -%>
|
18
|
+
type: "<%= @repo %>",
|
19
|
+
<%- end -%>
|
20
|
+
<%- if @cli_options[:active_record] -%>
|
21
|
+
created_at: object.created_at,
|
22
|
+
updated_at: object.updated_at,
|
23
|
+
<%- end -%>
|
24
|
+
}
|
25
|
+
end
|
26
|
+
<%- if @repo && defined?(Elasticsearch::VERSION) && Elasticsearch::VERSION <= '5' -%>
|
27
|
+
|
28
|
+
def type
|
29
|
+
'<%= @repo %>'
|
30
|
+
end
|
31
|
+
<%- end -%>
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,124 +1,73 @@
|
|
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
|
-
<%- end -%>
|
6
|
-
<%- @
|
7
|
-
require_relative '<%= @index_name.demodulize.underscore.to_s %>/
|
8
|
-
<%- end -%>
|
9
|
-
|
5
|
+
<%- end if @cli_options[:collections] && !@cli_options[:active_record] -%>
|
6
|
+
<%- @repos.each do |type| -%>
|
7
|
+
require_relative '<%= @index_name.demodulize.underscore.to_s %>/documents/<%= type.underscore %>_document'
|
8
|
+
<%- end if @cli_options[:documents] -%>
|
10
9
|
class <%= @index_name %> < <%= @base_class %>
|
11
|
-
|
12
|
-
|
10
|
+
<%-if @index_cluster_id -%>
|
11
|
+
self.cluster_id = :<%= @index_cluster_id %>
|
12
|
+
<%- end -%>
|
13
|
+
<%- if @cli_options[:active_record] -%>
|
14
|
+
plugin :active_record
|
13
15
|
|
14
|
-
<%-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
# Each these objects should be serialized using the serializer in described in the next section.
|
31
|
-
# The number of objects will be indexed to elasticsearch using the bulk api. So adjust the
|
32
|
-
# number of objects to be indexed accordingly.
|
33
|
-
#
|
34
|
-
# Here is a good place to eager loading data from database or any other repository.
|
35
|
-
# The bellow example is a rails like application that could preload using activerecord
|
36
|
-
#
|
37
|
-
# collection do |**context, &block|
|
38
|
-
# query = <%= @index_name.camelize %>.all
|
39
|
-
# query = query.where(**context[:conditions]) if context[:conditions]
|
40
|
-
# query = query.includes(:user) if context[:include_user]
|
41
|
-
# query.find_in_batches(batch_size: 5000) do |batch|
|
42
|
-
# block.call batch, context
|
43
|
-
# end
|
44
|
-
# end
|
16
|
+
<%- end -%>
|
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
|
30
|
+
end
|
31
|
+
<%- end -%>
|
45
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] -%>
|
43
|
+
end
|
44
|
+
<%- end # /@repos.empty?-%>
|
45
|
+
<%- @repos.each do |type| -%>
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# Each object yielded by the collection will be serialized on this step.
|
52
|
-
# We recommend using a another class to handle the serialization. The only requirement is
|
53
|
-
# that the class implements the `#to_h` method.
|
54
|
-
# The serializer class may also be initialized with context if collection block is called with that extra parameter.
|
55
|
-
# Ability to call serializer with context is useful for preloading data from database or any other repository.
|
56
|
-
#
|
57
|
-
# serializer Serializers::DocumentSerializer
|
58
|
-
#
|
59
|
-
# You can also serialize the collection entry using a block:
|
60
|
-
#
|
61
|
-
# serializer do |model, context|
|
62
|
-
# hash = {
|
63
|
-
# name: <%= @index_name.underscore %>.name,
|
64
|
-
# }
|
65
|
-
# # Context is just an example here. But it's useful for eager loading data.
|
66
|
-
# # I'll think a better example when implement this idea.
|
67
|
-
# hash[:some_attribute] = <%= @index_name.underscore %>.some_attribute if context[:include_some_attribute]
|
68
|
-
# hash
|
69
|
-
# end
|
70
|
-
<%- end -%>
|
71
|
-
<%- @types.each do |type| -%>
|
72
|
-
define_type :<%= type.underscore %> do
|
73
|
-
# Collection
|
74
|
-
# ==========
|
75
|
-
#
|
76
|
-
# Collection wraps the data into an array of items that should be serialized. The first argument that is
|
77
|
-
# yielded must extends Enumerable.
|
78
|
-
# Useful for eager loading data from database or any other repository. Below is an example of a rails like
|
79
|
-
# application could load using activerecord.
|
80
|
-
#
|
81
|
-
# collection do |**context, &block|
|
82
|
-
# <%= type.camelize %>.where(context[:conditions]).find_in_batches(batch_size: 5000) do |batch|
|
83
|
-
# block.call batch, context
|
84
|
-
# end
|
85
|
-
# end
|
47
|
+
repository :<%= type.underscore %> do
|
48
|
+
<%- if @cli_options[:active_record] -%>
|
49
|
+
collection ::<%= type.camelize %>.all
|
50
|
+
<%- elsif @cli_options[:collections] -%>
|
86
51
|
collection Collections::<%= type.camelize %>Collection
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
#
|
107
|
-
# And here you specify your serializer classe.
|
108
|
-
# serializer Serializers::<%= type.camelize %>Serializer
|
109
|
-
#
|
110
|
-
# You can also serialize the collection entry using a block:
|
111
|
-
#
|
112
|
-
# serializer do |model, **context|
|
113
|
-
# hash = {
|
114
|
-
# name: <%= type %>.name,
|
115
|
-
# }
|
116
|
-
# # Context is just an example here. But it's useful for eager loading data.
|
117
|
-
# # I'll think a better example when implement this idea.
|
118
|
-
# hash[:some_attribute] = <%= type %>.some_attribute if context[:include_some_attribute]
|
119
|
-
# hash
|
120
|
-
# end
|
121
|
-
serializer Serializers::<%= type.camelize %>Serializer
|
52
|
+
<%- else -%>
|
53
|
+
collection do |**context, &block|
|
54
|
+
query = <%= type.camelize %>.all
|
55
|
+
query = query.where(id: context[:id]) if context[:id]
|
56
|
+
query.find_in_batches(batch_size: 1_000) do |batch|
|
57
|
+
block.call(batch, **context)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
<%- end -%>
|
61
|
+
<%- if @cli_options[:documents] -%>
|
62
|
+
document Documents::<%= type.camelize %>Document
|
63
|
+
<%- else -%>
|
64
|
+
document do |<%= type.underscore %>, **_context|
|
65
|
+
{
|
66
|
+
id: <%= type.underscore %>.id,
|
67
|
+
name: <%= @index_name.underscore %>.name,
|
68
|
+
}
|
69
|
+
end
|
70
|
+
<%- end -%>
|
122
71
|
end
|
123
|
-
<%- end -%>
|
72
|
+
<%- end #@repos.each do |type| -%>
|
124
73
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
{
|
2
|
+
"dynamic_templates": [
|
3
|
+
{
|
4
|
+
"string_template": {
|
5
|
+
"match": "*",
|
6
|
+
"match_mapping_type": "string",
|
7
|
+
"mapping": {
|
8
|
+
"fields": {
|
9
|
+
"analyzed": {
|
10
|
+
"analyzer": "esse_index",
|
11
|
+
"index": true,
|
12
|
+
"type": "text"
|
13
|
+
}
|
14
|
+
},
|
15
|
+
"ignore_above": 30000,
|
16
|
+
"type": "keyword"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
],
|
21
|
+
"properties": {
|
22
|
+
"slug": {
|
23
|
+
"type": "keyword",
|
24
|
+
"ignore_above": 255
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|