nazrin 2.1.2 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +16 -0
- data/README.md +3 -2
- data/lib/nazrin.rb +2 -2
- data/lib/nazrin/data_accessor.rb +87 -0
- data/lib/nazrin/data_accessor/active_record.rb +19 -0
- data/lib/nazrin/data_accessor/mongoid.rb +22 -0
- data/lib/nazrin/searchable.rb +92 -0
- data/lib/nazrin/version.rb +1 -1
- data/nazrin.gemspec +1 -0
- metadata +20 -4
- data/lib/nazrin/active_record/data_accessor.rb +0 -55
- data/lib/nazrin/active_record/searchable.rb +0 -95
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4f029ada212e4e84f9330f78ed97b3b06442d17
|
4
|
+
data.tar.gz: 7928db6029d307c725cbbd20c8483e3387f3b0cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 069789e5426be62c5967a54cca18cb05e1a9f5c1a3c0a833e4919b2984004263b07d8edcc3b247cd40cd4a6ed6d8f55f4661fdfd40cd0db34cf4079eea8ccdd8
|
7
|
+
data.tar.gz: f3b4e13c3f1260e1a6b0af4d237f354d9a020771f9c37e684ca87496d6d2da21504368d91b24fe2810a35526cb87da987c5e41dce71abfdd96ededf05d7ab2a3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## [2.2.0](https://github.com/tsuwatch/nazrin/compare/v2.1.2...v2.2.0)
|
2
|
+
|
3
|
+
### Breaking changes:
|
4
|
+
|
5
|
+
* Include `Nazrin::Searchable` instead of `Nazrin::ActiveRecord::Searchable` [#19](https://github.com/tsuwatch/nazrin/pull/19)
|
6
|
+
|
7
|
+
### Features:
|
8
|
+
|
9
|
+
* Support Mongoid [#17](https://github.com/tsuwatch/nazrin/pull/17) [#20](https://github.com/tsuwatch/nazrin/pull/20) - [@yefim](https://github.com/yefim)
|
10
|
+
|
11
|
+
## [2.1.2](https://github.com/tsuwatch/nazrin/compare/v2.1.1...v2.1.2)
|
12
|
+
|
13
|
+
### Fixes:
|
14
|
+
|
15
|
+
* Require aws-sdk gem in nazrin [#14](https://github.com/tsuwatch/nazrin/pull/14)
|
16
|
+
|
1
17
|
## [2.1.1](https://github.com/tsuwatch/nazrin/compare/v2.1.0...v2.1.1)
|
2
18
|
|
3
19
|
### Fixes:
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[![Coverage Status](https://coveralls.io/repos/tsuwatch/nazrin/badge.svg?branch=readme&service=github)](https://coveralls.io/github/tsuwatch/nazrin?branch=readme)
|
5
5
|
[![Code Climate](https://codeclimate.com/github/tsuwatch/nazrin/badges/gpa.svg)](https://codeclimate.com/github/tsuwatch/nazrin)
|
6
6
|
|
7
|
-
Nazrin is a Ruby wrapper for Amazon CloudSearch (aws-sdk), with
|
7
|
+
Nazrin is a Ruby wrapper for Amazon CloudSearch (aws-sdk), with ActiveRecord, Mongoid support for easy integration with your Rails application.
|
8
8
|
|
9
9
|
>*Nazrin has the ability of the extent which find what you're looking for...*
|
10
10
|
|
@@ -44,7 +44,7 @@ end
|
|
44
44
|
|
45
45
|
```ruby
|
46
46
|
class Post < ActiveRecord::Base
|
47
|
-
include Nazrin::
|
47
|
+
include Nazrin::Searchable
|
48
48
|
|
49
49
|
searchable do
|
50
50
|
fields [:content]
|
@@ -66,6 +66,7 @@ Post.search(where: :foo, includes: :bar).size(1).start(0).query("(and 'content')
|
|
66
66
|
If you want to use other supported pagination libraries, for example, `nazrin-kaminari` generates `Kaminari::PaginatableArray` instead of `Nazrin::PaginatedArray`.
|
67
67
|
|
68
68
|
```ruby
|
69
|
+
gem 'nazrin'
|
69
70
|
gem 'nazrin-kaminari'
|
70
71
|
```
|
71
72
|
|
data/lib/nazrin.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'aws-sdk'
|
2
2
|
|
3
|
-
require 'nazrin/
|
4
|
-
require 'nazrin/
|
3
|
+
require 'nazrin/searchable'
|
4
|
+
require 'nazrin/data_accessor'
|
5
5
|
require 'nazrin/config'
|
6
6
|
require 'nazrin/search_client'
|
7
7
|
require 'nazrin/document_client'
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Nazrin
|
2
|
+
class DataAccessor
|
3
|
+
class NoAccessorError < StandardError; end
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def for(clazz)
|
7
|
+
accessor = registered_accessor_for(clazz) || register_accessor(clazz)
|
8
|
+
return accessor if accessor
|
9
|
+
raise NoAccessorError, "No accessor for #{clazz.name}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def registered_accessor_for(clazz)
|
13
|
+
return nil if clazz.name.nil? || clazz.name.empty?
|
14
|
+
accessors[clazz.name.to_sym]
|
15
|
+
end
|
16
|
+
|
17
|
+
def register_accessor(clazz)
|
18
|
+
clazz.ancestors.each do |ancestor_class|
|
19
|
+
if accessor = accessor_for(ancestor_class)
|
20
|
+
register(accessor, clazz)
|
21
|
+
return accessor
|
22
|
+
end
|
23
|
+
end
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def accessor_for(clazz)
|
28
|
+
return nil if clazz.name.nil? || clazz.name.empty?
|
29
|
+
if defined?(::ActiveRecord::Base) && clazz.ancestors.include?(::ActiveRecord::Base)
|
30
|
+
require 'nazrin/data_accessor/active_record'
|
31
|
+
return Nazrin::DataAccessor::ActiveRecord
|
32
|
+
elsif defined?(::Mongoid::Document) && clazz.ancestors.include?(::Mongoid::Document)
|
33
|
+
require 'nazrin/data_accessor/mongoid'
|
34
|
+
return Nazrin::DataAccessor::Mongoid
|
35
|
+
end
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def register(accessor, clazz)
|
40
|
+
accessors[clazz.name.to_sym] = accessor
|
41
|
+
end
|
42
|
+
|
43
|
+
def accessors
|
44
|
+
@accessor ||= {}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def initialize(model, options)
|
49
|
+
@model = model
|
50
|
+
@options = options
|
51
|
+
end
|
52
|
+
|
53
|
+
def results(client)
|
54
|
+
@client = client
|
55
|
+
|
56
|
+
res = @client.search
|
57
|
+
collection = load_all(res.data.hits.hit.map(&:id))
|
58
|
+
|
59
|
+
if @client.parameters[:size] && @client.parameters[:start]
|
60
|
+
total_count = res.data.hits.found
|
61
|
+
|
62
|
+
Nazrin::PaginationGenerator.generate(
|
63
|
+
collection,
|
64
|
+
current_page: current_page,
|
65
|
+
per_page: @client.parameters[:size],
|
66
|
+
total_count: total_count,
|
67
|
+
last_page: last_page(total_count))
|
68
|
+
else
|
69
|
+
collection
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def load_all
|
74
|
+
raise NotImplementedError
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def last_page(total_count)
|
80
|
+
(total_count / @client.parameters[:size].to_f).ceil
|
81
|
+
end
|
82
|
+
|
83
|
+
def current_page
|
84
|
+
(@client.parameters[:start] / @client.parameters[:size].to_f).ceil + 1
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Nazrin
|
2
|
+
class DataAccessor
|
3
|
+
class ActiveRecord < Nazrin::DataAccessor
|
4
|
+
# load from activerecord
|
5
|
+
def load_all(ids)
|
6
|
+
records_table = {}
|
7
|
+
@options.each do |k, v|
|
8
|
+
@model = @model.send(k, v)
|
9
|
+
end
|
10
|
+
@model.where(id: ids).each do |record|
|
11
|
+
records_table[record.id] = record
|
12
|
+
end
|
13
|
+
ids.map do |id|
|
14
|
+
records_table.select { |k, _| k == id.to_i }[id.to_i]
|
15
|
+
end.reject(&:nil?)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Nazrin
|
2
|
+
class DataAccessor
|
3
|
+
class Mongoid < Nazrin::DataAccessor
|
4
|
+
def load_all(ids)
|
5
|
+
documents_table = {}
|
6
|
+
@options.each do |k, v|
|
7
|
+
@model = if v.nil?
|
8
|
+
@model.send(k)
|
9
|
+
else
|
10
|
+
@model.send(k, v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
@model.where('_id' => { '$in' => ids }).each do |document|
|
14
|
+
documents_table[document._id.to_s] = document
|
15
|
+
end
|
16
|
+
ids.map do |id|
|
17
|
+
documents_table[id]
|
18
|
+
end.reject(&:nil?)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Nazrin
|
4
|
+
module Searchable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
alias_method :delete_from_index, :nazrin_delete_from_index unless method_defined? :delete_from_index
|
9
|
+
alias_method :add_to_index, :nazrin_add_to_index unless method_defined? :add_to_index
|
10
|
+
alias_method :update_in_index, :nazrin_update_in_index unless method_defined? :update_in_index
|
11
|
+
end
|
12
|
+
|
13
|
+
def nazrin_delete_from_index
|
14
|
+
self.class.nazrin_delete_document(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def nazrin_add_to_index
|
18
|
+
self.class.nazrin_add_document(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def nazrin_update_in_index
|
22
|
+
self.class.nazrin_update_document(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
def self.extended(base)
|
27
|
+
class << base
|
28
|
+
alias_method :search, :nazrin_search unless method_defined? :search
|
29
|
+
alias_method :searchable, :nazrin_searchable unless method_defined? :searchable
|
30
|
+
alias_method :fields, :nazrin_fields unless method_defined? :fields
|
31
|
+
alias_method :field, :nazrin_field unless method_defined? :field
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def nazrin_search(options = {})
|
36
|
+
client = Nazrin::SearchClient.new
|
37
|
+
client.data_accessor = Nazrin::DataAccessor.for(self).new(self, options)
|
38
|
+
client
|
39
|
+
end
|
40
|
+
|
41
|
+
def nazrin_searchable(&block)
|
42
|
+
class_variable_set(
|
43
|
+
:@@nazrin_doc_client,
|
44
|
+
Nazrin::DocumentClient.new)
|
45
|
+
class_variable_set(:@@nazrin_search_field_data, {})
|
46
|
+
block.call
|
47
|
+
end
|
48
|
+
|
49
|
+
def nazrin_fields(fields)
|
50
|
+
field_data = class_variable_get(:@@nazrin_search_field_data)
|
51
|
+
fields.each do |field|
|
52
|
+
field_data[field] = proc { public_send(field) }
|
53
|
+
end
|
54
|
+
class_variable_set(:@@nazrin_search_field_data, field_data)
|
55
|
+
end
|
56
|
+
|
57
|
+
def nazrin_field(field, &block)
|
58
|
+
field_data = class_variable_get(:@@nazrin_search_field_data)
|
59
|
+
field_data[field] = block
|
60
|
+
class_variable_set(:@@nazrin_search_field_data, field_data)
|
61
|
+
end
|
62
|
+
|
63
|
+
def nazrin_doc_client
|
64
|
+
class_variable_get(:@@nazrin_doc_client)
|
65
|
+
end
|
66
|
+
|
67
|
+
def nazrin_eval_field_data(obj)
|
68
|
+
data = {}
|
69
|
+
class_variable_get(
|
70
|
+
:@@nazrin_search_field_data).each do |field, block|
|
71
|
+
data[field] = obj.instance_eval(&block)
|
72
|
+
data[field] = data[field].remove(
|
73
|
+
/[[:cntrl:]]/) if data[field].is_a?(String)
|
74
|
+
end
|
75
|
+
data
|
76
|
+
end
|
77
|
+
|
78
|
+
def nazrin_add_document(obj)
|
79
|
+
nazrin_doc_client.add_document(
|
80
|
+
obj.send(:id), nazrin_eval_field_data(obj))
|
81
|
+
end
|
82
|
+
|
83
|
+
def nazrin_update_document(obj)
|
84
|
+
nazrin_add_document(obj)
|
85
|
+
end
|
86
|
+
|
87
|
+
def nazrin_delete_document(obj)
|
88
|
+
nazrin_doc_client.delete_document(obj.send(:id))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/nazrin/version.rb
CHANGED
data/nazrin.gemspec
CHANGED
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.2.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: 2017-
|
11
|
+
date: 2017-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: mongoid
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
153
167
|
description: Ruby wrapper for Amazon CloudSearch (aws-sdk), with optional ActiveRecord
|
154
168
|
support for easy integration with your Rails application
|
155
169
|
email:
|
@@ -170,13 +184,15 @@ files:
|
|
170
184
|
- lib/generators/nazrin/config_generator.rb
|
171
185
|
- lib/generators/nazrin/templates/nazrin_config.rb
|
172
186
|
- lib/nazrin.rb
|
173
|
-
- lib/nazrin/active_record/data_accessor.rb
|
174
|
-
- lib/nazrin/active_record/searchable.rb
|
175
187
|
- lib/nazrin/config.rb
|
188
|
+
- lib/nazrin/data_accessor.rb
|
189
|
+
- lib/nazrin/data_accessor/active_record.rb
|
190
|
+
- lib/nazrin/data_accessor/mongoid.rb
|
176
191
|
- lib/nazrin/document_client.rb
|
177
192
|
- lib/nazrin/paginated_array.rb
|
178
193
|
- lib/nazrin/pagination_generator.rb
|
179
194
|
- lib/nazrin/search_client.rb
|
195
|
+
- lib/nazrin/searchable.rb
|
180
196
|
- lib/nazrin/version.rb
|
181
197
|
- nazrin.gemspec
|
182
198
|
homepage: https://github.com/tsuwatch/nazrin
|
@@ -1,55 +0,0 @@
|
|
1
|
-
module Nazrin
|
2
|
-
module ActiveRecord
|
3
|
-
class DataAccessor
|
4
|
-
def initialize(model, options)
|
5
|
-
@model = model
|
6
|
-
@options = options
|
7
|
-
end
|
8
|
-
|
9
|
-
# a list of all matching AR model objects
|
10
|
-
def results(client)
|
11
|
-
@client = client
|
12
|
-
|
13
|
-
res = @client.search
|
14
|
-
collection = load_all(res.data.hits.hit.map(&:id))
|
15
|
-
|
16
|
-
if @client.parameters[:size] && @client.parameters[:start]
|
17
|
-
total_count = res.data.hits.found
|
18
|
-
|
19
|
-
Nazrin::PaginationGenerator.generate(
|
20
|
-
collection,
|
21
|
-
current_page: current_page,
|
22
|
-
per_page: @client.parameters[:size],
|
23
|
-
total_count: total_count,
|
24
|
-
last_page: last_page(total_count))
|
25
|
-
else
|
26
|
-
collection
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# load from activerecord
|
31
|
-
def load_all(ids)
|
32
|
-
records_table = {}
|
33
|
-
@options.each do |k, v|
|
34
|
-
@model = @model.send(k, v)
|
35
|
-
end
|
36
|
-
@model.where(id: ids).each do |record|
|
37
|
-
records_table[record.id] = record
|
38
|
-
end
|
39
|
-
ids.map do |id|
|
40
|
-
records_table.select { |k, _| k == id.to_i }[id.to_i]
|
41
|
-
end.reject(&:nil?)
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def last_page(total_count)
|
47
|
-
(total_count / @client.parameters[:size].to_f).ceil
|
48
|
-
end
|
49
|
-
|
50
|
-
def current_page
|
51
|
-
(@client.parameters[:start] / @client.parameters[:size].to_f).ceil + 1
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,95 +0,0 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
|
3
|
-
module Nazrin
|
4
|
-
module ActiveRecord
|
5
|
-
module Searchable
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
alias_method :delete_from_index, :nazrin_delete_from_index unless method_defined? :delete_from_index
|
10
|
-
alias_method :add_to_index, :nazrin_add_to_index unless method_defined? :add_to_index
|
11
|
-
alias_method :update_in_index, :nazrin_update_in_index unless method_defined? :update_in_index
|
12
|
-
end
|
13
|
-
|
14
|
-
def nazrin_delete_from_index
|
15
|
-
self.class.nazrin_delete_document(self)
|
16
|
-
end
|
17
|
-
|
18
|
-
def nazrin_add_to_index
|
19
|
-
self.class.nazrin_add_document(self)
|
20
|
-
end
|
21
|
-
|
22
|
-
def nazrin_update_in_index
|
23
|
-
self.class.nazrin_update_document(self)
|
24
|
-
end
|
25
|
-
|
26
|
-
module ClassMethods
|
27
|
-
def self.extended(base)
|
28
|
-
class << base
|
29
|
-
alias_method :search, :nazrin_search unless method_defined? :search
|
30
|
-
alias_method :searchable, :nazrin_searchable unless method_defined? :searchable
|
31
|
-
alias_method :fields, :nazrin_fields unless method_defined? :fields
|
32
|
-
alias_method :field, :nazrin_field unless method_defined? :field
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def nazrin_search(options = {})
|
37
|
-
client = Nazrin::SearchClient.new
|
38
|
-
client.data_accessor = Nazrin::ActiveRecord::DataAccessor.new(
|
39
|
-
self, options)
|
40
|
-
client
|
41
|
-
end
|
42
|
-
|
43
|
-
def nazrin_searchable(&block)
|
44
|
-
class_variable_set(
|
45
|
-
:@@nazrin_doc_client,
|
46
|
-
Nazrin::DocumentClient.new)
|
47
|
-
class_variable_set(:@@nazrin_search_field_data, {})
|
48
|
-
block.call
|
49
|
-
end
|
50
|
-
|
51
|
-
def nazrin_fields(fields)
|
52
|
-
field_data = class_variable_get(:@@nazrin_search_field_data)
|
53
|
-
fields.each do |field|
|
54
|
-
field_data[field] = proc { public_send(field) }
|
55
|
-
end
|
56
|
-
class_variable_set(:@@nazrin_search_field_data, field_data)
|
57
|
-
end
|
58
|
-
|
59
|
-
def nazrin_field(field, &block)
|
60
|
-
field_data = class_variable_get(:@@nazrin_search_field_data)
|
61
|
-
field_data[field] = block
|
62
|
-
class_variable_set(:@@nazrin_search_field_data, field_data)
|
63
|
-
end
|
64
|
-
|
65
|
-
def nazrin_doc_client
|
66
|
-
class_variable_get(:@@nazrin_doc_client)
|
67
|
-
end
|
68
|
-
|
69
|
-
def nazrin_eval_field_data(obj)
|
70
|
-
data = {}
|
71
|
-
class_variable_get(
|
72
|
-
:@@nazrin_search_field_data).each do |field, block|
|
73
|
-
data[field] = obj.instance_eval(&block)
|
74
|
-
data[field] = data[field].remove(
|
75
|
-
/[[:cntrl:]]/) if data[field].is_a?(String)
|
76
|
-
end
|
77
|
-
data
|
78
|
-
end
|
79
|
-
|
80
|
-
def nazrin_add_document(obj)
|
81
|
-
nazrin_doc_client.add_document(
|
82
|
-
obj.send(:id), nazrin_eval_field_data(obj))
|
83
|
-
end
|
84
|
-
|
85
|
-
def nazrin_update_document(obj)
|
86
|
-
nazrin_add_document(obj)
|
87
|
-
end
|
88
|
-
|
89
|
-
def nazrin_delete_document(obj)
|
90
|
-
nazrin_doc_client.delete_document(obj.send(:id))
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|