riagent 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|