zelastic 0.7.0 → 0.8.0
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/.circleci/config.yml +8 -7
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +41 -9
- data/README.md +6 -3
- data/lib/zelastic/config.rb +13 -12
- data/lib/zelastic/index_manager.rb +4 -11
- data/lib/zelastic/indexer.rb +9 -22
- data/lib/zelastic/version.rb +1 -1
- data/log/.keep +0 -0
- data/zelastic.gemspec +3 -2
- metadata +26 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b45ad7dd15f213cc571c3da4f021ff80129dcccb375ae98aedde7b22b759b05
|
4
|
+
data.tar.gz: '08328c62f6485a0b11300dc9c651ca3e8c99179c84ea2c3f5235a921ca676d9a'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3e38047bf9f47bc8e7353f8e52387a7bd6722e291f96291d09a50257cd28a43cf7fba2abcd9681abb3797aa5acce67f38b09cabb6ecbaf8e4638b2a7e6e21b6
|
7
|
+
data.tar.gz: 94572581d7fa5f6c6de6485cacd9232a310418379f981d12d0523183f6922f5bcbbeb290605e4452ccb51603f702aa5bf52a9540ed681002a1b2e389a2dff670
|
data/.circleci/config.yml
CHANGED
@@ -14,6 +14,7 @@ jobs:
|
|
14
14
|
- image: "elasticsearch:<< parameters.elasticsearch_version >>"
|
15
15
|
environment:
|
16
16
|
"discovery.type": single-node
|
17
|
+
"xpack.security.enabled": false
|
17
18
|
environment:
|
18
19
|
ELASTICSEARCH_GEM_VERSION: "<< parameters.elasticsearch_gem_version >>"
|
19
20
|
steps:
|
@@ -28,20 +29,20 @@ workflows:
|
|
28
29
|
test:
|
29
30
|
jobs:
|
30
31
|
- test:
|
31
|
-
name: "test with elasticsearch
|
32
|
+
name: "test with elasticsearch v8
|
32
33
|
and gem << matrix.elasticsearch_gem_version >>
|
33
34
|
and ruby v<< matrix.ruby_version >>"
|
34
|
-
elasticsearch_version: "
|
35
|
+
elasticsearch_version: "8.3.3"
|
35
36
|
matrix:
|
36
37
|
parameters:
|
37
38
|
ruby_version: ["3.1", "2.7"]
|
38
|
-
elasticsearch_gem_version: ["~>
|
39
|
+
elasticsearch_gem_version: ["~> 8", "~> 7"]
|
39
40
|
- test:
|
40
|
-
name: "test with elasticsearch
|
41
|
-
and gem
|
41
|
+
name: "test with elasticsearch v7
|
42
|
+
and gem << matrix.elasticsearch_gem_version >>
|
42
43
|
and ruby v<< matrix.ruby_version >>"
|
43
|
-
elasticsearch_version: "5
|
44
|
-
elasticsearch_gem_version: "~> 5"
|
44
|
+
elasticsearch_version: "7.17.5"
|
45
45
|
matrix:
|
46
46
|
parameters:
|
47
47
|
ruby_version: ["3.1", "2.7"]
|
48
|
+
elasticsearch_gem_version: ["~> 7"]
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,47 @@
|
|
1
|
-
|
2
|
-
---
|
1
|
+
# Changelog
|
3
2
|
|
4
|
-
|
3
|
+
All notable changes to this project will be documented in this file.
|
5
4
|
|
6
|
-
|
7
|
-
|
5
|
+
The format is based on [Keep a Changelog],
|
6
|
+
and this project adheres to [Semantic Versioning].
|
8
7
|
|
9
|
-
|
8
|
+
[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
|
9
|
+
[Semantic Versioning]: https://semver.org/spec/v2.0.0.html
|
10
10
|
|
11
|
+
## How do I make a good changelog?
|
11
12
|
|
12
|
-
|
13
|
-
---
|
13
|
+
### Guiding Principles
|
14
14
|
|
15
|
-
-
|
15
|
+
- Changelogs are for humans, not machines.
|
16
|
+
- There should be an entry for every single version.
|
17
|
+
- The same types of changes should be grouped.
|
18
|
+
- Versions and sections should be linkable.
|
19
|
+
- The latest version comes first.
|
20
|
+
- The release date of each version is displayed.
|
21
|
+
- Keep an `Unreleased` section at the top to track upcoming changes.
|
22
|
+
|
23
|
+
### Types of changes
|
24
|
+
|
25
|
+
- `Added` for new features.
|
26
|
+
- `Changed` for changes in existing functionality.
|
27
|
+
- `Deprecated` for soon-to-be removed features.
|
28
|
+
- `Removed` for now removed features.
|
29
|
+
- `Fixed` for any bug fixes.
|
30
|
+
- `Security` in case of vulnerabilities.
|
31
|
+
|
32
|
+
## [Unreleased] - XXXX-XX-XX
|
33
|
+
|
34
|
+
## [0.8.0] - 2022-08-19
|
35
|
+
### Added
|
36
|
+
- Support for Ruby 3 (and keep support for 2.7).
|
37
|
+
- Support for Elasticsearch v8 (and keep support for v7).
|
38
|
+
- Support setting a logger in `Config`.
|
39
|
+
- Support refresh on `IndexManager#populate_index`.
|
40
|
+
- Support Proc in `Config#data_source` so it can be lazily evaluated.
|
41
|
+
|
42
|
+
### Removed
|
43
|
+
- Drop support for Ruby 2.6.
|
44
|
+
- Drop support for Elasticsearch v5 and v6.
|
45
|
+
|
46
|
+
[Unreleased]: https://github.com/carwow/zelastic/compare/v0.8.0...HEAD
|
47
|
+
[0.8.0]: https://github.com/carwow/zelastic/releases/tag/v0.8.0
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# Zelastic
|
2
|
+
|
3
|
+
Zero-downtime Elasticsearch tooling for managing indices and indexing from
|
4
|
+
ActiveRecord with PostgreSQL to Elasticsearch.
|
2
5
|
|
3
6
|
## Installation
|
4
7
|
|
@@ -10,13 +13,14 @@ gem 'zelastic'
|
|
10
13
|
|
11
14
|
And then execute:
|
12
15
|
|
13
|
-
$ bundle
|
16
|
+
$ bundle install
|
14
17
|
|
15
18
|
Or install it yourself as:
|
16
19
|
|
17
20
|
$ gem install zelastic
|
18
21
|
|
19
22
|
## Usage
|
23
|
+
|
20
24
|
### Setup
|
21
25
|
|
22
26
|
For each ActiveRecord scope you want to index, you'll need a configuration:
|
@@ -46,7 +50,6 @@ You can also override some defaults, if you wish:
|
|
46
50
|
here
|
47
51
|
- `read_alias`: by default this is the table name of the `data_source`
|
48
52
|
- `write_alias`: by default this is the `read_alias`, with `_write` appended
|
49
|
-
- `type`: by default this is `read_alias.singularize`
|
50
53
|
|
51
54
|
If you pass an array to as the `client` argument, all writes will be applied to every client in the
|
52
55
|
array.
|
data/lib/zelastic/config.rb
CHANGED
@@ -2,31 +2,36 @@
|
|
2
2
|
|
3
3
|
module Zelastic
|
4
4
|
class Config
|
5
|
-
attr_reader :clients
|
5
|
+
attr_reader :clients
|
6
6
|
|
7
7
|
def initialize(
|
8
8
|
client:,
|
9
9
|
data_source:,
|
10
10
|
mapping:,
|
11
|
+
logger: nil,
|
11
12
|
**overrides,
|
12
13
|
&index_data
|
13
14
|
)
|
14
15
|
@clients = Array(client)
|
15
16
|
@data_source = data_source
|
16
17
|
@mapping = mapping
|
17
|
-
@
|
18
|
-
@_type = overrides.fetch(:type, true)
|
18
|
+
@logger = logger
|
19
19
|
@overrides = overrides
|
20
|
-
|
21
|
-
|
22
|
-
def type?
|
23
|
-
@_type
|
20
|
+
@index_data = index_data
|
24
21
|
end
|
25
22
|
|
26
23
|
def index_data(model)
|
27
24
|
@index_data.call(model)
|
28
25
|
end
|
29
26
|
|
27
|
+
def data_source
|
28
|
+
if @data_source.respond_to? :call
|
29
|
+
@data_source.call
|
30
|
+
else
|
31
|
+
@data_source
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
30
35
|
def read_alias
|
31
36
|
@read_alias ||= overrides.fetch(:read_alias) { data_source.table_name }
|
32
37
|
end
|
@@ -35,10 +40,6 @@ module Zelastic
|
|
35
40
|
@write_alias ||= overrides.fetch(:write_alias) { [read_alias, 'write'].join('_') }
|
36
41
|
end
|
37
42
|
|
38
|
-
def type
|
39
|
-
@type ||= overrides.fetch(:type, read_alias.singularize)
|
40
|
-
end
|
41
|
-
|
42
43
|
def logger
|
43
44
|
return Rails.logger if defined?(Rails)
|
44
45
|
|
@@ -48,7 +49,7 @@ module Zelastic
|
|
48
49
|
def index_definition
|
49
50
|
{
|
50
51
|
settings: overrides.fetch(:index_settings, {}),
|
51
|
-
mappings:
|
52
|
+
mappings: mapping
|
52
53
|
}
|
53
54
|
end
|
54
55
|
|
@@ -16,12 +16,12 @@ module Zelastic
|
|
16
16
|
client.indices.put_alias(index: index_name, name: config.write_alias)
|
17
17
|
end
|
18
18
|
|
19
|
-
def populate_index(unique_name = nil, batch_size: 3000)
|
19
|
+
def populate_index(unique_name = nil, batch_size: 3000, refresh: false)
|
20
20
|
index_name = index_name_from_unique(unique_name)
|
21
21
|
|
22
22
|
config.data_source.find_in_batches(batch_size: batch_size).with_index do |batch, i|
|
23
23
|
logger.info(populate_index_log(batch_size: batch_size, batch_number: i + 1))
|
24
|
-
indexer.index_batch(batch, client: client, index_name: index_name)
|
24
|
+
indexer.index_batch(batch, client: client, index_name: index_name, refresh: refresh)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -116,18 +116,11 @@ module Zelastic
|
|
116
116
|
else
|
117
117
|
'First index'
|
118
118
|
end
|
119
|
-
"ES: (#{progress}) Indexing
|
119
|
+
"ES: (#{progress}) Indexing records"
|
120
120
|
end
|
121
121
|
|
122
122
|
def current_index_size
|
123
|
-
@current_index_size ||= client.count(
|
124
|
-
end
|
125
|
-
|
126
|
-
def count_params
|
127
|
-
{
|
128
|
-
index: config.read_alias,
|
129
|
-
type: config.type? ? config.type : nil
|
130
|
-
}.compact
|
123
|
+
@current_index_size ||= client.count(index: config.read_alias)['count']
|
131
124
|
end
|
132
125
|
|
133
126
|
def indexed_percent(batch_size, batch_number)
|
data/lib/zelastic/indexer.rb
CHANGED
@@ -43,10 +43,7 @@ module Zelastic
|
|
43
43
|
|
44
44
|
execute_bulk do |index_name|
|
45
45
|
ids.map do |id|
|
46
|
-
|
47
|
-
delete_params[:_type] = config.type if config.type?
|
48
|
-
|
49
|
-
{ delete: delete_params }
|
46
|
+
{ delete: { _index: index_name, _id: id } }
|
50
47
|
end
|
51
48
|
end
|
52
49
|
end
|
@@ -76,19 +73,14 @@ module Zelastic
|
|
76
73
|
end
|
77
74
|
|
78
75
|
def index_command(index:, version:, record:)
|
79
|
-
version_params =
|
80
|
-
if config.type?
|
81
|
-
{ _version: version, _version_type: :external, _type: config.type }
|
82
|
-
else
|
83
|
-
{ version: version, version_type: :external }
|
84
|
-
end
|
85
|
-
|
86
76
|
{
|
87
77
|
index: {
|
88
78
|
_index: index,
|
89
79
|
_id: record.id,
|
90
|
-
data: config.index_data(record)
|
91
|
-
|
80
|
+
data: config.index_data(record),
|
81
|
+
version: version,
|
82
|
+
version_type: :external
|
83
|
+
}
|
92
84
|
}
|
93
85
|
end
|
94
86
|
|
@@ -123,16 +115,11 @@ module Zelastic
|
|
123
115
|
end
|
124
116
|
|
125
117
|
def ignorable_error?(error)
|
126
|
-
# rubocop:disable Layout/LineLength
|
127
|
-
regexp =
|
128
|
-
if config.type?
|
129
|
-
/^\[#{config.type}\]\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/
|
130
|
-
else
|
131
|
-
/^\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/
|
132
|
-
end
|
133
|
-
# rubocop:enable Layout/LineLength
|
134
118
|
error['type'] == 'version_conflict_engine_exception' &&
|
135
|
-
error['reason'] =~
|
119
|
+
error['reason'] =~ VERSION_CONFLICT_ERROR_REGEXP
|
136
120
|
end
|
121
|
+
|
122
|
+
VERSION_CONFLICT_ERROR_REGEXP =
|
123
|
+
/^\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/.freeze
|
137
124
|
end
|
138
125
|
end
|
data/lib/zelastic/version.rb
CHANGED
data/log/.keep
ADDED
File without changes
|
data/zelastic.gemspec
CHANGED
@@ -22,12 +22,13 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
+
spec.add_dependency 'elasticsearch', '>= 7', '< 9'
|
26
|
+
|
27
|
+
spec.add_dependency 'activerecord'
|
25
28
|
spec.add_dependency 'activesupport'
|
26
29
|
|
27
|
-
spec.add_development_dependency 'activerecord'
|
28
30
|
spec.add_development_dependency 'bundler', '~> 2'
|
29
31
|
spec.add_development_dependency 'carwow_rubocop', '~> 4'
|
30
|
-
spec.add_development_dependency 'elasticsearch', '>= 5', '< 8'
|
31
32
|
spec.add_development_dependency 'pry', '~> 0.14'
|
32
33
|
spec.add_development_dependency 'rake', '~> 13'
|
33
34
|
spec.add_development_dependency 'rspec', '~> 3'
|
metadata
CHANGED
@@ -1,17 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zelastic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- carwow Developers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: elasticsearch
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '7'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '9'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '7'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '9'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: activerecord
|
15
35
|
requirement: !ruby/object:Gem::Requirement
|
16
36
|
requirements:
|
17
37
|
- - ">="
|
@@ -25,13 +45,13 @@ dependencies:
|
|
25
45
|
- !ruby/object:Gem::Version
|
26
46
|
version: '0'
|
27
47
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
48
|
+
name: activesupport
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
30
50
|
requirements:
|
31
51
|
- - ">="
|
32
52
|
- !ruby/object:Gem::Version
|
33
53
|
version: '0'
|
34
|
-
type: :
|
54
|
+
type: :runtime
|
35
55
|
prerelease: false
|
36
56
|
version_requirements: !ruby/object:Gem::Requirement
|
37
57
|
requirements:
|
@@ -66,26 +86,6 @@ dependencies:
|
|
66
86
|
- - "~>"
|
67
87
|
- !ruby/object:Gem::Version
|
68
88
|
version: '4'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: elasticsearch
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '5'
|
76
|
-
- - "<"
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: '8'
|
79
|
-
type: :development
|
80
|
-
prerelease: false
|
81
|
-
version_requirements: !ruby/object:Gem::Requirement
|
82
|
-
requirements:
|
83
|
-
- - ">="
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '5'
|
86
|
-
- - "<"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '8'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: pry
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/zelastic/index_manager.rb
|
155
155
|
- lib/zelastic/indexer.rb
|
156
156
|
- lib/zelastic/version.rb
|
157
|
+
- log/.keep
|
157
158
|
- zelastic.gemspec
|
158
159
|
homepage: https://github.com/carwow/zelastic
|
159
160
|
licenses:
|