es-elasticity 0.2.4 → 0.2.5
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/README.md +4 -0
- data/lib/elasticity/document.rb +11 -5
- data/lib/elasticity/search.rb +3 -3
- data/lib/elasticity/version.rb +1 -1
- data/spec/units/document_spec.rb +5 -6
- data/spec/units/multi_search_spec.rb +6 -6
- data/spec/units/search_spec.rb +10 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 930171d9343f5f51201e859afbc8f227e108a855
|
4
|
+
data.tar.gz: 7a949337b0c6265451e00bf5bc8ac9eef3170321
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f9cc21bea9324244cc52ffee24d4f4b6feddfaf59cc01962ce13162f99ff1af50a740a85408426328c98dd2566caab4524d7525a585d9efe04f2e82ce9abd1d
|
7
|
+
data.tar.gz: 16752b85bdcd775b75b59e0e9b11a2a1b53bbaad7e44e40485e700888214df93d9978e1a0330055ebf7dc86ce6783010aef7905a9686e155529039b49017afb1
|
data/README.md
CHANGED
@@ -105,12 +105,16 @@ adults.active_recors(Database::User) # => Array of Database::User instances
|
|
105
105
|
|
106
106
|
## Roadmap
|
107
107
|
|
108
|
+
- [ ] Use mapping instead of mappings, we wanna be consistent to ES not to elasticsearch-ruby
|
109
|
+
- [ ] Better automatic index name and document type
|
110
|
+
- [ ] Support for multiple document types
|
108
111
|
- [ ] Write more detailed documentation section for:
|
109
112
|
- [ ] Model definition
|
110
113
|
- [ ] Indexing, Bulk Indexing and Delete By Query
|
111
114
|
- [ ] Search and Multi Search
|
112
115
|
- [ ] ActiveRecord integration
|
113
116
|
- [ ] Get rid of to_document, generate automatically based on attributes
|
117
|
+
- [ ] Add some delegations on Document to Index
|
114
118
|
- [ ] Define from_active_record interface
|
115
119
|
|
116
120
|
## Contributing
|
data/lib/elasticity/document.rb
CHANGED
@@ -70,7 +70,7 @@ module Elasticity
|
|
70
70
|
# Fetches one specific document from the index by ID.
|
71
71
|
def self.get(id)
|
72
72
|
if doc = index.get_document(document_type, id)
|
73
|
-
new(doc["_source"])
|
73
|
+
new(doc["_source"].merge(_id: doc['_id']))
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -88,22 +88,28 @@ module Elasticity
|
|
88
88
|
def self.bulk_index(documents)
|
89
89
|
index.bulk do |b|
|
90
90
|
documents.each do |doc|
|
91
|
-
b.index(self.document_type, doc.
|
91
|
+
b.index(self.document_type, doc._id, doc.to_document)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
96
|
# Define common attributes for all documents
|
97
|
-
attr_accessor :
|
97
|
+
attr_accessor :_id
|
98
98
|
|
99
99
|
# Creates a new Document instance with the provided attributes.
|
100
100
|
def initialize(attributes = {})
|
101
101
|
super(attributes)
|
102
102
|
end
|
103
103
|
|
104
|
+
def attributes=(attributes)
|
105
|
+
attributes.each do |attr, value|
|
106
|
+
self.public_send("#{attr}=", value)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
104
110
|
# Defines equality by comparing the ID and values of each instance variable.
|
105
111
|
def ==(other)
|
106
|
-
return false if
|
112
|
+
return false if _id != other._id
|
107
113
|
|
108
114
|
instance_variables.all? do |ivar|
|
109
115
|
instance_variable_get(ivar) == other.instance_variable_get(ivar)
|
@@ -119,7 +125,7 @@ module Elasticity
|
|
119
125
|
|
120
126
|
# Update this object on the index, creating or updating the document.
|
121
127
|
def update
|
122
|
-
self.class.index.index_document(self.class.document_type,
|
128
|
+
self.class.index.index_document(self.class.document_type, _id, to_document)
|
123
129
|
end
|
124
130
|
end
|
125
131
|
end
|
data/lib/elasticity/search.rb
CHANGED
@@ -24,7 +24,7 @@ module Elasticity
|
|
24
24
|
# into ActiveRecord models using the provided relation.
|
25
25
|
def active_records(relation)
|
26
26
|
return @active_record if defined?(@active_record)
|
27
|
-
response = @index.search(@document_type, @body.merge(_source:
|
27
|
+
response = @index.search(@document_type, @body.merge(_source: false))
|
28
28
|
@active_record = Result.new(response, ActiveRecordMapper.new(relation))
|
29
29
|
end
|
30
30
|
|
@@ -95,7 +95,7 @@ module Elasticity
|
|
95
95
|
|
96
96
|
def map(hits)
|
97
97
|
hits.map do |hit|
|
98
|
-
@document_klass.new(hit["_source"])
|
98
|
+
@document_klass.new(hit["_source"].merge(_id: hit['_id']))
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
@@ -106,7 +106,7 @@ module Elasticity
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def map(hits)
|
109
|
-
ids = hits.map { |h| h["
|
109
|
+
ids = hits.map { |h| h["_id"] }
|
110
110
|
|
111
111
|
if ids.any?
|
112
112
|
id_col = "#{quote(@relation.table_name)}.#{quote(@relation.klass.primary_key)}"
|
data/lib/elasticity/version.rb
CHANGED
data/spec/units/document_spec.rb
CHANGED
@@ -3,7 +3,6 @@ require "elasticity/search"
|
|
3
3
|
RSpec.describe Elasticity::Document do
|
4
4
|
mappings = {
|
5
5
|
properties: {
|
6
|
-
id: { type: "integer" },
|
7
6
|
name: { type: "string" },
|
8
7
|
|
9
8
|
items: {
|
@@ -27,7 +26,7 @@ RSpec.describe Elasticity::Document do
|
|
27
26
|
attr_accessor :name, :items
|
28
27
|
|
29
28
|
def to_document
|
30
|
-
{
|
29
|
+
{ name: name, items: items }
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
@@ -78,9 +77,9 @@ RSpec.describe Elasticity::Document do
|
|
78
77
|
end
|
79
78
|
|
80
79
|
it "gets specific document from the index" do
|
81
|
-
doc = { "
|
80
|
+
doc = { "_id" => 1, "_source" => { "name" => "Foo", "items" => [{ "name" => "Item1" }]}}
|
82
81
|
expect(index).to receive(:get_document).with("class_name", 1).and_return(doc)
|
83
|
-
expect(subject.get(1)).to eq klass.new(
|
82
|
+
expect(subject.get(1)).to eq klass.new(_id: 1, name: "Foo", items: [{ "name" => "Item1" }])
|
84
83
|
end
|
85
84
|
|
86
85
|
it "deletes specific document from index" do
|
@@ -91,10 +90,10 @@ RSpec.describe Elasticity::Document do
|
|
91
90
|
end
|
92
91
|
|
93
92
|
context "instance" do
|
94
|
-
subject { klass.new
|
93
|
+
subject { klass.new _id: 1, name: "Foo", items: [{ name: "Item1" }] }
|
95
94
|
|
96
95
|
it "stores the document in the index" do
|
97
|
-
expect(index).to receive(:index_document).with("class_name", 1, {
|
96
|
+
expect(index).to receive(:index_document).with("class_name", 1, { name: "Foo", items: [{ name: "Item1" }] })
|
98
97
|
subject.update
|
99
98
|
end
|
100
99
|
end
|
@@ -5,10 +5,10 @@ RSpec.describe Elasticity::MultiSearch do
|
|
5
5
|
let :klass do
|
6
6
|
Class.new do
|
7
7
|
include ActiveModel::Model
|
8
|
-
attr_accessor :
|
8
|
+
attr_accessor :_id, :name
|
9
9
|
|
10
10
|
def ==(other)
|
11
|
-
self.
|
11
|
+
self._id == other._id && self.name == other.name
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -16,8 +16,8 @@ RSpec.describe Elasticity::MultiSearch do
|
|
16
16
|
let :response do
|
17
17
|
{
|
18
18
|
"responses" => [
|
19
|
-
{ "hits" => { "total" => 2, "hits" => [{"
|
20
|
-
{ "hits" => { "total" => 1, "hits" => [{"
|
19
|
+
{ "hits" => { "total" => 2, "hits" => [{ "_id" => 1, "_source" => { "name" => "foo" }}, { "_id" => 2, "_source" => { "name" => "bar" }}]}},
|
20
|
+
{ "hits" => { "total" => 1, "hits" => [{ "_id" => 3, "_source" => { "name" => "baz" }}]}},
|
21
21
|
]
|
22
22
|
}
|
23
23
|
end
|
@@ -31,7 +31,7 @@ RSpec.describe Elasticity::MultiSearch do
|
|
31
31
|
{ index: "index_second", type: "document_second", search: { search: :second } },
|
32
32
|
]).and_return(response)
|
33
33
|
|
34
|
-
expect(Array(subject[:first])). to eq [klass.new(
|
35
|
-
expect(Array(subject[:second])). to eq [klass.new(
|
34
|
+
expect(Array(subject[:first])). to eq [klass.new(_id: 1, name: "foo"), klass.new(_id: 2, name: "bar")]
|
35
|
+
expect(Array(subject[:second])). to eq [klass.new(_id: 3, name: "baz")]
|
36
36
|
end
|
37
37
|
end
|
data/spec/units/search_spec.rb
CHANGED
@@ -7,15 +7,15 @@ RSpec.describe "Search" do
|
|
7
7
|
|
8
8
|
let :full_response do
|
9
9
|
{ "hits" => { "total" => 2, "hits" => [
|
10
|
-
{"
|
11
|
-
{"
|
10
|
+
{ "_id" => 1, "_source" => { "name" => "foo" } },
|
11
|
+
{ "_id" => 2, "_source" => { "name" => "bar" } },
|
12
12
|
]}}
|
13
13
|
end
|
14
14
|
|
15
15
|
let :ids_response do
|
16
16
|
{ "hits" => { "total" => 2, "hits" => [
|
17
|
-
{
|
18
|
-
{
|
17
|
+
{ "_id" => 1 },
|
18
|
+
{ "_id" => 2 },
|
19
19
|
]}}
|
20
20
|
end
|
21
21
|
|
@@ -26,10 +26,10 @@ RSpec.describe "Search" do
|
|
26
26
|
let :klass do
|
27
27
|
Class.new do
|
28
28
|
include ActiveModel::Model
|
29
|
-
attr_accessor :
|
29
|
+
attr_accessor :_id, :name
|
30
30
|
|
31
31
|
def ==(other)
|
32
|
-
self.
|
32
|
+
self._id == other._id && self.name == other.name
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -43,7 +43,7 @@ RSpec.describe "Search" do
|
|
43
43
|
expect(index).to receive(:search).with(document_type, body).and_return(full_response)
|
44
44
|
|
45
45
|
docs = subject.documents(klass)
|
46
|
-
expected = [klass.new(
|
46
|
+
expected = [klass.new(_id: 1, name: "foo"), klass.new(_id: 2, name: "bar")]
|
47
47
|
|
48
48
|
expect(docs.total).to eq 2
|
49
49
|
expect(docs.size).to eq expected.size
|
@@ -59,7 +59,7 @@ RSpec.describe "Search" do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "searches the index and return active record models" do
|
62
|
-
expect(index).to receive(:search).with(document_type, body.merge(_source:
|
62
|
+
expect(index).to receive(:search).with(document_type, body.merge(_source: false)).and_return(ids_response)
|
63
63
|
|
64
64
|
relation = double(:relation,
|
65
65
|
connection: double(:connection),
|
@@ -75,7 +75,7 @@ RSpec.describe "Search" do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
it "return relation.none from activerecord relation with no matches" do
|
78
|
-
expect(index).to receive(:search).with(document_type, body.merge(_source:
|
78
|
+
expect(index).to receive(:search).with(document_type, body.merge(_source: false)).and_return(empty_response)
|
79
79
|
|
80
80
|
relation = double(:relation)
|
81
81
|
expect(relation).to receive(:none).and_return(relation)
|
@@ -95,7 +95,7 @@ RSpec.describe "Search" do
|
|
95
95
|
|
96
96
|
it "automatically maps the documents into the provided Document class" do
|
97
97
|
expect(index).to receive(:search).with(document_type, body).and_return(full_response)
|
98
|
-
expect(Array(subject)).to eq [klass.new(
|
98
|
+
expect(Array(subject)).to eq [klass.new(_id: 1, name: "foo"), klass.new(_id: 2, name: "bar")]
|
99
99
|
end
|
100
100
|
|
101
101
|
it "delegates active_records for the underlying search" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: es-elasticity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Kochenburger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|