nazrin 2.4.0 → 2.5.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/CHANGELOG.md +8 -0
- data/README.md +8 -1
- data/lib/nazrin/data_accessor.rb +33 -15
- data/lib/nazrin/data_accessor/active_record.rb +7 -3
- data/lib/nazrin/data_accessor/mongoid.rb +9 -5
- data/lib/nazrin/data_accessor/struct.rb +68 -0
- data/lib/nazrin/result.rb +10 -0
- data/lib/nazrin/searchable/config.rb +2 -0
- data/lib/nazrin/version.rb +1 -1
- data/nazrin.gemspec +1 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3765528fe1c94e124288e3af3b4015cd929a9a93
|
4
|
+
data.tar.gz: d145c6568fd01065ab0d6a78a2b48bf601e5ea42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c9673e792b0b9011084daf9d407a4de9f98fe1eb2f3aadd69f19b850c5656d53d73ad806ec2f53134380098f03ca2c2e107fa505b3c77ac858c29f85a996e4c
|
7
|
+
data.tar.gz: b37bda7e9dc6f3e25d165dfcd2fae70380c06055b7b5a5f989487c1d732e7b9536bbd064ebfd7fa828bd83ebaec6083dfa9637bbc08cc27f3dd4d6d09947a40a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## [2.5.0](https://github.com/tsuwatch/nazrin/compare/v2.4.0...v2.5.0)
|
2
|
+
|
3
|
+
### Features:
|
4
|
+
|
5
|
+
* CloudSearch data also available [#25](https://github.com/tsuwatch/nazrin/pull/25) - [@AMHOL](https://github.com/AMHOL)
|
6
|
+
|
7
|
+
* Enable accessing facets [#26](https://github.com/tsuwatch/nazrin/pull/26) - [@AMHOL](https://github.com/AMHOL)
|
8
|
+
|
1
9
|
## [2.4.0](https://github.com/tsuwatch/nazrin/compare/v2.3.0...v2.4.0)
|
2
10
|
|
3
11
|
### Features:
|
data/README.md
CHANGED
@@ -51,6 +51,10 @@ class Post < ActiveRecord::Base
|
|
51
51
|
searchable_configure do |config|
|
52
52
|
config.search_endpoint = 'http://example.com/override-search-endpoint'
|
53
53
|
config.document_endpoint = 'http://example.com/override-document-endpoint'
|
54
|
+
|
55
|
+
# If you set domain_name, CloudSearch data using index_fields configured for the search domain is loaded, not a database.
|
56
|
+
# So you can use nazrin for plain object
|
57
|
+
config.domain_name = 'my-cloudsearch-domain-name'
|
54
58
|
end
|
55
59
|
|
56
60
|
searchable do
|
@@ -65,8 +69,11 @@ end
|
|
65
69
|
```
|
66
70
|
|
67
71
|
```ruby
|
68
|
-
Post.search(where: :foo, includes: :bar).size(1).start(0).query("(and 'content')").query_parser('structured').execute
|
72
|
+
result = Post.search(where: :foo, includes: :bar).size(1).start(0).query("(and 'content')").query_parser('structured').execute
|
69
73
|
=> [#<Post id: 1, content: "content">]
|
74
|
+
# You can access facets
|
75
|
+
result.facets
|
76
|
+
=> {}
|
70
77
|
```
|
71
78
|
|
72
79
|
### Supported pagination libraries
|
data/lib/nazrin/data_accessor.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'nazrin/result'
|
2
|
+
|
1
3
|
module Nazrin
|
2
4
|
class DataAccessor
|
3
5
|
class NoAccessorError < StandardError; end
|
@@ -26,7 +28,11 @@ module Nazrin
|
|
26
28
|
|
27
29
|
def accessor_for(clazz)
|
28
30
|
return nil if clazz.name.nil? || clazz.name.empty?
|
29
|
-
|
31
|
+
|
32
|
+
if clazz.respond_to?(:nazrin_searchable_config) && clazz.nazrin_searchable_config.domain_name
|
33
|
+
require 'nazrin/data_accessor/struct'
|
34
|
+
return Nazrin::DataAccessor::Struct[clazz.nazrin_searchable_config]
|
35
|
+
elsif defined?(::ActiveRecord::Base) && clazz.ancestors.include?(::ActiveRecord::Base)
|
30
36
|
require 'nazrin/data_accessor/active_record'
|
31
37
|
return Nazrin::DataAccessor::ActiveRecord
|
32
38
|
elsif defined?(::Mongoid::Document) && clazz.ancestors.include?(::Mongoid::Document)
|
@@ -45,43 +51,55 @@ module Nazrin
|
|
45
51
|
end
|
46
52
|
end
|
47
53
|
|
54
|
+
attr_reader :model
|
55
|
+
attr_reader :options
|
56
|
+
|
48
57
|
def initialize(model, options)
|
49
58
|
@model = model
|
50
59
|
@options = options
|
51
60
|
end
|
52
61
|
|
53
62
|
def results(client)
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
63
|
+
res = client.search
|
64
|
+
collection = load_all(data_from_response(res))
|
65
|
+
start = client.parameters[:start]
|
66
|
+
size = client.parameters[:size]
|
58
67
|
|
59
|
-
if
|
68
|
+
if size && start
|
60
69
|
total_count = res.data.hits.found
|
61
70
|
|
62
|
-
Nazrin::PaginationGenerator.generate(
|
71
|
+
records = Nazrin::PaginationGenerator.generate(
|
63
72
|
collection,
|
64
|
-
current_page: current_page,
|
65
|
-
per_page:
|
73
|
+
current_page: current_page(start, size),
|
74
|
+
per_page: size,
|
66
75
|
total_count: total_count,
|
67
|
-
last_page: last_page(total_count))
|
76
|
+
last_page: last_page(size, total_count))
|
68
77
|
else
|
69
|
-
collection
|
78
|
+
records = collection
|
70
79
|
end
|
80
|
+
|
81
|
+
Result.new(
|
82
|
+
records,
|
83
|
+
res.facets
|
84
|
+
)
|
71
85
|
end
|
72
86
|
|
73
87
|
def load_all
|
74
88
|
raise NotImplementedError
|
75
89
|
end
|
76
90
|
|
91
|
+
def data_from_response
|
92
|
+
raise NotImplementedError
|
93
|
+
end
|
94
|
+
|
77
95
|
private
|
78
96
|
|
79
|
-
def last_page(total_count)
|
80
|
-
(total_count /
|
97
|
+
def last_page(size, total_count)
|
98
|
+
(total_count / size.to_f).ceil
|
81
99
|
end
|
82
100
|
|
83
|
-
def current_page
|
84
|
-
(
|
101
|
+
def current_page(start, size)
|
102
|
+
(start / size.to_f).ceil + 1
|
85
103
|
end
|
86
104
|
end
|
87
105
|
end
|
@@ -4,16 +4,20 @@ module Nazrin
|
|
4
4
|
# load from activerecord
|
5
5
|
def load_all(ids)
|
6
6
|
records_table = {}
|
7
|
-
|
8
|
-
|
7
|
+
options.each do |k, v|
|
8
|
+
model = model.send(k, v)
|
9
9
|
end
|
10
|
-
|
10
|
+
model.where(id: ids).each do |record|
|
11
11
|
records_table[record.id] = record
|
12
12
|
end
|
13
13
|
ids.map do |id|
|
14
14
|
records_table.select { |k, _| k == id.to_i }[id.to_i]
|
15
15
|
end.reject(&:nil?)
|
16
16
|
end
|
17
|
+
|
18
|
+
def data_from_response(res)
|
19
|
+
res.data.hits.hit.map(&:id)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -3,20 +3,24 @@ module Nazrin
|
|
3
3
|
class Mongoid < Nazrin::DataAccessor
|
4
4
|
def load_all(ids)
|
5
5
|
documents_table = {}
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
options.each do |k, v|
|
7
|
+
model = if v.nil?
|
8
|
+
model.send(k)
|
9
9
|
else
|
10
|
-
|
10
|
+
model.send(k, v)
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
model.where('_id' => { '$in' => ids }).each do |document|
|
14
14
|
documents_table[document._id.to_s] = document
|
15
15
|
end
|
16
16
|
ids.map do |id|
|
17
17
|
documents_table[id]
|
18
18
|
end.reject(&:nil?)
|
19
19
|
end
|
20
|
+
|
21
|
+
def data_from_response(res)
|
22
|
+
res.data.hits.hit.map(&:id)
|
23
|
+
end
|
20
24
|
end
|
21
25
|
end
|
22
26
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'aws-sdk-cloudsearch'
|
2
|
+
|
3
|
+
module Nazrin
|
4
|
+
class DataAccessor
|
5
|
+
class Struct < Nazrin::DataAccessor
|
6
|
+
class MissingDomainNameConfigError < StandardError; end
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_reader :config
|
10
|
+
|
11
|
+
def [](config)
|
12
|
+
Class.new(self).tap do |clazz|
|
13
|
+
clazz.instance_variable_set(:@config, config)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def transform_attributes(attributes)
|
18
|
+
attributes.each_with_object({}) do |(name, value), hash|
|
19
|
+
type = field_types[name]
|
20
|
+
|
21
|
+
if type.end_with?('array')
|
22
|
+
hash[name] = value
|
23
|
+
else
|
24
|
+
hash[name] = value.first
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def field_types
|
30
|
+
return @field_types if defined?(@field_types)
|
31
|
+
|
32
|
+
response = cloudsearch_client.describe_index_fields(
|
33
|
+
domain_name: config.domain_name
|
34
|
+
)
|
35
|
+
|
36
|
+
@field_types = response.index_fields.each_with_object({}) do |field, fields|
|
37
|
+
name = field.options[:index_field_name]
|
38
|
+
type = field.options[:index_field_type]
|
39
|
+
|
40
|
+
fields[name] = type
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def cloudsearch_client
|
47
|
+
@cloudsearch_client ||= Aws::CloudSearch::Client.new(
|
48
|
+
access_key_id: config.access_key_id,
|
49
|
+
secret_access_key: config.secret_access_key,
|
50
|
+
logger: config.logger
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def load_all(data)
|
56
|
+
data.map do |attributes|
|
57
|
+
model.new(attributes)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def data_from_response(res)
|
62
|
+
res.data[:hits][:hit].map do |hit|
|
63
|
+
self.class.transform_attributes(hit[:fields])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/nazrin/version.rb
CHANGED
data/nazrin.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
20
|
spec.add_dependency 'aws-sdk-core', '~> 3'
|
21
|
+
spec.add_dependency 'aws-sdk-cloudsearch', '~> 1.0'
|
21
22
|
spec.add_dependency 'aws-sdk-cloudsearchdomain', '~> 1.0'
|
22
23
|
spec.add_dependency 'activesupport', '>= 4.0.0'
|
23
24
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nazrin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomohiro Suwa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aws-sdk-cloudsearch
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: aws-sdk-cloudsearchdomain
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -202,9 +216,11 @@ files:
|
|
202
216
|
- lib/nazrin/data_accessor.rb
|
203
217
|
- lib/nazrin/data_accessor/active_record.rb
|
204
218
|
- lib/nazrin/data_accessor/mongoid.rb
|
219
|
+
- lib/nazrin/data_accessor/struct.rb
|
205
220
|
- lib/nazrin/document_client.rb
|
206
221
|
- lib/nazrin/paginated_array.rb
|
207
222
|
- lib/nazrin/pagination_generator.rb
|
223
|
+
- lib/nazrin/result.rb
|
208
224
|
- lib/nazrin/search_client.rb
|
209
225
|
- lib/nazrin/searchable.rb
|
210
226
|
- lib/nazrin/searchable/config.rb
|