elasticsearch-persistence 5.1.0 → 6.0.0.pre
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/.rspec +2 -0
- data/Gemfile +9 -0
- data/README.md +164 -323
- data/Rakefile +8 -8
- data/elasticsearch-persistence.gemspec +4 -5
- data/lib/elasticsearch/persistence.rb +2 -110
- data/lib/elasticsearch/persistence/repository.rb +212 -53
- data/lib/elasticsearch/persistence/repository/dsl.rb +94 -0
- data/lib/elasticsearch/persistence/repository/find.rb +27 -10
- data/lib/elasticsearch/persistence/repository/response/results.rb +17 -5
- data/lib/elasticsearch/persistence/repository/search.rb +15 -4
- data/lib/elasticsearch/persistence/repository/serialize.rb +65 -7
- data/lib/elasticsearch/persistence/repository/store.rb +38 -44
- data/lib/elasticsearch/persistence/version.rb +1 -1
- data/spec/repository/find_spec.rb +179 -0
- data/spec/repository/response/results_spec.rb +105 -0
- data/spec/repository/search_spec.rb +181 -0
- data/spec/repository/serialize_spec.rb +53 -0
- data/spec/repository/store_spec.rb +327 -0
- data/spec/repository_spec.rb +716 -0
- data/spec/spec_helper.rb +28 -0
- metadata +25 -80
- data/lib/elasticsearch/persistence/client.rb +0 -51
- data/lib/elasticsearch/persistence/model.rb +0 -153
- data/lib/elasticsearch/persistence/model/base.rb +0 -87
- data/lib/elasticsearch/persistence/model/errors.rb +0 -8
- data/lib/elasticsearch/persistence/model/find.rb +0 -180
- data/lib/elasticsearch/persistence/model/rails.rb +0 -47
- data/lib/elasticsearch/persistence/model/store.rb +0 -254
- data/lib/elasticsearch/persistence/model/utils.rb +0 -0
- data/lib/elasticsearch/persistence/repository/class.rb +0 -71
- data/lib/elasticsearch/persistence/repository/naming.rb +0 -115
- data/lib/rails/generators/elasticsearch/model/model_generator.rb +0 -21
- data/lib/rails/generators/elasticsearch/model/templates/model.rb.tt +0 -9
- data/lib/rails/generators/elasticsearch_generator.rb +0 -2
- data/test/integration/model/model_basic_test.rb +0 -238
- data/test/integration/repository/custom_class_test.rb +0 -85
- data/test/integration/repository/customized_class_test.rb +0 -82
- data/test/integration/repository/default_class_test.rb +0 -116
- data/test/integration/repository/virtus_model_test.rb +0 -118
- data/test/test_helper.rb +0 -55
- data/test/unit/model_base_test.rb +0 -72
- data/test/unit/model_find_test.rb +0 -153
- data/test/unit/model_gateway_test.rb +0 -101
- data/test/unit/model_rails_test.rb +0 -112
- data/test/unit/model_store_test.rb +0 -576
- data/test/unit/persistence_test.rb +0 -32
- data/test/unit/repository_class_test.rb +0 -51
- data/test/unit/repository_client_test.rb +0 -32
- data/test/unit/repository_find_test.rb +0 -388
- data/test/unit/repository_indexing_test.rb +0 -37
- data/test/unit/repository_module_test.rb +0 -146
- data/test/unit/repository_naming_test.rb +0 -146
- data/test/unit/repository_response_results_test.rb +0 -98
- data/test/unit/repository_search_test.rb +0 -117
- data/test/unit/repository_serialize_test.rb +0 -57
- data/test/unit/repository_store_test.rb +0 -303
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Elasticsearch
|
4
|
-
module Persistence
|
5
|
-
class RepositoryCustomClassIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
6
|
-
|
7
|
-
class ::MyNote
|
8
|
-
attr_reader :attributes
|
9
|
-
|
10
|
-
def initialize(attributes={})
|
11
|
-
@attributes = Hashie::Mash.new(attributes)
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(method_name, *arguments, &block)
|
15
|
-
attributes.respond_to?(method_name) ? attributes.__send__(method_name, *arguments, &block) : super
|
16
|
-
end
|
17
|
-
|
18
|
-
def respond_to?(method_name, include_private=false)
|
19
|
-
attributes.respond_to?(method_name) || super
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_hash
|
23
|
-
@attributes
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context "A custom repository class" do
|
28
|
-
setup do
|
29
|
-
class ::MyNotesRepository
|
30
|
-
include Elasticsearch::Persistence::Repository
|
31
|
-
|
32
|
-
klass MyNote
|
33
|
-
|
34
|
-
settings number_of_shards: 1 do
|
35
|
-
mapping do
|
36
|
-
indexes :title, analyzer: 'snowball'
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
create_index!
|
41
|
-
|
42
|
-
def deserialize(document)
|
43
|
-
klass.new document.merge(document['_source'])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
@repository = MyNotesRepository.new
|
48
|
-
|
49
|
-
@repository.client.cluster.health wait_for_status: 'yellow'
|
50
|
-
end
|
51
|
-
|
52
|
-
should "save the object under a correct index and type" do
|
53
|
-
@repository.save MyNote.new(id: '1', title: 'Test')
|
54
|
-
result = @repository.find(1)
|
55
|
-
|
56
|
-
assert_instance_of MyNote, result
|
57
|
-
assert_equal 'Test', result.title
|
58
|
-
|
59
|
-
assert_not_nil Elasticsearch::Persistence.client.get index: 'my_notes_repository',
|
60
|
-
type: 'my_note',
|
61
|
-
id: '1'
|
62
|
-
end
|
63
|
-
|
64
|
-
should "delete the object" do
|
65
|
-
note = MyNote.new id: 1, title: 'Test'
|
66
|
-
@repository.save note
|
67
|
-
|
68
|
-
assert_not_nil @repository.find(1)
|
69
|
-
|
70
|
-
@repository.delete(note)
|
71
|
-
assert_raise(Elasticsearch::Persistence::Repository::DocumentNotFound) { @repository.find(1) }
|
72
|
-
end
|
73
|
-
|
74
|
-
should "retrieve the object via a search query" do
|
75
|
-
note = MyNote.new title: 'Testing'
|
76
|
-
@repository.save note, refresh: true
|
77
|
-
|
78
|
-
results = @repository.search query: { match: { title: 'Test' } }
|
79
|
-
assert_equal 'Testing', results.first.title
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Elasticsearch
|
4
|
-
module Persistence
|
5
|
-
class RepositoryCustomizedClassIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
6
|
-
|
7
|
-
module ::My
|
8
|
-
class Note
|
9
|
-
attr_reader :attributes
|
10
|
-
|
11
|
-
def initialize(attributes={})
|
12
|
-
@attributes = attributes
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_hash
|
16
|
-
@attributes
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "A custom repository class" do
|
22
|
-
setup do
|
23
|
-
@repository = Elasticsearch::Persistence::Repository.new do
|
24
|
-
index 'my_notes'
|
25
|
-
type 'my_note'
|
26
|
-
klass My::Note
|
27
|
-
|
28
|
-
settings number_of_shards: 1 do
|
29
|
-
mapping do
|
30
|
-
indexes :title, analyzer: 'snowball'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
create_index!
|
35
|
-
end
|
36
|
-
|
37
|
-
@repository.client.cluster.health wait_for_status: 'yellow'
|
38
|
-
end
|
39
|
-
|
40
|
-
should "save the object under a correct index and type" do
|
41
|
-
@repository.save My::Note.new(id: '1', title: 'Test')
|
42
|
-
|
43
|
-
assert_instance_of My::Note, @repository.find(1)
|
44
|
-
assert_not_nil Elasticsearch::Persistence.client.get index: 'my_notes', type: 'my_note', id: '1'
|
45
|
-
end
|
46
|
-
|
47
|
-
should "update the document" do
|
48
|
-
@repository.save Note.new(id: 1, title: 'Test')
|
49
|
-
|
50
|
-
@repository.update 1, doc: { title: 'UPDATED' }
|
51
|
-
assert_equal 'UPDATED', @repository.find(1).attributes['title']
|
52
|
-
end
|
53
|
-
|
54
|
-
should "update the document with a script" do
|
55
|
-
@repository.save Note.new(id: 1, title: 'Test')
|
56
|
-
|
57
|
-
@repository.update 1, script: 'ctx._source.title = "UPDATED"'
|
58
|
-
assert_equal 'UPDATED', @repository.find(1).attributes['title']
|
59
|
-
end
|
60
|
-
|
61
|
-
should "delete the object" do
|
62
|
-
note = My::Note.new id: 1, title: 'Test'
|
63
|
-
@repository.save note
|
64
|
-
|
65
|
-
assert_not_nil @repository.find(1)
|
66
|
-
|
67
|
-
@repository.delete(note)
|
68
|
-
assert_raise(Elasticsearch::Persistence::Repository::DocumentNotFound) { @repository.find(1) }
|
69
|
-
end
|
70
|
-
|
71
|
-
should "create the index with correct mapping" do
|
72
|
-
note = My::Note.new title: 'Testing'
|
73
|
-
@repository.save note, refresh: true
|
74
|
-
|
75
|
-
results = @repository.search query: { match: { title: 'Test' } }
|
76
|
-
assert_equal 'Testing', results.first.attributes['title']
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Elasticsearch
|
4
|
-
module Persistence
|
5
|
-
class RepositoryDefaultClassIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
6
|
-
|
7
|
-
class ::Note
|
8
|
-
attr_reader :attributes
|
9
|
-
|
10
|
-
def initialize(attributes={})
|
11
|
-
@attributes = attributes
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_hash
|
15
|
-
@attributes
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "The default repository class" do
|
20
|
-
setup do
|
21
|
-
@repository = Elasticsearch::Persistence::Repository.new
|
22
|
-
@repository.client.cluster.health wait_for_status: 'yellow'
|
23
|
-
end
|
24
|
-
|
25
|
-
should "save the object with a custom ID and find it" do
|
26
|
-
@repository.save Note.new(id: '1', title: 'Test')
|
27
|
-
|
28
|
-
assert_equal 'Test', @repository.find(1).attributes['title']
|
29
|
-
end
|
30
|
-
|
31
|
-
should "save the object with an auto-generated ID and find it" do
|
32
|
-
response = @repository.save Note.new(title: 'Test')
|
33
|
-
|
34
|
-
assert_equal 'Test', @repository.find(response['_id']).attributes['title']
|
35
|
-
end
|
36
|
-
|
37
|
-
should "update the document" do
|
38
|
-
@repository.save Note.new(id: 1, title: 'Test')
|
39
|
-
|
40
|
-
@repository.update 1, type: 'note', doc: { title: 'UPDATED' }
|
41
|
-
assert_equal 'UPDATED', @repository.find(1).attributes['title']
|
42
|
-
end
|
43
|
-
|
44
|
-
should "update the document with a script" do
|
45
|
-
@repository.save Note.new(id: 1, title: 'Test')
|
46
|
-
|
47
|
-
@repository.update 1, type: 'note', script: 'ctx._source.title = "UPDATED"'
|
48
|
-
assert_equal 'UPDATED', @repository.find(1).attributes['title']
|
49
|
-
end
|
50
|
-
|
51
|
-
should "save the document with an upsert" do
|
52
|
-
@repository.update 1, type: 'note', script: 'ctx._source.clicks += 1', upsert: { clicks: 1 }
|
53
|
-
assert_equal 1, @repository.find(1).attributes['clicks']
|
54
|
-
end
|
55
|
-
|
56
|
-
should "delete an object" do
|
57
|
-
note = Note.new(id: '1', title: 'Test')
|
58
|
-
|
59
|
-
@repository.save(note)
|
60
|
-
assert_not_nil @repository.find(1)
|
61
|
-
@repository.delete(note)
|
62
|
-
assert_raise(Elasticsearch::Persistence::Repository::DocumentNotFound) { @repository.find(1) }
|
63
|
-
end
|
64
|
-
|
65
|
-
should "find multiple objects" do
|
66
|
-
(1..5).each { |i| @repository.save Note.new(id: i, title: "Test #{i}") }
|
67
|
-
|
68
|
-
assert_equal 5, @repository.find(1, 2, 3, 4, 5).size
|
69
|
-
assert_equal 5, @repository.find([1, 2, 3, 4, 5]).size
|
70
|
-
end
|
71
|
-
|
72
|
-
should "pass options to save and find" do
|
73
|
-
note = Note.new(id: '1', title: 'Test')
|
74
|
-
@repository.save note, routing: 'ABC'
|
75
|
-
|
76
|
-
@repository.client.cluster.health level: 'indices', wait_for_status: 'yellow'
|
77
|
-
|
78
|
-
assert_raise Elasticsearch::Persistence::Repository::DocumentNotFound do
|
79
|
-
@repository.find(1, routing: 'DEF')
|
80
|
-
end
|
81
|
-
|
82
|
-
assert_nothing_raised do
|
83
|
-
note = @repository.find(1, routing: 'ABC')
|
84
|
-
assert_instance_of Note, note
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
should "find notes with full text search" do
|
89
|
-
@repository.save Note.new(title: 'Test')
|
90
|
-
@repository.save Note.new(title: 'Test Test')
|
91
|
-
@repository.save Note.new(title: 'Crust')
|
92
|
-
@repository.client.indices.refresh index: @repository.index_name
|
93
|
-
|
94
|
-
results = @repository.search 'test'
|
95
|
-
assert_equal 2, results.size
|
96
|
-
|
97
|
-
results = @repository.search query: { match: { title: 'Test' } }
|
98
|
-
assert_equal 2, results.size
|
99
|
-
end
|
100
|
-
|
101
|
-
should "count notes" do
|
102
|
-
@repository.save Note.new(title: 'Test')
|
103
|
-
@repository.client.indices.refresh index: @repository.index_name
|
104
|
-
assert_equal 1, @repository.count
|
105
|
-
end
|
106
|
-
|
107
|
-
should "save and find a plain hash" do
|
108
|
-
@repository.save id: 1, title: 'Hash'
|
109
|
-
result = @repository.find(1)
|
110
|
-
assert_equal 'Hash', result['_source']['title']
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
require 'virtus'
|
4
|
-
|
5
|
-
module Elasticsearch
|
6
|
-
module Persistence
|
7
|
-
class RepositoryWithVirtusIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
8
|
-
|
9
|
-
class ::Page
|
10
|
-
include Virtus.model
|
11
|
-
|
12
|
-
attribute :id, String, writer: :private
|
13
|
-
attribute :title, String
|
14
|
-
attribute :views, Integer, default: 0
|
15
|
-
attribute :published, Boolean, default: false
|
16
|
-
attribute :slug, String, default: lambda { |page, attr| page.title.downcase.gsub(' ', '-') }
|
17
|
-
|
18
|
-
def set_id(id)
|
19
|
-
self.id = id
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context "The repository with a Virtus model" do
|
24
|
-
setup do
|
25
|
-
@repository = Elasticsearch::Persistence::Repository.new do
|
26
|
-
index :pages
|
27
|
-
klass Page
|
28
|
-
|
29
|
-
def deserialize(document)
|
30
|
-
page = klass.new document['_source']
|
31
|
-
page.set_id document['_id']
|
32
|
-
page
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
should "save and find the object" do
|
38
|
-
page = Page.new title: 'Test Page'
|
39
|
-
|
40
|
-
response = @repository.save page
|
41
|
-
id = response['_id']
|
42
|
-
|
43
|
-
result = @repository.find(id)
|
44
|
-
|
45
|
-
assert_instance_of Page, result
|
46
|
-
assert_equal 'Test Page', result.title
|
47
|
-
assert_equal 0, result.views
|
48
|
-
|
49
|
-
assert_not_nil Elasticsearch::Persistence.client.get index: 'pages',
|
50
|
-
type: 'page',
|
51
|
-
id: id
|
52
|
-
end
|
53
|
-
|
54
|
-
should "update the object with a partial document" do
|
55
|
-
response = @repository.save Page.new(title: 'Test')
|
56
|
-
id = response['_id']
|
57
|
-
|
58
|
-
page = @repository.find(id)
|
59
|
-
|
60
|
-
assert_equal 'Test', page.title
|
61
|
-
|
62
|
-
@repository.update page.id, doc: { title: 'UPDATE' }
|
63
|
-
|
64
|
-
page = @repository.find(id)
|
65
|
-
assert_equal 'UPDATE', page.title
|
66
|
-
end
|
67
|
-
|
68
|
-
should "update the object with a Hash" do
|
69
|
-
response = @repository.save Page.new(title: 'Test')
|
70
|
-
id = response['_id']
|
71
|
-
|
72
|
-
page = @repository.find(id)
|
73
|
-
|
74
|
-
assert_equal 'Test', page.title
|
75
|
-
|
76
|
-
@repository.update id: page.id, title: 'UPDATE'
|
77
|
-
|
78
|
-
page = @repository.find(id)
|
79
|
-
assert_equal 'UPDATE', page.title
|
80
|
-
end
|
81
|
-
|
82
|
-
should "update the object with a script" do
|
83
|
-
response = @repository.save Page.new(title: 'Test Page')
|
84
|
-
id = response['_id']
|
85
|
-
|
86
|
-
page = @repository.find(id)
|
87
|
-
|
88
|
-
assert_not_nil page.id
|
89
|
-
assert_equal 0, page.views
|
90
|
-
|
91
|
-
@repository.update page.id, script: 'ctx._source.views += 1'
|
92
|
-
|
93
|
-
page = @repository.find(id)
|
94
|
-
assert_equal 1, page.views
|
95
|
-
|
96
|
-
@repository.update id: page.id, script: 'ctx._source.views += 1'
|
97
|
-
|
98
|
-
page = @repository.find(id)
|
99
|
-
assert_equal 2, page.views
|
100
|
-
end
|
101
|
-
|
102
|
-
should "update the object with a script and params" do
|
103
|
-
response = @repository.save Page.new(title: 'Test Page')
|
104
|
-
|
105
|
-
@repository.update id: response['_id'],
|
106
|
-
script: {
|
107
|
-
inline: 'ctx._source.views += params.count',
|
108
|
-
params: { count: 3 }
|
109
|
-
}
|
110
|
-
|
111
|
-
page = @repository.find(response['_id'])
|
112
|
-
assert_equal 3, page.views
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
RUBY_1_8 = defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
|
2
|
-
|
3
|
-
exit(0) if RUBY_1_8
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift File.expand_path('../../../elasticsearch-model/lib', __FILE__) if File.exists? File.expand_path('../../../elasticsearch-model/lib', __FILE__)
|
6
|
-
|
7
|
-
require 'simplecov' and SimpleCov.start { add_filter "/test|test_/" } if ENV["COVERAGE"]
|
8
|
-
|
9
|
-
# Register `at_exit` handler for integration tests shutdown.
|
10
|
-
# MUST be called before requiring `test/unit`.
|
11
|
-
at_exit { Elasticsearch::Test::IntegrationTestCase.__run_at_exit_hooks } if ENV['SERVER']
|
12
|
-
|
13
|
-
if defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
|
14
|
-
require 'test-unit'
|
15
|
-
require 'mocha/test_unit'
|
16
|
-
else
|
17
|
-
require 'minitest/autorun'
|
18
|
-
require 'mocha/mini_test'
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'shoulda-context'
|
22
|
-
|
23
|
-
require 'turn' unless ENV["TM_FILEPATH"] || ENV["NOTURN"] || defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
|
24
|
-
|
25
|
-
require 'ansi'
|
26
|
-
require 'oj'
|
27
|
-
|
28
|
-
require 'elasticsearch/extensions/test/cluster'
|
29
|
-
require 'elasticsearch/extensions/test/startup_shutdown'
|
30
|
-
|
31
|
-
require 'elasticsearch/persistence'
|
32
|
-
|
33
|
-
module Elasticsearch
|
34
|
-
module Test
|
35
|
-
class IntegrationTestCase < ::Test::Unit::TestCase
|
36
|
-
extend Elasticsearch::Extensions::Test::StartupShutdown
|
37
|
-
|
38
|
-
startup { Elasticsearch::Extensions::Test::Cluster.start(nodes: 1) if ENV['SERVER'] and not Elasticsearch::Extensions::Test::Cluster.running? }
|
39
|
-
shutdown { Elasticsearch::Extensions::Test::Cluster.stop if ENV['SERVER'] && started? }
|
40
|
-
context "IntegrationTest" do; should "noop on Ruby 1.8" do; end; end if RUBY_1_8
|
41
|
-
|
42
|
-
def setup
|
43
|
-
tracer = ::Logger.new(STDERR)
|
44
|
-
tracer.formatter = lambda { |s, d, p, m| "#{m.gsub(/^.*$/) { |n| ' ' + n }.ansi(:faint)}\n" }
|
45
|
-
Elasticsearch::Persistence.client = Elasticsearch::Client.new \
|
46
|
-
host: "localhost:#{(ENV['TEST_CLUSTER_PORT'] || 9250)}",
|
47
|
-
tracer: (ENV['QUIET'] ? nil : tracer)
|
48
|
-
end
|
49
|
-
|
50
|
-
def teardown
|
51
|
-
Elasticsearch::Persistence.client.indices.delete index: '_all'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|