riak_json 0.0.2
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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +24 -0
- data/LICENSE +16 -0
- data/README.md +178 -0
- data/Rakefile +40 -0
- data/lib/riak_json/client.rb +139 -0
- data/lib/riak_json/client_transport.rb +48 -0
- data/lib/riak_json/collection.rb +107 -0
- data/lib/riak_json/collection_schema.rb +61 -0
- data/lib/riak_json/document.rb +54 -0
- data/lib/riak_json/errors.rb +25 -0
- data/lib/riak_json/query.rb +34 -0
- data/lib/riak_json/query_result.rb +50 -0
- data/lib/riak_json/version.rb +23 -0
- data/lib/riak_json.rb +34 -0
- data/riak_json.gemspec +51 -0
- data/test/examples/riak.yml +13 -0
- data/test/helper.rb +31 -0
- data/test/integration/client_integration_test.rb +51 -0
- data/test/integration/collection_integration_test.rb +227 -0
- data/test/unit/client_test.rb +163 -0
- data/test/unit/client_transport_test.rb +27 -0
- data/test/unit/collection_schema_test.rb +111 -0
- data/test/unit/collection_test.rb +281 -0
- data/test/unit/document_test.rb +67 -0
- data/test/unit/query_test.rb +30 -0
- metadata +209 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f4829b641aa58acf10a0b5f6b8bb465a2dda3ae7
|
4
|
+
data.tar.gz: bfe725495387a621908a165cac547cfc282bd0e2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 82ff9f6dc5beba9b516ec396c0ab1fb12604f3ad922d45d09db5c426016654c692b14197f7411748ef27e542570460905ed8fe34400ae4672c7fc5044a0f32b0
|
7
|
+
data.tar.gz: c17cd830fc7dc717b138f0621016afecfbc8e2eebeb22956163f1be4b79b9797c4cf24e8a259f1782b0b6da5026b77553de045a2a5517253817ba809cb2fddc7
|
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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
|
+
source 'https://rubygems.org'
|
22
|
+
|
23
|
+
# Specify your gem's dependencies in riak_json.gemspec
|
24
|
+
gemspec
|
data/LICENSE
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Copyright 2013 Basho Technologies, Inc.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
|
15
|
+
All of the files in this project are under the project-wide license
|
16
|
+
unless they are otherwise marked.
|
data/README.md
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
# Riak Json Ruby Client
|
2
|
+
|
3
|
+
A Ruby client for [Riak Json](https://github.com/basho-labs/riak_json/).
|
4
|
+
For ActiveModel integration for RiakJson, see [riak_json-active_model](https://github.com/dmitrizagidulin/rj-activemodel) gem.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
Since this gem is not released to the public yet, build it locally:
|
8
|
+
|
9
|
+
```bash
|
10
|
+
git clone git@github.com:basho/riak_json_ruby_client.git
|
11
|
+
cd riak_json_ruby_client
|
12
|
+
rake build
|
13
|
+
gem install pkg/riak_json-0.0.2.gem
|
14
|
+
```
|
15
|
+
## Unit Testing
|
16
|
+
Use bundler to install dev dependencies:
|
17
|
+
```
|
18
|
+
bundle install
|
19
|
+
```
|
20
|
+
To run both unit and integration tests:
|
21
|
+
```
|
22
|
+
bundle exec rake test
|
23
|
+
```
|
24
|
+
Note: By default, integration tests assume that Riak is listening on ```127.0.0.1:8098```
|
25
|
+
(the result of ```make rel```).
|
26
|
+
|
27
|
+
To specify alternate host and port, use the ```RIAK_HOST``` and ```RIAK_PORT``` env variables:
|
28
|
+
```
|
29
|
+
RIAK_HOST=127.0.0.1 RIAK_PORT=10018 bundle exec rake
|
30
|
+
```
|
31
|
+
To run just the unit tests:
|
32
|
+
```
|
33
|
+
bundle exec rake unittest
|
34
|
+
```
|
35
|
+
To run just the integration tests:
|
36
|
+
```
|
37
|
+
bundle exec rake itest
|
38
|
+
```
|
39
|
+
## Usage
|
40
|
+
### Loading the Client Config File
|
41
|
+
```ruby
|
42
|
+
require 'riak_json'
|
43
|
+
|
44
|
+
config_file = 'test/examples/riak.yml' # Loads in a config hash, by environment
|
45
|
+
dev_config = config_file['development']
|
46
|
+
client = RiakJson::Client.new(host=dev_config['host'], port=dev_config['http_port'])
|
47
|
+
```
|
48
|
+
|
49
|
+
### Creating / Referencing a Collection
|
50
|
+
```ruby
|
51
|
+
require 'riak_json'
|
52
|
+
|
53
|
+
client = RiakJson::Client.new('localhost', 8098)
|
54
|
+
# A new or existing collection
|
55
|
+
collection = client.collection("cities")
|
56
|
+
```
|
57
|
+
|
58
|
+
### Schema Administration
|
59
|
+
```ruby
|
60
|
+
# You may set an optional schema
|
61
|
+
# (or skip this step and go straight to inserting documents)
|
62
|
+
# Supported field types:
|
63
|
+
# - string (no spaces, think of a url slug)
|
64
|
+
# - text (spaces allowed)
|
65
|
+
# - multi_string (an array of strings, no spaces)
|
66
|
+
# - integer
|
67
|
+
schema = RiakJson::CollectionSchema.new
|
68
|
+
schema.add_text_field(name='city', required=true)
|
69
|
+
schema.add_string_field('state', true)
|
70
|
+
schema.add_multi_string_field('zip_codes') # required: false
|
71
|
+
schema.add_integer_field('population', false)
|
72
|
+
schema.add_string_field('country', true)
|
73
|
+
|
74
|
+
# Store the schema
|
75
|
+
collection.set_schema(schema)
|
76
|
+
|
77
|
+
# Check to see if schema is present
|
78
|
+
collection.has_schema? # => true
|
79
|
+
|
80
|
+
# Read a stored schema for a collection
|
81
|
+
schema_result = collection.get_schema()
|
82
|
+
# [{
|
83
|
+
# :name => "city",
|
84
|
+
# :type => "text",
|
85
|
+
# :require => true
|
86
|
+
# }, {
|
87
|
+
# :name => "state",
|
88
|
+
# :type => "string",
|
89
|
+
# :require => true
|
90
|
+
# }, {
|
91
|
+
# :name => "zip_codes",
|
92
|
+
# :type => "multi_string",
|
93
|
+
# :require => false
|
94
|
+
# }, {
|
95
|
+
# :name => "population",
|
96
|
+
# :type => "integer",
|
97
|
+
# :require => false
|
98
|
+
# }, {
|
99
|
+
# :name => "country",
|
100
|
+
# :type => "string",
|
101
|
+
# :require => true
|
102
|
+
# }]
|
103
|
+
|
104
|
+
# Delete the schema (and the index) for the collection
|
105
|
+
# WARNING: This deletes the index for the collection, so previously saved documents
|
106
|
+
# will not show up in queries!
|
107
|
+
collection.delete_schema
|
108
|
+
```
|
109
|
+
|
110
|
+
### Reading and Writing Documents
|
111
|
+
```ruby
|
112
|
+
# You can insert a document with no key
|
113
|
+
# RiakJson generates a UUID type key and returns it
|
114
|
+
doc = RiakJson::Document.new
|
115
|
+
doc.body = { 'city'=>"Cleveland", 'state'=>'OH', 'country'=>'USA'}
|
116
|
+
doc.key # => nil
|
117
|
+
collection.insert(doc)
|
118
|
+
doc.key # => e.g. 'EmuVX4kFHxxvlUVJj5TmPGgGPjP'
|
119
|
+
|
120
|
+
# Populate the cities collection with data
|
121
|
+
doc = RiakJson::Document.new(
|
122
|
+
key="nyc",
|
123
|
+
body={ 'city'=>"New York", 'state'=>"NY", 'country'=>"USA" })
|
124
|
+
collection.insert(doc)
|
125
|
+
doc = RiakJson::Document.new(
|
126
|
+
key="boston",
|
127
|
+
body={ 'city'=>"Boston", 'state'=>"MA", 'country'=>"USA" })
|
128
|
+
collection.insert(doc)
|
129
|
+
doc = RiakJson::Document.new(
|
130
|
+
key="sf",
|
131
|
+
body={ 'city'=>"San Francisco", 'state'=>"CA", 'country'=>"USA" })
|
132
|
+
collection.insert(doc)
|
133
|
+
|
134
|
+
# Read a document (load by key)
|
135
|
+
doc = collection.find_by_key("nyc")
|
136
|
+
doc['city'] # => 'New York'
|
137
|
+
```
|
138
|
+
|
139
|
+
### Querying RiakJson - find_one() and find_all()
|
140
|
+
See [RiakJson Query Docs](https://github.com/basho-labs/riak_json/blob/master/docs/query.md)
|
141
|
+
for a complete list of valid query parameters.
|
142
|
+
```ruby
|
143
|
+
# Exact match on "city" field
|
144
|
+
query = {"city" => "San Francisco"}.to_json
|
145
|
+
doc = collection.find_one(query)
|
146
|
+
# collection.find_one returns a Document instance
|
147
|
+
doc['city'] # => 'San Francisco'
|
148
|
+
|
149
|
+
# Find all documents that match the "country" field exactly
|
150
|
+
query = {"country" => "USA"}.to_json
|
151
|
+
results = collection.find_all(query)
|
152
|
+
results.documents.count # => 3
|
153
|
+
results.num_pages # => 1 -- total pages in result set
|
154
|
+
results.page # => 0 -- current page (zero-indexed)
|
155
|
+
results.per_page # results per page, defaults to 100
|
156
|
+
```
|
157
|
+
#### Limiting Query Results
|
158
|
+
```ruby
|
159
|
+
# Find all US cities, limit results to 10 per page
|
160
|
+
query = {'country'=>'USA', '$per_page'=>10}.to_json
|
161
|
+
results = collection.find_all(query)
|
162
|
+
results.per_page # => 10
|
163
|
+
```
|
164
|
+
#### Page Offsets
|
165
|
+
```ruby
|
166
|
+
# Find all US cities, retrieve 2nd page (zero-offset)
|
167
|
+
query = {'country'=>'USA', '$per_page'=>10, '$page'=>1}.to_json
|
168
|
+
results = collection.find_all(query)
|
169
|
+
results.page # => 1
|
170
|
+
```
|
171
|
+
|
172
|
+
## Contributing
|
173
|
+
|
174
|
+
1. Fork it
|
175
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
176
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
177
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
178
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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 "bundler/gem_tasks"
|
22
|
+
require 'rake'
|
23
|
+
require 'rake/testtask'
|
24
|
+
|
25
|
+
task :default => :test
|
26
|
+
|
27
|
+
Rake::TestTask.new :test do |t|
|
28
|
+
t.libs << 'lib' << 'test'
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
30
|
+
end
|
31
|
+
|
32
|
+
Rake::TestTask.new :itest do |t|
|
33
|
+
t.libs << 'lib' << 'test'
|
34
|
+
t.pattern = 'test/integration/*_test.rb'
|
35
|
+
end
|
36
|
+
|
37
|
+
Rake::TestTask.new :unittest do |t|
|
38
|
+
t.libs << 'lib' << 'test'
|
39
|
+
t.pattern = 'test/unit/*_test.rb'
|
40
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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 'rest-client'
|
22
|
+
require 'erb'
|
23
|
+
require 'yaml'
|
24
|
+
|
25
|
+
module RiakJson
|
26
|
+
# Default hostname of the RiakJson test server
|
27
|
+
RIAK_TEST_HOST = '127.0.0.1'
|
28
|
+
# Default http port of the RiakJson test server
|
29
|
+
RIAK_TEST_PORT = 8098
|
30
|
+
|
31
|
+
# RiakJson::Client makes REST calls to the Riak Json API endpoints,
|
32
|
+
# on behalf of a Collection.
|
33
|
+
# Stores the details of a Riak/RiakJson HTTP connection (host, port),
|
34
|
+
# and manages a cache of collection references.
|
35
|
+
# Uses a pluggable ClientTransport component to make the actual HTTP requests.
|
36
|
+
class Client
|
37
|
+
attr_accessor :collection_cache
|
38
|
+
attr_accessor :transport
|
39
|
+
attr_accessor :host, :port
|
40
|
+
|
41
|
+
def initialize(host=RiakJson::RIAK_TEST_HOST, port=RiakJson::RIAK_TEST_PORT)
|
42
|
+
@collection_cache = {}
|
43
|
+
@transport = RiakJson::ClientTransport.new
|
44
|
+
@host = host
|
45
|
+
@port = port
|
46
|
+
end
|
47
|
+
|
48
|
+
def base_collection_url
|
49
|
+
"#{self.base_riak_json_url}/collection"
|
50
|
+
end
|
51
|
+
|
52
|
+
def base_riak_url
|
53
|
+
"http://#{self.host}:#{self.port}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def base_riak_json_url
|
57
|
+
"#{self.base_riak_url}/document"
|
58
|
+
end
|
59
|
+
|
60
|
+
def collection(name)
|
61
|
+
self.collection_cache[name] ||= RiakJson::Collection.new(name, self)
|
62
|
+
end
|
63
|
+
|
64
|
+
def delete_json_object(collection_name, key)
|
65
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/#{key}", :delete)
|
66
|
+
end
|
67
|
+
|
68
|
+
def delete_schema(collection_name)
|
69
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/schema", :delete)
|
70
|
+
end
|
71
|
+
|
72
|
+
def get_json_object(collection_name, key)
|
73
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/#{key}", :get)
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_query_all(collection_name, query_json)
|
77
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/query/all", :put, query_json)
|
78
|
+
end
|
79
|
+
|
80
|
+
def get_query_one(collection_name, query_json)
|
81
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/query/one", :put, query_json)
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_schema(collection_name)
|
85
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/schema", :get)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Sends a JSON document to a collection resource
|
89
|
+
# If a key is specified, issues a PUT to that key
|
90
|
+
# If key is nil, issues a POST to the collection, and returns the
|
91
|
+
# key generated by RiakJson
|
92
|
+
#
|
93
|
+
# @param format [String]
|
94
|
+
# @param key - can be nil
|
95
|
+
# @param json [String]
|
96
|
+
# @return [String] Returns the key for the inserted document
|
97
|
+
def insert_json_object(collection_name, key, json)
|
98
|
+
if key.nil?
|
99
|
+
key = self.post_to_collection(collection_name, json)
|
100
|
+
else
|
101
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/#{key}", :put, json)
|
102
|
+
key
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Load a config file in YAML format
|
107
|
+
def self.load_config_file(config_file)
|
108
|
+
config_file = File.expand_path(config_file)
|
109
|
+
config_hash = YAML.load(ERB.new(File.read(config_file)).result)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Perform an HTTP ping to the Riak cluster
|
113
|
+
def ping
|
114
|
+
response = self.transport.get_request("#{self.base_riak_url}/ping")
|
115
|
+
end
|
116
|
+
|
117
|
+
def post_to_collection(collection_name, json)
|
118
|
+
response = self.transport.send_request("#{self.base_collection_url}/#{collection_name}", :post, json)
|
119
|
+
if response.code == 201
|
120
|
+
location = response.headers[:location]
|
121
|
+
key = location.split('/').last
|
122
|
+
else
|
123
|
+
raise Exception, "Error inserting document into collection - key not returned"
|
124
|
+
end
|
125
|
+
key
|
126
|
+
end
|
127
|
+
|
128
|
+
def set_schema_json(collection_name, json)
|
129
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/schema", :put, json)
|
130
|
+
end
|
131
|
+
|
132
|
+
def update_json_object(collection_name, key, json)
|
133
|
+
if key.nil? or key.empty?
|
134
|
+
raise Exception, "Error: cannot update document, key missing"
|
135
|
+
end
|
136
|
+
self.transport.send_request("#{self.base_collection_url}/#{collection_name}/#{key}", :put, json)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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 'rest-client'
|
22
|
+
|
23
|
+
module RiakJson
|
24
|
+
# Used by RiakJson::Client to make HTTP requests
|
25
|
+
class ClientTransport
|
26
|
+
def get_request(url)
|
27
|
+
self.send_request(url, :get)
|
28
|
+
end
|
29
|
+
|
30
|
+
def send_request(url, http_method, data=nil)
|
31
|
+
begin
|
32
|
+
case http_method
|
33
|
+
when :get
|
34
|
+
response = RestClient.get url, {:content_type => :json}
|
35
|
+
when :put
|
36
|
+
response = RestClient.put url, data, {:content_type => :json, :accept => :json}
|
37
|
+
when :post
|
38
|
+
response = RestClient.post url, data, {:content_type => :json, :accept => :json}
|
39
|
+
when :delete
|
40
|
+
response = RestClient.delete url
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Invalid HTTP :method - #{http_method}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
response
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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 RiakJson
|
22
|
+
# Manages document read and write operations to RiakJson
|
23
|
+
# Also manages collection schema administration.
|
24
|
+
class Collection
|
25
|
+
attr_accessor :name
|
26
|
+
attr_accessor :client
|
27
|
+
|
28
|
+
def initialize(collection_name, client)
|
29
|
+
if collection_name.nil? or collection_name.empty?
|
30
|
+
raise ArgumentError, "Invalid collection name (must not be nil or empty)"
|
31
|
+
end
|
32
|
+
@name = collection_name
|
33
|
+
@client = client
|
34
|
+
end
|
35
|
+
|
36
|
+
def delete_raw_json(key)
|
37
|
+
self.client.delete_json_object(self.name, key)
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_schema
|
41
|
+
self.client.delete_schema(self.name)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Retrieve all documents for a given query json object
|
45
|
+
# @param [String] JSON object representing the query
|
46
|
+
# @return [QueryResult]
|
47
|
+
def find_all(query_json)
|
48
|
+
json_obj = self.client.get_query_all(self.name, query_json)
|
49
|
+
RiakJson::QueryResult.new(json_obj)
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_by_key(key)
|
53
|
+
json_obj = self.get_raw_json(key)
|
54
|
+
body_hash = JSON.parse(json_obj)
|
55
|
+
RiakJson::Document.new(key, body_hash)
|
56
|
+
end
|
57
|
+
|
58
|
+
def find_one(query_json)
|
59
|
+
json_obj = self.client.get_query_one(self.name, query_json)
|
60
|
+
return nil if json_obj.nil? or json_obj.empty?
|
61
|
+
body_hash = JSON.parse(json_obj)
|
62
|
+
return nil if body_hash.empty?
|
63
|
+
key = body_hash['_id']
|
64
|
+
RiakJson::Document.new(key, body_hash)
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_raw_json(key)
|
68
|
+
self.client.get_json_object(self.name, key)
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_schema
|
72
|
+
self.client.get_schema(self.name)
|
73
|
+
end
|
74
|
+
|
75
|
+
def has_schema?
|
76
|
+
return true if get_schema rescue false
|
77
|
+
end
|
78
|
+
|
79
|
+
def insert(document)
|
80
|
+
key = self.insert_raw_json(document.key, document.to_json_document)
|
81
|
+
document.key = key
|
82
|
+
end
|
83
|
+
|
84
|
+
def insert_raw_json(key, json_obj)
|
85
|
+
key = self.client.insert_json_object(self.name, key, json_obj)
|
86
|
+
end
|
87
|
+
|
88
|
+
def remove(document)
|
89
|
+
self.delete_raw_json(document.key)
|
90
|
+
end
|
91
|
+
|
92
|
+
def set_schema(schema)
|
93
|
+
if schema.kind_of? RiakJson::CollectionSchema
|
94
|
+
schema = schema.build
|
95
|
+
end
|
96
|
+
self.client.set_schema_json(self.name, schema)
|
97
|
+
end
|
98
|
+
|
99
|
+
def update(document)
|
100
|
+
self.update_raw_json(document.key, document.to_json)
|
101
|
+
end
|
102
|
+
|
103
|
+
def update_raw_json(key, json_obj)
|
104
|
+
self.client.update_json_object(self.name, key, json_obj)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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 RiakJson
|
22
|
+
# Helper object for creating RiakJson schemas.
|
23
|
+
class CollectionSchema
|
24
|
+
attr_accessor :fields
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@fields = []
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_field(field_type, field_name, required=false)
|
31
|
+
unless self.class.valid_field_types.include? field_type.to_sym
|
32
|
+
raise Exception, "Invalid field type"
|
33
|
+
end
|
34
|
+
self.fields << { name: field_name.to_s, type: field_type.to_s, require: required }
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_integer_field(field_name, required=false)
|
38
|
+
self.add_field(:integer, field_name, required)
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_multi_string_field(field_name, required=false)
|
42
|
+
self.add_field(:multi_string, field_name, required)
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_string_field(field_name, required=false)
|
46
|
+
self.add_field(:string, field_name, required)
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_text_field(field_name, required=false)
|
50
|
+
self.add_field(:text, field_name, required)
|
51
|
+
end
|
52
|
+
|
53
|
+
def build
|
54
|
+
self.fields.to_json
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.valid_field_types
|
58
|
+
[:text, :string, :multi_string, :integer]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Copyright (c) "2013" 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 RiakJson
|
22
|
+
# Implements the RiakJson::Collection api (.key, .to_json_document)
|
23
|
+
# to easily store documents in a RiakJson::Collection
|
24
|
+
class Document
|
25
|
+
attr_accessor :key
|
26
|
+
attr_accessor :body
|
27
|
+
alias_method :attributes, :body
|
28
|
+
|
29
|
+
def initialize(key=nil, body={})
|
30
|
+
@key = key
|
31
|
+
@body = body
|
32
|
+
end
|
33
|
+
|
34
|
+
def [](key)
|
35
|
+
@body[key]
|
36
|
+
end
|
37
|
+
|
38
|
+
def []=(key, value)
|
39
|
+
@body[key] = value
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns a JSON string representation
|
43
|
+
def to_json
|
44
|
+
self.body.to_json
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns a JSON string representation.
|
48
|
+
# Invoked by RiakJson::Collection to serialize
|
49
|
+
# an object for writing to RiakJson
|
50
|
+
def to_json_document
|
51
|
+
self.to_json
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|