riagent 0.0.3 → 0.1.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/Gemfile.lock +18 -30
- data/README.md +6 -77
- data/lib/rails/generators/riagent/install/templates/riak.yml +1 -1
- data/lib/riagent/active_document.rb +1 -2
- data/lib/riagent/associations.rb +2 -2
- data/lib/riagent/configuration.rb +2 -23
- data/lib/riagent/conversion.rb +1 -1
- data/lib/riagent/persistence/persistence_strategy.rb +1 -3
- data/lib/riagent/persistence/riak_dt_set_strategy.rb +1 -1
- data/lib/riagent/persistence/riak_kv_strategy.rb +3 -3
- data/lib/riagent/persistence.rb +4 -7
- data/lib/riagent/railtie.rb +0 -1
- data/lib/riagent/version.rb +1 -1
- data/riagent.gemspec +3 -4
- data/test/config/riak.yml.example +1 -1
- data/test/examples/models/address_book.rb +2 -2
- data/test/examples/models/blog_post.rb +5 -5
- data/test/examples/models/user.rb +4 -4
- data/test/test_helper.rb +2 -1
- data/test/unit/config_test.rb +0 -7
- data/test/unit/persistence_test.rb +1 -17
- metadata +7 -29
- data/lib/riagent/persistence/riak_json_strategy.rb +0 -121
- data/lib/riagent/search_schema.rb +0 -58
- data/test/integration/persistence_riak_json_integration_test.rb +0 -76
- data/test/unit/persistence_riak_json_test.rb +0 -141
- data/test/unit/search_schema_test.rb +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5d1d7a96d9c29d8889bf4a5dcf4203e8356a7f67
|
|
4
|
+
data.tar.gz: bec969e749fe0625dc02521c851cf8c5ecbc738d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cd088e4272e939b1a01d9ddc5dfcf656f739c31c22af2af59257e427a62886edd7bdb11fdedeb8758f3275a7a8ff1abd7d6f80fe939af193ab3a3d3135b52912
|
|
7
|
+
data.tar.gz: 3c051e911034f36d1b546644f6321dbcb05155cb1204ce3e85abb2384953b2247ac34e6e8eb5114714b8afd3d5647c4261d0d9ffb1867a8b986e040f0cf86fe5
|
data/Gemfile.lock
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
riagent (0.0.
|
|
4
|
+
riagent (0.0.3)
|
|
5
5
|
activemodel (~> 4.0)
|
|
6
6
|
activesupport (~> 4.0)
|
|
7
|
-
riagent-document
|
|
8
|
-
riak-client (~> 2.
|
|
9
|
-
riak_json
|
|
7
|
+
riagent-document (= 0.0.1)
|
|
8
|
+
riak-client (~> 2.2.1)
|
|
10
9
|
|
|
11
10
|
GEM
|
|
12
11
|
remote: https://rubygems.org/
|
|
13
12
|
specs:
|
|
14
|
-
activemodel (4.0.
|
|
15
|
-
activesupport (= 4.0.
|
|
13
|
+
activemodel (4.0.13)
|
|
14
|
+
activesupport (= 4.0.13)
|
|
16
15
|
builder (~> 3.1.0)
|
|
17
|
-
activesupport (4.0.
|
|
16
|
+
activesupport (4.0.13)
|
|
18
17
|
i18n (~> 0.6, >= 0.6.9)
|
|
19
18
|
minitest (~> 4.2)
|
|
20
19
|
multi_json (~> 1.3)
|
|
@@ -24,44 +23,33 @@ GEM
|
|
|
24
23
|
descendants_tracker (~> 0.0.4)
|
|
25
24
|
ice_nine (~> 0.11.0)
|
|
26
25
|
thread_safe (~> 0.3, >= 0.3.1)
|
|
27
|
-
beefcake (1.
|
|
26
|
+
beefcake (1.1.0)
|
|
28
27
|
builder (3.1.4)
|
|
28
|
+
cert_validator (0.0.1)
|
|
29
29
|
coercible (1.0.0)
|
|
30
30
|
descendants_tracker (~> 0.0.1)
|
|
31
31
|
descendants_tracker (0.0.4)
|
|
32
32
|
thread_safe (~> 0.3, >= 0.3.1)
|
|
33
|
-
equalizer (0.0.
|
|
34
|
-
i18n (0.
|
|
35
|
-
ice_nine (0.11.
|
|
33
|
+
equalizer (0.0.11)
|
|
34
|
+
i18n (0.7.0)
|
|
35
|
+
ice_nine (0.11.1)
|
|
36
36
|
innertube (1.0.2)
|
|
37
|
-
json (1.8.1)
|
|
38
|
-
mime-types (2.3)
|
|
39
37
|
minitest (4.7.0)
|
|
40
38
|
minitest-spec-context (0.0.3)
|
|
41
|
-
multi_json (1.
|
|
42
|
-
netrc (0.7.7)
|
|
43
|
-
r509 (0.10.0)
|
|
44
|
-
r509-cert-validator (0.0.4)
|
|
45
|
-
r509 (~> 0.10.0)
|
|
39
|
+
multi_json (1.11.2)
|
|
46
40
|
rake (10.3.2)
|
|
47
|
-
rest-client (1.7.2)
|
|
48
|
-
mime-types (>= 1.16, < 3.0)
|
|
49
|
-
netrc (~> 0.7)
|
|
50
41
|
riagent-document (0.0.1)
|
|
51
42
|
activesupport (~> 4.0)
|
|
52
43
|
virtus
|
|
53
|
-
riak-client (2.
|
|
54
|
-
beefcake (
|
|
44
|
+
riak-client (2.2.1)
|
|
45
|
+
beefcake (~> 1.1)
|
|
46
|
+
cert_validator (~> 0.0.1)
|
|
55
47
|
i18n (>= 0.4.0)
|
|
56
48
|
innertube (~> 1.0.2)
|
|
57
49
|
multi_json (~> 1.0)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
rest-client
|
|
62
|
-
thread_safe (0.3.4)
|
|
63
|
-
tzinfo (0.3.41)
|
|
64
|
-
virtus (1.0.3)
|
|
50
|
+
thread_safe (0.3.5)
|
|
51
|
+
tzinfo (0.3.44)
|
|
52
|
+
virtus (1.0.5)
|
|
65
53
|
axiom-types (~> 0.1)
|
|
66
54
|
coercible (~> 1.0)
|
|
67
55
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
data/README.md
CHANGED
|
@@ -5,16 +5,11 @@ Object Document Mapper for [Riak](http://basho.com/products/riak-kv/)
|
|
|
5
5
|
Sinatra.
|
|
6
6
|
|
|
7
7
|
## Requirements
|
|
8
|
-
- Ruby
|
|
8
|
+
- Ruby 2+
|
|
9
9
|
- [Riak](http://basho.com/products/riak-kv/) version 2.0 or later
|
|
10
|
-
- [RiakJson](https://github.com/basho-labs/riak_json_ruby_client) Ruby Client
|
|
11
|
-
gem installed locally
|
|
12
|
-
- [riagent-document](https://github.com/dmitrizagidulin/riagent-document) gem
|
|
13
|
-
installed locally
|
|
14
10
|
|
|
15
11
|
## Motivation
|
|
16
12
|
*a.k.a. Why not just use a plain
|
|
17
|
-
[riak_json client](https://github.com/basho-labs/riak_json_ruby_client) or a
|
|
18
13
|
[riak-ruby-client](https://github.com/basho/riak-ruby-client)?*
|
|
19
14
|
|
|
20
15
|
A Riak client just answers the question "How do I store stuff in Riak?".
|
|
@@ -30,7 +25,7 @@ a developer must answer further questions:
|
|
|
30
25
|
|
|
31
26
|
Riagent attempts to provide answers to those questions, to encode recommended
|
|
32
27
|
best-practice Riak query patterns, and in general to aid rapid application
|
|
33
|
-
development by working with Riak's
|
|
28
|
+
development by working with Riak's strengths while respecting its limitations.
|
|
34
29
|
It is intended as a spiritual successor to
|
|
35
30
|
[Ripple](https://github.com/basho-labs/ripple).
|
|
36
31
|
|
|
@@ -69,16 +64,16 @@ Search/Solr integration?
|
|
|
69
64
|
Riagent provides a set of high-level notations and functionality that allows
|
|
70
65
|
developers create collections and associations on Riak, either via plain K/V
|
|
71
66
|
operations when possible, or via advanced mechanisms such as
|
|
72
|
-
Solr
|
|
67
|
+
Solr queries when necessary.
|
|
73
68
|
|
|
74
69
|
```ruby
|
|
75
70
|
class User
|
|
76
71
|
include Riagent::ActiveDocument
|
|
77
72
|
|
|
78
|
-
collection_type :
|
|
73
|
+
collection_type :riak_kv
|
|
79
74
|
|
|
80
|
-
attribute :username, String
|
|
81
|
-
attribute :email, String
|
|
75
|
+
attribute :username, String
|
|
76
|
+
attribute :email, String
|
|
82
77
|
attribute :language, String, default: 'en'
|
|
83
78
|
|
|
84
79
|
# Associations
|
|
@@ -104,8 +99,6 @@ Riagent and ActiveDocuments are integrated into the usual Rails workflow.
|
|
|
104
99
|
- Provides ```before_save``` / ```after_save``` type Callback functionality
|
|
105
100
|
- Provides a custom Query capability (to Riak/Solr), for searches, range
|
|
106
101
|
queries, aggregations and more
|
|
107
|
-
- Derives RiakJson/Solr search schemas from annotated document attributes (see
|
|
108
|
-
Schemas below)
|
|
109
102
|
|
|
110
103
|
## Usage
|
|
111
104
|
### Adding Riagent to a Rails App
|
|
@@ -182,70 +175,6 @@ ActiveDocument currently supports ```before_*``` and ```after_*``` [callbacks](h
|
|
|
182
175
|
for the following events:
|
|
183
176
|
```[:create, :update, :save, :destroy]```
|
|
184
177
|
|
|
185
|
-
### Search and Querying
|
|
186
|
-
See the Querying sections of [RJ Ruby Client](https://github.com/basho-labs/riak_json_ruby_client#querying-riakjson---find_one-and-find)
|
|
187
|
-
and [RiakJson itself](https://github.com/basho-labs/riak_json/blob/master/docs/query.md)
|
|
188
|
-
```ruby
|
|
189
|
-
# All matching instances
|
|
190
|
-
us_users = User.where({ country: 'USA' }) # => array of US user instances
|
|
191
|
-
# One instance (the first)
|
|
192
|
-
user = User.find_one({ username: 'HieronymusBosch' })
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Search Schema Definition
|
|
196
|
-
RiakJson uses Solr/Yokozuna to provide indexing and search capability for its
|
|
197
|
-
collections. If you do not specify a collection schema explicitly, RiakJson
|
|
198
|
-
creates one when you insert the first document to that collection (it [infers
|
|
199
|
-
the
|
|
200
|
-
schema](https://github.com/basho-labs/riak_json/blob/master/docs/architecture.md#inferred-schemas)
|
|
201
|
-
based on the basic data types of the field values in the JSON). However, if you
|
|
202
|
-
do not want to use this default schema behavior (for example, because RJ tries
|
|
203
|
-
to index all of the fields), you can define and set a collection schema
|
|
204
|
-
yourself, using RJ Ruby Client's [schema
|
|
205
|
-
administration](https://github.com/basho-labs/riak_json_ruby_client#schema-administration)
|
|
206
|
-
API.
|
|
207
|
-
|
|
208
|
-
To make the process of schema definition even easier for developers,
|
|
209
|
-
ActiveDocument provides the ```search_index``` attribute option. This annotation
|
|
210
|
-
allows you to specify which document fields you want added to your search
|
|
211
|
-
schema, as well as the Solr field type that will be used to index it.
|
|
212
|
-
|
|
213
|
-
For example, the following model:
|
|
214
|
-
```ruby
|
|
215
|
-
class User
|
|
216
|
-
include Riagent::ActiveDocument
|
|
217
|
-
|
|
218
|
-
attribute :username, String, required: true, search_index: { :as => :text }
|
|
219
|
-
attribute :email, String, search_index: { :as => :string }
|
|
220
|
-
attribute :country, String, default: 'USA'
|
|
221
|
-
end
|
|
222
|
-
```
|
|
223
|
-
will enable you to construct the following schema:
|
|
224
|
-
```ruby
|
|
225
|
-
User.schema # =>
|
|
226
|
-
# [{
|
|
227
|
-
# :name => "username",
|
|
228
|
-
# :type => "text",
|
|
229
|
-
# :require => true
|
|
230
|
-
# }, {
|
|
231
|
-
# :name => "email",
|
|
232
|
-
# :type => "string",
|
|
233
|
-
# :require => false
|
|
234
|
-
# }
|
|
235
|
-
# ]
|
|
236
|
-
# # Note that 'country' is not included in this schema, and so will not be indexed.
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Schema Administration
|
|
240
|
-
Note that if you use the ```search_index``` attribute annotations above, you
|
|
241
|
-
will have to explicitly notify RiakJson of your intent to save the schema. You
|
|
242
|
-
will have to call the ```set_schema()``` collection method before you start
|
|
243
|
-
inserting documents (for example, in a ```db:setup``` Rake task).
|
|
244
|
-
|
|
245
|
-
```ruby
|
|
246
|
-
User.collection.set_schema(User.schema)
|
|
247
|
-
```
|
|
248
|
-
|
|
249
178
|
## Testing the Riagent gem
|
|
250
179
|
First, set up the Riak config file for (and make sure it's pointing to a running
|
|
251
180
|
Riak instance)
|
|
@@ -25,7 +25,6 @@ require 'riagent/document'
|
|
|
25
25
|
require 'riagent/conversion'
|
|
26
26
|
require 'riagent/persistence'
|
|
27
27
|
require 'riagent/associations'
|
|
28
|
-
require 'riagent/search_schema'
|
|
29
28
|
|
|
30
29
|
module Riagent
|
|
31
30
|
module ActiveDocument
|
|
@@ -45,7 +44,7 @@ module Riagent
|
|
|
45
44
|
|
|
46
45
|
module ClassMethods
|
|
47
46
|
# Returns string representation for the collection name
|
|
48
|
-
# Used to determine the
|
|
47
|
+
# Used to determine the Riak Bucket name
|
|
49
48
|
# Uses ActiveModel::Naming functionality to derive the name
|
|
50
49
|
def collection_name
|
|
51
50
|
self.model_name.plural
|
data/lib/riagent/associations.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -37,7 +37,7 @@ module Riagent
|
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
# Create a has_many association where the collection will be loaded
|
|
40
|
-
# via
|
|
40
|
+
# via Solr queries.
|
|
41
41
|
def has_many_using_solr(name, target_class, query_type, options)
|
|
42
42
|
target_getter_method = "#{name}".to_sym
|
|
43
43
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
require "active_support/concern"
|
|
22
22
|
require "riak"
|
|
23
|
+
require "erb"
|
|
23
24
|
|
|
24
25
|
module Riagent
|
|
25
26
|
module Configuration
|
|
@@ -47,12 +48,6 @@ module Riagent
|
|
|
47
48
|
env_config
|
|
48
49
|
end
|
|
49
50
|
|
|
50
|
-
# @param [Hash] env_config Configuration hash for a given environment
|
|
51
|
-
def init_riak_json_client(env_config)
|
|
52
|
-
client = RiakJson::Client.new(env_config['host'], env_config['http_port'])
|
|
53
|
-
self.riak_json_client = client
|
|
54
|
-
end
|
|
55
|
-
|
|
56
51
|
# @param [Hash] env_config Configuration hash for a given environment
|
|
57
52
|
def init_riak_client(env_config)
|
|
58
53
|
# client = Riak::Client.new host: env_config['host'], pb_port: env_config['pb_port'], protocol: 'pbc'
|
|
@@ -67,7 +62,6 @@ module Riagent
|
|
|
67
62
|
# @param [Symbol] environment
|
|
68
63
|
def init_clients(environment=:development)
|
|
69
64
|
env_config = self.config_for(environment)
|
|
70
|
-
self.init_riak_json_client(env_config)
|
|
71
65
|
self.init_riak_client(env_config)
|
|
72
66
|
end
|
|
73
67
|
|
|
@@ -91,20 +85,5 @@ module Riagent
|
|
|
91
85
|
def riak_client=(value)
|
|
92
86
|
Thread.current[:riak_client] = value
|
|
93
87
|
end
|
|
94
|
-
|
|
95
|
-
# @return [RiakJson::Client] The RiakJson client for the current thread.
|
|
96
|
-
def riak_json_client
|
|
97
|
-
unless Thread.current[:riak_json_client]
|
|
98
|
-
# Re-initialize client
|
|
99
|
-
self.init_riak_json_client(self.config_for(Rails.env))
|
|
100
|
-
end
|
|
101
|
-
Thread.current[:riak_json_client]
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Sets the RiakJson client for the current thread.
|
|
105
|
-
# @param [RiakJson::Client] value the client
|
|
106
|
-
def riak_json_client=(value)
|
|
107
|
-
Thread.current[:riak_json_client] = value
|
|
108
|
-
end
|
|
109
88
|
end
|
|
110
89
|
end
|
data/lib/riagent/conversion.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -18,8 +18,6 @@
|
|
|
18
18
|
##
|
|
19
19
|
## -------------------------------------------------------------------
|
|
20
20
|
|
|
21
|
-
require "riak_json"
|
|
22
|
-
|
|
23
21
|
module Riagent
|
|
24
22
|
module Persistence
|
|
25
23
|
# Riagent document persistence strategy
|
|
@@ -64,7 +64,7 @@ module Riagent
|
|
|
64
64
|
|
|
65
65
|
# Insert a document into the collection.
|
|
66
66
|
# Also inserts the document's key into the key list set.
|
|
67
|
-
# @param [
|
|
67
|
+
# @param [Riagent::ActiveDocument] document Document to be inserted
|
|
68
68
|
# @return [String] Document key
|
|
69
69
|
def insert(document)
|
|
70
70
|
doc_key = super
|
|
@@ -74,7 +74,7 @@ module Riagent
|
|
|
74
74
|
active_doc_instance
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
# @param [
|
|
77
|
+
# @param [Riagent::ActiveDocument] document Document to be inserted
|
|
78
78
|
# @return [String] Document key
|
|
79
79
|
def insert(document)
|
|
80
80
|
if document.key.present?
|
|
@@ -98,13 +98,13 @@ module Riagent
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
# Deletes the riak object that stores the document
|
|
101
|
-
# @param [
|
|
101
|
+
# @param [Riagent::ActiveDocument] document Document to be deleted
|
|
102
102
|
def remove(document)
|
|
103
103
|
self.new_riak_object(document.key).delete
|
|
104
104
|
document.source_object = nil
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
-
# @param [
|
|
107
|
+
# @param [Riagent::ActiveDocument] document Document to be updated
|
|
108
108
|
# @return [Integer] Document key
|
|
109
109
|
def update(document)
|
|
110
110
|
self.insert(document)
|
data/lib/riagent/persistence.rb
CHANGED
|
@@ -21,20 +21,18 @@
|
|
|
21
21
|
require "active_support/concern"
|
|
22
22
|
require "riagent/persistence/persistence_strategy"
|
|
23
23
|
require "riagent/persistence/riak_dt_set_strategy"
|
|
24
|
-
require "riagent/persistence/riak_json_strategy"
|
|
25
24
|
require "riagent/persistence/riak_no_index_strategy"
|
|
26
25
|
|
|
27
26
|
module Riagent
|
|
28
|
-
# Provides a common persistence API for
|
|
27
|
+
# Provides a common persistence API for Riagent Documents.
|
|
29
28
|
# Most persistence calls are delegated to the Collection class instance,
|
|
30
29
|
# which are implemented in persistence/*_strategy.rb modules.
|
|
31
30
|
module Persistence
|
|
32
31
|
extend ActiveSupport::Concern
|
|
33
32
|
|
|
34
|
-
COLLECTION_TYPES = [:
|
|
33
|
+
COLLECTION_TYPES = [:riak_kv]
|
|
35
34
|
|
|
36
35
|
# Key Listing strategies for +:riak_kv+ collections
|
|
37
|
-
# (the :riak_json collection type uses an implied solr query strategy)
|
|
38
36
|
VALID_KEY_LISTS = [:streaming_list_keys, :riak_dt_set]
|
|
39
37
|
|
|
40
38
|
included do
|
|
@@ -113,7 +111,8 @@ module Riagent
|
|
|
113
111
|
# <code>
|
|
114
112
|
# class SomeModel
|
|
115
113
|
# include Riagent::ActiveDocument
|
|
116
|
-
# collection_type :
|
|
114
|
+
# collection_type :riak_kv, # Persist to a Riak::Bucket
|
|
115
|
+
# list_keys_using: :riak_dt_set #keep track of keys in a Set CRDT data type
|
|
117
116
|
# end
|
|
118
117
|
# </code>
|
|
119
118
|
def collection_type(coll_type, options={})
|
|
@@ -122,8 +121,6 @@ module Riagent
|
|
|
122
121
|
end
|
|
123
122
|
@collection_type = coll_type
|
|
124
123
|
case @collection_type
|
|
125
|
-
when :riak_json
|
|
126
|
-
self.persistence = Riagent::Persistence::RiakJsonStrategy.new(self)
|
|
127
124
|
when :riak_kv
|
|
128
125
|
self.persistence = Riagent::Persistence::RiakKVStrategy.new(self)
|
|
129
126
|
if options.has_key? :list_keys_using
|
data/lib/riagent/railtie.rb
CHANGED
data/lib/riagent/version.rb
CHANGED
data/riagent.gemspec
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
## -------------------------------------------------------------------
|
|
3
3
|
##
|
|
4
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
5
5
|
##
|
|
6
6
|
## This file is provided to you under the Apache License,
|
|
7
7
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -38,9 +38,8 @@ Gem::Specification.new do |spec|
|
|
|
38
38
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
39
39
|
spec.require_paths = ["lib"]
|
|
40
40
|
|
|
41
|
-
spec.add_runtime_dependency "
|
|
42
|
-
spec.add_runtime_dependency "
|
|
43
|
-
spec.add_runtime_dependency "riagent-document"
|
|
41
|
+
spec.add_runtime_dependency "riak-client", "~> 2.2"
|
|
42
|
+
spec.add_runtime_dependency "riagent-document", "0.0.1"
|
|
44
43
|
spec.add_runtime_dependency "activemodel", "~> 4.0"
|
|
45
44
|
spec.add_runtime_dependency "activesupport", "~> 4.0"
|
|
46
45
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Sample riak.yml config file for running integration tests
|
|
2
2
|
# Be sure to 'cp riak.yml.example riak.yml' before testing
|
|
3
3
|
|
|
4
|
-
# Configure Riak
|
|
4
|
+
# Configure Riak connections for the client, by environment
|
|
5
5
|
development:
|
|
6
6
|
http_port: 8098
|
|
7
7
|
pb_port: 8087 # Protocol Buffer port
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -26,7 +26,7 @@ require_relative 'contact'
|
|
|
26
26
|
class AddressBook
|
|
27
27
|
include Riagent::ActiveDocument
|
|
28
28
|
|
|
29
|
-
collection_type :
|
|
29
|
+
collection_type :riak_kv
|
|
30
30
|
|
|
31
31
|
attribute :contacts, Set[Contact]
|
|
32
32
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
class BlogPost
|
|
22
22
|
include Riagent::ActiveDocument
|
|
23
23
|
|
|
24
|
-
collection_type :
|
|
24
|
+
collection_type :riak_kv
|
|
25
25
|
|
|
26
26
|
# Explicit attributes
|
|
27
27
|
# key is an implied attribute, present in all ActiveDocument instances
|
|
28
|
-
attribute :title, String
|
|
29
|
-
attribute :description, String
|
|
30
|
-
attribute :body, String
|
|
28
|
+
attribute :title, String
|
|
29
|
+
attribute :description, String
|
|
30
|
+
attribute :body, String
|
|
31
31
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -24,12 +24,12 @@ require_relative 'blog_post'
|
|
|
24
24
|
class User
|
|
25
25
|
include Riagent::ActiveDocument
|
|
26
26
|
|
|
27
|
-
collection_type :
|
|
27
|
+
collection_type :riak_kv
|
|
28
28
|
|
|
29
29
|
# Explicit attributes
|
|
30
30
|
# key is an implied attribute, present in all ActiveDocument instances
|
|
31
|
-
attribute :username, String
|
|
32
|
-
attribute :email, String,
|
|
31
|
+
attribute :username, String
|
|
32
|
+
attribute :email, String, default: ''
|
|
33
33
|
attribute :language, String, default: 'en'
|
|
34
34
|
|
|
35
35
|
# Associations
|
data/test/test_helper.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## -------------------------------------------------------------------
|
|
2
2
|
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
3
|
+
## Copyright (c) "2014-2015" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
4
|
##
|
|
5
5
|
## This file is provided to you under the Apache License,
|
|
6
6
|
## Version 2.0 (the "License"); you may not use this file
|
|
@@ -22,6 +22,7 @@ require 'minitest/autorun'
|
|
|
22
22
|
require 'minitest-spec-context'
|
|
23
23
|
require 'riagent'
|
|
24
24
|
require 'examples/models/address_book'
|
|
25
|
+
require 'examples/models/blog_post'
|
|
25
26
|
require 'examples/models/category'
|
|
26
27
|
require 'examples/models/contact'
|
|
27
28
|
require 'examples/models/user'
|
data/test/unit/config_test.rb
CHANGED
|
@@ -26,17 +26,10 @@ describe "Riagent" do
|
|
|
26
26
|
Riagent.config.wont_be_empty # The config file was initialized by test_helper.rb
|
|
27
27
|
Riagent.must_respond_to :load_config_file
|
|
28
28
|
Riagent.must_respond_to :init_clients
|
|
29
|
-
Riagent.must_respond_to :init_riak_json_client
|
|
30
|
-
Riagent.must_respond_to :riak_json_client
|
|
31
29
|
Riagent.must_respond_to :init_riak_client
|
|
32
30
|
Riagent.must_respond_to :riak_client
|
|
33
31
|
end
|
|
34
32
|
|
|
35
|
-
it "initializes a RiakJson client" do
|
|
36
|
-
# This should have been initialized from config file in test_helper.rb
|
|
37
|
-
Riagent.riak_json_client.must_be_kind_of RiakJson::Client
|
|
38
|
-
end
|
|
39
|
-
|
|
40
33
|
it "initializes a Riak ruby client" do
|
|
41
34
|
# This should have been initialized from config file in test_helper.rb
|
|
42
35
|
Riagent.riak_client.must_be_kind_of Riak::Client
|
|
@@ -25,29 +25,13 @@ describe "a Riagent::ActiveDocument has Persistence options" do
|
|
|
25
25
|
lambda { User.collection_type :invalid }.must_raise ArgumentError
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
it "#:riak_json collection_type" do
|
|
29
|
-
# Adding the line +collection_type :riak_json+ to a model
|
|
30
|
-
# means that it will be persisted to a RiakJson::Collection
|
|
31
|
-
User.get_collection_type.must_equal :riak_json
|
|
32
|
-
User.persistence.must_be_kind_of Riagent::Persistence::RiakJsonStrategy
|
|
33
|
-
|
|
34
|
-
# It also grants access to a RiakJson::Client instance, to the model class
|
|
35
|
-
User.persistence.client.must_be_kind_of RiakJson::Client
|
|
36
|
-
|
|
37
|
-
User.persistence.collection.must_be_kind_of RiakJson::Collection
|
|
38
|
-
User.persistence.collection_name.must_equal 'users'
|
|
39
|
-
|
|
40
|
-
# Check to see if the RiakJson persistence strategy supports querying
|
|
41
|
-
assert User.persistence.allows_query?
|
|
42
|
-
end
|
|
43
|
-
|
|
44
28
|
it "#:riak_kv collection type" do
|
|
45
29
|
# Adding the line +collection_type :riak_kv+ to a model
|
|
46
30
|
# means that it will be persisted as a Riak object with no indices (k/v operations only)
|
|
47
31
|
UserPreference.get_collection_type.must_equal :riak_kv
|
|
48
32
|
UserPreference.persistence.class.must_equal Riagent::Persistence::RiakKVStrategy
|
|
49
33
|
|
|
50
|
-
# It also grants access to a
|
|
34
|
+
# It also grants access to a Riak::Client instance, to the model class
|
|
51
35
|
UserPreference.persistence.client.must_be_kind_of Riak::Client
|
|
52
36
|
|
|
53
37
|
UserPreference.persistence.collection_name.must_equal 'user_preferences'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: riagent
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dmitri Zagidulin
|
|
@@ -10,48 +10,34 @@ bindir: bin
|
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2015-08-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: riak_json
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: riak-client
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
30
16
|
requirements:
|
|
31
17
|
- - "~>"
|
|
32
18
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 2.
|
|
19
|
+
version: '2.2'
|
|
34
20
|
type: :runtime
|
|
35
21
|
prerelease: false
|
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
23
|
requirements:
|
|
38
24
|
- - "~>"
|
|
39
25
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 2.
|
|
26
|
+
version: '2.2'
|
|
41
27
|
- !ruby/object:Gem::Dependency
|
|
42
28
|
name: riagent-document
|
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
|
44
30
|
requirements:
|
|
45
|
-
- -
|
|
31
|
+
- - '='
|
|
46
32
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
33
|
+
version: 0.0.1
|
|
48
34
|
type: :runtime
|
|
49
35
|
prerelease: false
|
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
37
|
requirements:
|
|
52
|
-
- -
|
|
38
|
+
- - '='
|
|
53
39
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
40
|
+
version: 0.0.1
|
|
55
41
|
- !ruby/object:Gem::Dependency
|
|
56
42
|
name: activemodel
|
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -161,11 +147,9 @@ files:
|
|
|
161
147
|
- lib/riagent/persistence.rb
|
|
162
148
|
- lib/riagent/persistence/persistence_strategy.rb
|
|
163
149
|
- lib/riagent/persistence/riak_dt_set_strategy.rb
|
|
164
|
-
- lib/riagent/persistence/riak_json_strategy.rb
|
|
165
150
|
- lib/riagent/persistence/riak_kv_strategy.rb
|
|
166
151
|
- lib/riagent/persistence/riak_no_index_strategy.rb
|
|
167
152
|
- lib/riagent/railtie.rb
|
|
168
|
-
- lib/riagent/search_schema.rb
|
|
169
153
|
- lib/riagent/version.rb
|
|
170
154
|
- riagent.gemspec
|
|
171
155
|
- test/config/riak.yml.example
|
|
@@ -176,7 +160,6 @@ files:
|
|
|
176
160
|
- test/examples/models/user.rb
|
|
177
161
|
- test/examples/models/user_preference.rb
|
|
178
162
|
- test/integration/persistence_riak_dt_set_integration_test.rb
|
|
179
|
-
- test/integration/persistence_riak_json_integration_test.rb
|
|
180
163
|
- test/integration/persistence_riak_kv_integration_test.rb
|
|
181
164
|
- test/seeds.rb
|
|
182
165
|
- test/test_helper.rb
|
|
@@ -187,11 +170,9 @@ files:
|
|
|
187
170
|
- test/unit/config_test.rb
|
|
188
171
|
- test/unit/embedded_test.rb
|
|
189
172
|
- test/unit/persistence_riak_dt_set_test.rb
|
|
190
|
-
- test/unit/persistence_riak_json_test.rb
|
|
191
173
|
- test/unit/persistence_riak_kv_test.rb
|
|
192
174
|
- test/unit/persistence_riak_no_index_test.rb
|
|
193
175
|
- test/unit/persistence_test.rb
|
|
194
|
-
- test/unit/search_schema_test.rb
|
|
195
176
|
- test/unit/validation_test.rb
|
|
196
177
|
homepage: https://github.com/dmitrizagidulin/riagent
|
|
197
178
|
licenses:
|
|
@@ -226,7 +207,6 @@ test_files:
|
|
|
226
207
|
- test/examples/models/user.rb
|
|
227
208
|
- test/examples/models/user_preference.rb
|
|
228
209
|
- test/integration/persistence_riak_dt_set_integration_test.rb
|
|
229
|
-
- test/integration/persistence_riak_json_integration_test.rb
|
|
230
210
|
- test/integration/persistence_riak_kv_integration_test.rb
|
|
231
211
|
- test/seeds.rb
|
|
232
212
|
- test/test_helper.rb
|
|
@@ -237,9 +217,7 @@ test_files:
|
|
|
237
217
|
- test/unit/config_test.rb
|
|
238
218
|
- test/unit/embedded_test.rb
|
|
239
219
|
- test/unit/persistence_riak_dt_set_test.rb
|
|
240
|
-
- test/unit/persistence_riak_json_test.rb
|
|
241
220
|
- test/unit/persistence_riak_kv_test.rb
|
|
242
221
|
- test/unit/persistence_riak_no_index_test.rb
|
|
243
222
|
- test/unit/persistence_test.rb
|
|
244
|
-
- test/unit/search_schema_test.rb
|
|
245
223
|
- test/unit/validation_test.rb
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
## -------------------------------------------------------------------
|
|
2
|
-
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
|
-
##
|
|
5
|
-
## This file is provided to you under the Apache License,
|
|
6
|
-
## Version 2.0 (the "License"); you may not use this file
|
|
7
|
-
## except in compliance with the License. You may obtain
|
|
8
|
-
## a copy of the License at
|
|
9
|
-
##
|
|
10
|
-
## http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
##
|
|
12
|
-
## Unless required by applicable law or agreed to in writing,
|
|
13
|
-
## software distributed under the License is distributed on an
|
|
14
|
-
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
15
|
-
## KIND, either express or implied. See the License for the
|
|
16
|
-
## specific language governing permissions and limitations
|
|
17
|
-
## under the License.
|
|
18
|
-
##
|
|
19
|
-
## -------------------------------------------------------------------
|
|
20
|
-
|
|
21
|
-
require "riak_json"
|
|
22
|
-
require "riagent/persistence/persistence_strategy"
|
|
23
|
-
|
|
24
|
-
module Riagent
|
|
25
|
-
module Persistence
|
|
26
|
-
class RiakJsonStrategy < PersistenceStrategy
|
|
27
|
-
attr_writer :collection
|
|
28
|
-
|
|
29
|
-
# Return all the documents in the collection
|
|
30
|
-
# @param [Integer] results_limit Number of results returned
|
|
31
|
-
# @return [Array|nil] of ActiveDocument instances
|
|
32
|
-
def all(results_limit=1000)
|
|
33
|
-
result = self.collection.all(results_limit)
|
|
34
|
-
if result.present?
|
|
35
|
-
result.documents.map do |doc|
|
|
36
|
-
self.from_rj_document(doc, persisted=true)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# @return [Boolean] Does this persistence strategy support querying?
|
|
42
|
-
def allows_query?
|
|
43
|
-
true
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# @return [RiakJson::Client] RiakJson client for this persistence strategy (lazy initialize)
|
|
47
|
-
def client
|
|
48
|
-
@client ||= Riagent.riak_json_client # See lib/configuration.rb
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @return [RiakJson::Collection] instance for this persistence strategy (lazy initialize)
|
|
52
|
-
def collection
|
|
53
|
-
@collection ||= self.client.collection(self.collection_name)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Fetch a document by key.
|
|
57
|
-
# @param [String] key
|
|
58
|
-
# @return [ActiveDocument|nil]
|
|
59
|
-
def find(key)
|
|
60
|
-
return nil if key.nil? or key.empty?
|
|
61
|
-
doc = self.collection.find_by_key(key)
|
|
62
|
-
self.from_rj_document(doc, persisted=true)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Return the first document that matches the query
|
|
66
|
-
# @param [String] query RiakJson query, in JSON string form
|
|
67
|
-
def find_one(query)
|
|
68
|
-
if query.kind_of? Hash
|
|
69
|
-
query = query.to_json
|
|
70
|
-
end
|
|
71
|
-
doc = self.collection.find_one(query)
|
|
72
|
-
if doc.present?
|
|
73
|
-
self.from_rj_document(doc, persisted=true)
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Converts from a RiakJson::Document instance to an instance of ActiveDocument
|
|
78
|
-
# @return [ActiveDocument|nil] ActiveDocument instance, or nil if the Document is nil
|
|
79
|
-
def from_rj_document(doc, persisted=false)
|
|
80
|
-
return nil if doc.nil?
|
|
81
|
-
active_doc_instance = self.model_class.instantiate(doc.attributes)
|
|
82
|
-
active_doc_instance.key = doc.key
|
|
83
|
-
if persisted
|
|
84
|
-
active_doc_instance.persist! # Mark as persisted / not new
|
|
85
|
-
end
|
|
86
|
-
active_doc_instance
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# @param [RiakJson::ActiveDocument] doc Document to be inserted
|
|
90
|
-
# @return [Integer] Document key
|
|
91
|
-
def insert(doc)
|
|
92
|
-
self.collection.insert(doc)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# @param [RiakJson::ActiveDocument] doc Document to be deleted
|
|
96
|
-
def remove(doc)
|
|
97
|
-
self.collection.remove(doc)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# @param [RiakJson::ActiveDocument] doc Document to be updated
|
|
101
|
-
# @return [Integer] Document key
|
|
102
|
-
def update(doc)
|
|
103
|
-
self.collection.update(doc)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Return all documents that match the query
|
|
107
|
-
# @param [String] query RiakJson query, in JSON string form
|
|
108
|
-
def where(query)
|
|
109
|
-
if query.kind_of? Hash
|
|
110
|
-
query = query.to_json
|
|
111
|
-
end
|
|
112
|
-
result = self.collection.find_all(query)
|
|
113
|
-
if result.present?
|
|
114
|
-
result.documents.map do |doc|
|
|
115
|
-
self.from_rj_document(doc, persisted=true)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
## -------------------------------------------------------------------
|
|
2
|
-
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
|
-
##
|
|
5
|
-
## This file is provided to you under the Apache License,
|
|
6
|
-
## Version 2.0 (the "License"); you may not use this file
|
|
7
|
-
## except in compliance with the License. You may obtain
|
|
8
|
-
## a copy of the License at
|
|
9
|
-
##
|
|
10
|
-
## http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
##
|
|
12
|
-
## Unless required by applicable law or agreed to in writing,
|
|
13
|
-
## software distributed under the License is distributed on an
|
|
14
|
-
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
15
|
-
## KIND, either express or implied. See the License for the
|
|
16
|
-
## specific language governing permissions and limitations
|
|
17
|
-
## under the License.
|
|
18
|
-
##
|
|
19
|
-
## -------------------------------------------------------------------
|
|
20
|
-
|
|
21
|
-
module Riagent
|
|
22
|
-
# Generates RiakJson::CollectionSchema objects (translated into Solr schemas by RiakJson)
|
|
23
|
-
# from annotated document attributes.
|
|
24
|
-
# Usage:
|
|
25
|
-
# <code>
|
|
26
|
-
# class SampleModel
|
|
27
|
-
# include Riagent::ActiveDocument
|
|
28
|
-
# collection_type :riak_json
|
|
29
|
-
# attribute :name, required: true, search_index: { as: :text }
|
|
30
|
-
# end
|
|
31
|
-
# puts SampleModel.schema.inspect
|
|
32
|
-
# # => <RiakJson::CollectionSchema:0x000001050eef10 @fields=[{:name=>"name", :type=>"text", :require=>true}]>
|
|
33
|
-
#
|
|
34
|
-
# SampleModel.save_solr_schema() # sets that schema for the collection
|
|
35
|
-
# </code>
|
|
36
|
-
module SearchSchema
|
|
37
|
-
# Returns a CollectionSchema instance, derived from the document attributes
|
|
38
|
-
def schema
|
|
39
|
-
schema = RiakJson::CollectionSchema.new
|
|
40
|
-
self.attribute_set.each do | attribute |
|
|
41
|
-
if attribute.options.include? :search_index
|
|
42
|
-
field_type = attribute.options[:search_index][:as]
|
|
43
|
-
schema.add_field(field_type, attribute.options[:name], attribute.options[:required])
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
schema
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Saves the generated Solr indexing schema to RiakJson.
|
|
50
|
-
# Usage:
|
|
51
|
-
# <code>
|
|
52
|
-
# SampleModel.save_solr_schema()
|
|
53
|
-
# </code>
|
|
54
|
-
def save_solr_schema
|
|
55
|
-
self.persistence.collection.set_schema(self.schema)
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
## -------------------------------------------------------------------
|
|
2
|
-
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
|
-
##
|
|
5
|
-
## This file is provided to you under the Apache License,
|
|
6
|
-
## Version 2.0 (the "License"); you may not use this file
|
|
7
|
-
## except in compliance with the License. You may obtain
|
|
8
|
-
## a copy of the License at
|
|
9
|
-
##
|
|
10
|
-
## http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
##
|
|
12
|
-
## Unless required by applicable law or agreed to in writing,
|
|
13
|
-
## software distributed under the License is distributed on an
|
|
14
|
-
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
15
|
-
## KIND, either express or implied. See the License for the
|
|
16
|
-
## specific language governing permissions and limitations
|
|
17
|
-
## under the License.
|
|
18
|
-
##
|
|
19
|
-
## -------------------------------------------------------------------
|
|
20
|
-
|
|
21
|
-
require 'test_helper'
|
|
22
|
-
|
|
23
|
-
TEST_USERNAME = 'earl'
|
|
24
|
-
TEST_USERNAME_2 = 'count'
|
|
25
|
-
|
|
26
|
-
def test_user(test_key='earl-123')
|
|
27
|
-
user = User.new username: TEST_USERNAME, email: 'earl@desandwich.com'
|
|
28
|
-
user.key = test_key
|
|
29
|
-
user
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
describe "a Riagent::ActiveDocument's Persistence Layer" do
|
|
33
|
-
it "can save a document and generate a key" do
|
|
34
|
-
user = User.new username: TEST_USERNAME
|
|
35
|
-
generated_key = user.save
|
|
36
|
-
|
|
37
|
-
generated_key.wont_be_nil "Key not generated from document.save"
|
|
38
|
-
generated_key.wont_be_empty "Key not generated from document.save"
|
|
39
|
-
generated_key.must_be_kind_of String
|
|
40
|
-
user.key.must_equal generated_key
|
|
41
|
-
|
|
42
|
-
refute user.new_record?, "Document should not be marked as new after saving"
|
|
43
|
-
assert user.persisted?, "Document should be marked as persisted after saving"
|
|
44
|
-
|
|
45
|
-
# Clean up
|
|
46
|
-
user.destroy
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it "can read, update and delete a document" do
|
|
50
|
-
test_key = 'george-123'
|
|
51
|
-
new_user = User.new username: 'george', email: 'george@washington.com'
|
|
52
|
-
new_user.key = test_key
|
|
53
|
-
new_user.save
|
|
54
|
-
|
|
55
|
-
found_user = User.find(test_key) # Load User by key
|
|
56
|
-
found_user.must_be_kind_of User
|
|
57
|
-
found_user.key.must_equal test_key
|
|
58
|
-
refute found_user.new_record?, "A loaded by key user object is not new"
|
|
59
|
-
assert found_user.persisted?, "A loaded by key user object should be markes as persisted"
|
|
60
|
-
|
|
61
|
-
new_attributes = {username: 'henry', email: 'henry@gmail.com' }
|
|
62
|
-
found_user.update(new_attributes) # Also saves
|
|
63
|
-
|
|
64
|
-
updated_user = User.find(test_key)
|
|
65
|
-
updated_user.username.must_equal 'henry'
|
|
66
|
-
|
|
67
|
-
found_user.destroy
|
|
68
|
-
assert found_user.destroyed?
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "returns an empty array for queries that return no results" do
|
|
72
|
-
query = { username: 'nonexistent' }
|
|
73
|
-
result = User.where(query)
|
|
74
|
-
result.must_be_empty
|
|
75
|
-
end
|
|
76
|
-
end
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
## -------------------------------------------------------------------
|
|
2
|
-
##
|
|
3
|
-
## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
|
|
4
|
-
##
|
|
5
|
-
## This file is provided to you under the Apache License,
|
|
6
|
-
## Version 2.0 (the "License"); you may not use this file
|
|
7
|
-
## except in compliance with the License. You may obtain
|
|
8
|
-
## a copy of the License at
|
|
9
|
-
##
|
|
10
|
-
## http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
##
|
|
12
|
-
## Unless required by applicable law or agreed to in writing,
|
|
13
|
-
## software distributed under the License is distributed on an
|
|
14
|
-
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
15
|
-
## KIND, either express or implied. See the License for the
|
|
16
|
-
## specific language governing permissions and limitations
|
|
17
|
-
## under the License.
|
|
18
|
-
##
|
|
19
|
-
## -------------------------------------------------------------------
|
|
20
|
-
|
|
21
|
-
require 'test_helper'
|
|
22
|
-
|
|
23
|
-
describe "a Riagent::ActiveDocument that persists to RiakJson" do
|
|
24
|
-
it "#model persistence instance methods" do
|
|
25
|
-
user = User.new
|
|
26
|
-
|
|
27
|
-
# Adding the line +collection_type :riak_json+ to a model
|
|
28
|
-
# exposes the usual array of persistence methods
|
|
29
|
-
user.must_respond_to :save
|
|
30
|
-
user.must_respond_to :save!
|
|
31
|
-
user.must_respond_to :update
|
|
32
|
-
user.must_respond_to :update_attributes # alias for update()
|
|
33
|
-
user.must_respond_to :update!
|
|
34
|
-
user.must_respond_to :destroy
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "#model persistence class methods" do
|
|
38
|
-
User.must_respond_to :all
|
|
39
|
-
User.must_respond_to :find
|
|
40
|
-
User.must_respond_to :find_one
|
|
41
|
-
User.must_respond_to :where
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "saves via collection.insert()" do
|
|
45
|
-
user = User.new
|
|
46
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
47
|
-
User.persistence.collection.expect :insert, nil, [user]
|
|
48
|
-
|
|
49
|
-
# Calling model.save() should result in a collection.insert() call
|
|
50
|
-
user.save({:validate => false})
|
|
51
|
-
User.persistence.collection.verify
|
|
52
|
-
|
|
53
|
-
# Reset
|
|
54
|
-
User.persistence.collection = nil
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "updates via collection.update()" do
|
|
58
|
-
user = User.new username: 'TestUserInitial'
|
|
59
|
-
user.persist! # Updates only make sense for a persisted document
|
|
60
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
61
|
-
User.persistence.collection.expect :update, nil, [user]
|
|
62
|
-
|
|
63
|
-
# model.update() is implemented as a save() call (with updated attributes)
|
|
64
|
-
user.update({ username: 'TestUserNewName'} )
|
|
65
|
-
User.persistence.collection.verify
|
|
66
|
-
|
|
67
|
-
# Reset
|
|
68
|
-
User.persistence.collection = nil
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "destroys via collection.remove()" do
|
|
72
|
-
user = User.new
|
|
73
|
-
user.key = 'user123'
|
|
74
|
-
user.persist! # Remove can only be called on persisted objects that have a key
|
|
75
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
76
|
-
User.persistence.collection.expect :remove, nil, [user]
|
|
77
|
-
|
|
78
|
-
# Calling model.destroy() should result in a collection.remove() call
|
|
79
|
-
user.destroy
|
|
80
|
-
User.persistence.collection.verify
|
|
81
|
-
|
|
82
|
-
# Reset
|
|
83
|
-
User.persistence.collection = nil
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "returns nil when doing a find() for nil or empty key" do
|
|
87
|
-
User.find(nil).must_be_nil
|
|
88
|
-
User.find('').must_be_nil
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "performs a find() via collection.find_by_key()" do
|
|
92
|
-
test_key = 'user123'
|
|
93
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
94
|
-
User.persistence.collection.expect :find_by_key, nil, [test_key]
|
|
95
|
-
|
|
96
|
-
# Calling Model class find() should result in a collection.find_by_key()
|
|
97
|
-
User.find(test_key)
|
|
98
|
-
User.persistence.collection.verify
|
|
99
|
-
|
|
100
|
-
# Reset
|
|
101
|
-
User.persistence.collection = nil
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "performs an all() listing via collection.all()" do
|
|
105
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
106
|
-
User.persistence.collection.expect :all, [], [1000] # default results limit of 1000
|
|
107
|
-
|
|
108
|
-
# Calling Model class where() should result in a collection.all()
|
|
109
|
-
User.all()
|
|
110
|
-
User.persistence.collection.verify
|
|
111
|
-
|
|
112
|
-
# Reset
|
|
113
|
-
User.persistence.collection = nil
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "performs a where() via collection.find_all()" do
|
|
117
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
118
|
-
query = { country: 'USA' }
|
|
119
|
-
User.persistence.collection.expect :find_all, [], [query.to_json]
|
|
120
|
-
|
|
121
|
-
# Calling Model class where() should result in a collection.find_all()
|
|
122
|
-
User.where(query)
|
|
123
|
-
User.persistence.collection.verify
|
|
124
|
-
|
|
125
|
-
# Reset
|
|
126
|
-
User.persistence.collection = nil
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
it "performs a find_one() via collection.find_one()" do
|
|
130
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
131
|
-
query = { username: 'TestUser' }
|
|
132
|
-
User.persistence.collection.expect :find_one, [], [query.to_json]
|
|
133
|
-
|
|
134
|
-
# Calling Model class find_one() should result in a collection.find_one()
|
|
135
|
-
User.find_one(query)
|
|
136
|
-
User.persistence.collection.verify
|
|
137
|
-
|
|
138
|
-
# Reset
|
|
139
|
-
User.persistence.collection = nil
|
|
140
|
-
end
|
|
141
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
describe "an Active Document" do
|
|
4
|
-
it "can build a RiakJson schema from the annotated attributes" do
|
|
5
|
-
schema = User.schema
|
|
6
|
-
schema.must_be_kind_of RiakJson::CollectionSchema
|
|
7
|
-
schema.fields.wont_be_empty
|
|
8
|
-
schema.fields.count.must_equal 2
|
|
9
|
-
schema.fields[0][:name].to_s.must_equal 'username'
|
|
10
|
-
schema.fields[0][:type].must_equal 'text'
|
|
11
|
-
schema.fields[0][:require].must_equal true
|
|
12
|
-
schema.fields[1][:name].to_s.must_equal 'email'
|
|
13
|
-
schema.fields[1][:type].must_equal 'string'
|
|
14
|
-
schema.fields[1][:require].must_equal true
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "can save the Solr indexing schema to RiakJson" do
|
|
18
|
-
schema = User.schema
|
|
19
|
-
User.persistence.collection = MiniTest::Mock.new
|
|
20
|
-
|
|
21
|
-
# Ensure that calling User.save_solr_schema() results in a call to collection.set_schema()
|
|
22
|
-
User.persistence.collection.expect :set_schema, nil, [RiakJson::CollectionSchema]
|
|
23
|
-
User.save_solr_schema
|
|
24
|
-
User.persistence.collection.verify
|
|
25
|
-
|
|
26
|
-
# Reset
|
|
27
|
-
User.persistence.collection = nil
|
|
28
|
-
end
|
|
29
|
-
end
|