riak-client 2.5.0 → 2.6.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/README.md +1 -0
- data/RELNOTES.md +3 -0
- data/lib/riak/bucket.rb +1 -1
- data/lib/riak/client.rb +14 -7
- data/lib/riak/client/beefcake/messages.rb +13 -0
- data/lib/riak/multi.rb +101 -0
- data/lib/riak/multiexist.rb +14 -0
- data/lib/riak/multiget.rb +7 -107
- data/lib/riak/version.rb +1 -1
- metadata +12 -234
- data/.document +0 -5
- data/.gitignore +0 -44
- data/.rspec +0 -2
- data/Gemfile +0 -17
- data/Guardfile +0 -20
- data/Rakefile +0 -124
- data/riak-client.gemspec +0 -71
- data/spec/failover/failover.rb +0 -59
- data/spec/fixtures/bitcask.txt +0 -25
- data/spec/fixtures/cat.jpg +0 -0
- data/spec/fixtures/multipart-basic-conflict.txt +0 -15
- data/spec/fixtures/multipart-blank.txt +0 -7
- data/spec/fixtures/multipart-mapreduce.txt +0 -10
- data/spec/fixtures/multipart-with-body.txt +0 -16
- data/spec/fixtures/multipart-with-marked-tombstones.txt +0 -17
- data/spec/fixtures/multipart-with-unmarked-tombstone.txt +0 -16
- data/spec/fixtures/server.cert.crt +0 -15
- data/spec/fixtures/server.cert.key +0 -15
- data/spec/fixtures/test.pem +0 -1
- data/spec/fixtures/yz_schema_template.xml +0 -18
- data/spec/integration/riak/bucket_types_spec.rb +0 -308
- data/spec/integration/riak/conflict_resolution_spec.rb +0 -96
- data/spec/integration/riak/counters_spec.rb +0 -36
- data/spec/integration/riak/crdt/configuration_spec.rb +0 -38
- data/spec/integration/riak/crdt_search_spec.rb +0 -176
- data/spec/integration/riak/crdt_spec.rb +0 -332
- data/spec/integration/riak/crdt_validation/map_spec.rb +0 -63
- data/spec/integration/riak/crdt_validation/set_spec.rb +0 -122
- data/spec/integration/riak/encodings/crdt_spec.rb +0 -122
- data/spec/integration/riak/encodings/kv_spec.rb +0 -87
- data/spec/integration/riak/encodings/yz_spec.rb +0 -142
- data/spec/integration/riak/preflist_spec.rb +0 -43
- data/spec/integration/riak/properties_spec.rb +0 -69
- data/spec/integration/riak/protobuffs/interrupted_request_spec.rb +0 -33
- data/spec/integration/riak/protobuffs/timeouts_spec.rb +0 -178
- data/spec/integration/riak/protobuffs_backends_spec.rb +0 -40
- data/spec/integration/riak/search_spec.rb +0 -104
- data/spec/integration/riak/secondary_index_spec.rb +0 -72
- data/spec/integration/riak/security_spec.rb +0 -105
- data/spec/integration/riak/threading_spec.rb +0 -154
- data/spec/integration/riak/time_series_spec.rb +0 -212
- data/spec/integration/yokozuna/index_spec.rb +0 -61
- data/spec/integration/yokozuna/queries_spec.rb +0 -115
- data/spec/integration/yokozuna/schema_spec.rb +0 -49
- data/spec/riak/beefcake_protobuffs_backend/bucket_properties_operator_spec.rb +0 -247
- data/spec/riak/beefcake_protobuffs_backend/crdt_operator_spec.rb +0 -244
- data/spec/riak/beefcake_protobuffs_backend/object_methods_spec.rb +0 -53
- data/spec/riak/beefcake_protobuffs_backend/protocol_spec.rb +0 -189
- data/spec/riak/beefcake_protobuffs_backend/ts_cell_codec_spec.rb +0 -124
- data/spec/riak/beefcake_protobuffs_backend_spec.rb +0 -162
- data/spec/riak/bucket_properties_spec.rb +0 -135
- data/spec/riak/bucket_spec.rb +0 -275
- data/spec/riak/bucket_type_spec.rb +0 -50
- data/spec/riak/bucket_typed/bucket_spec.rb +0 -78
- data/spec/riak/client_spec.rb +0 -304
- data/spec/riak/core_ext/to_param_spec.rb +0 -15
- data/spec/riak/counter_spec.rb +0 -122
- data/spec/riak/crdt/counter_spec.rb +0 -55
- data/spec/riak/crdt/hyper_log_log_spec.rb +0 -56
- data/spec/riak/crdt/inner_counter_spec.rb +0 -21
- data/spec/riak/crdt/inner_flag_spec.rb +0 -39
- data/spec/riak/crdt/inner_map_spec.rb +0 -47
- data/spec/riak/crdt/inner_register_spec.rb +0 -40
- data/spec/riak/crdt/inner_set_spec.rb +0 -33
- data/spec/riak/crdt/map_spec.rb +0 -78
- data/spec/riak/crdt/set_spec.rb +0 -61
- data/spec/riak/crdt/shared_examples.rb +0 -88
- data/spec/riak/crdt/typed_collection_spec.rb +0 -225
- data/spec/riak/escape_spec.rb +0 -72
- data/spec/riak/feature_detection_spec.rb +0 -77
- data/spec/riak/index_collection_spec.rb +0 -53
- data/spec/riak/instrumentation_spec.rb +0 -124
- data/spec/riak/link_spec.rb +0 -85
- data/spec/riak/list_buckets_spec.rb +0 -41
- data/spec/riak/map_reduce/filter_builder_spec.rb +0 -32
- data/spec/riak/map_reduce/phase_spec.rb +0 -142
- data/spec/riak/map_reduce_spec.rb +0 -434
- data/spec/riak/multiget_spec.rb +0 -81
- data/spec/riak/node_spec.rb +0 -26
- data/spec/riak/robject_spec.rb +0 -542
- data/spec/riak/search/index_spec.rb +0 -72
- data/spec/riak/search/query_spec.rb +0 -88
- data/spec/riak/search/result_collection_spec.rb +0 -89
- data/spec/riak/search/result_document_spec.rb +0 -106
- data/spec/riak/search/schema_spec.rb +0 -63
- data/spec/riak/search_spec.rb +0 -107
- data/spec/riak/secondary_index_spec.rb +0 -225
- data/spec/riak/serializers_spec.rb +0 -121
- data/spec/riak/stamp_spec.rb +0 -54
- data/spec/riak/time_series/deletion_spec.rb +0 -33
- data/spec/riak/time_series/listing_spec.rb +0 -51
- data/spec/riak/time_series/submission_spec.rb +0 -35
- data/spec/riak/util/gzip_spec.rb +0 -49
- data/spec/riak/walk_spec_spec.rb +0 -203
- data/spec/spec_helper.rb +0 -67
- data/spec/support/certs/README.md +0 -13
- data/spec/support/certs/ca.crt +0 -21
- data/spec/support/certs/client.crl +0 -13
- data/spec/support/certs/client.crt +0 -94
- data/spec/support/certs/client.csr +0 -18
- data/spec/support/certs/client.key +0 -27
- data/spec/support/certs/empty_ca.crt +0 -21
- data/spec/support/certs/server.crl +0 -13
- data/spec/support/certs/server.crt +0 -94
- data/spec/support/certs/server.key +0 -27
- data/spec/support/crdt_search_config.rb +0 -112
- data/spec/support/crdt_search_fixtures.rb +0 -42
- data/spec/support/integration_setup.rb +0 -10
- data/spec/support/search_config.rb +0 -83
- data/spec/support/search_corpus_setup.rb +0 -39
- data/spec/support/test_client.rb +0 -52
- data/spec/support/test_client.yml.example +0 -10
- data/spec/support/unified_backend_examples.rb +0 -402
- data/spec/support/version_filter.rb +0 -12
- data/spec/support/wait_until.rb +0 -20
@@ -1,39 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
shared_context "search corpus setup" do
|
3
|
-
before do
|
4
|
-
@search_bucket = random_bucket 'search_test'
|
5
|
-
@backend.create_search_index @search_bucket.name
|
6
|
-
|
7
|
-
wait_until{ !@backend.get_search_index(@search_bucket.name).nil? }
|
8
|
-
|
9
|
-
@client.set_bucket_props(@search_bucket,
|
10
|
-
{search_index: @search_bucket.name},
|
11
|
-
'yokozuna')
|
12
|
-
|
13
|
-
wait_until do
|
14
|
-
p = @client.get_bucket_props(@search_bucket, type: 'yokozuna')
|
15
|
-
p['search_index'] == @search_bucket.name
|
16
|
-
end
|
17
|
-
|
18
|
-
idx = 0
|
19
|
-
old_encoding = Encoding.default_external
|
20
|
-
Encoding.default_external = Encoding::UTF_8
|
21
|
-
IO.foreach("spec/fixtures/bitcask.txt") do |para|
|
22
|
-
next if para =~ /^\s*$|introduction|chapter/ui
|
23
|
-
idx += 1
|
24
|
-
Riak::RObject.new(@search_bucket, "bitcask-#{idx}") do |obj|
|
25
|
-
obj.content_type = 'text/plain'
|
26
|
-
obj.raw_data = para
|
27
|
-
@backend.store_object(obj, type: 'yokozuna')
|
28
|
-
end
|
29
|
-
end
|
30
|
-
Encoding.default_external = old_encoding
|
31
|
-
|
32
|
-
wait_until do
|
33
|
-
results = @backend.search(@search_bucket.name,
|
34
|
-
'contain your entire keyspace',
|
35
|
-
df: 'text')
|
36
|
-
results['docs'].length > 0
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/spec/support/test_client.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module TestClient
|
2
|
-
def test_client
|
3
|
-
if defined? $test_client and $test_client.ping
|
4
|
-
return $test_client
|
5
|
-
end
|
6
|
-
|
7
|
-
candidate_client = Riak::Client.new test_client_configuration
|
8
|
-
|
9
|
-
live = candidate_client.ping
|
10
|
-
|
11
|
-
return $test_client = candidate_client if live
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_client_configuration
|
15
|
-
TestClient.test_client_configuration
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.test_client_configuration
|
19
|
-
if defined? $test_client_configuration
|
20
|
-
return $test_client_configuration
|
21
|
-
end
|
22
|
-
|
23
|
-
begin
|
24
|
-
config_path = File.expand_path '../test_client.yml', __FILE__
|
25
|
-
config = YAML.load_file(config_path).symbolize_keys
|
26
|
-
rescue Errno::ENOENT => ex
|
27
|
-
$stderr.puts("WARNING: could not find file: #{config_path}, exception: #{ex}")
|
28
|
-
config = {}
|
29
|
-
config[:pb_port] = ENV['RIAK_PORT'] || 10017
|
30
|
-
end
|
31
|
-
|
32
|
-
if config[:nodes]
|
33
|
-
new_nodes = config[:nodes].map(&:symbolize_keys)
|
34
|
-
config[:nodes] = new_nodes
|
35
|
-
end
|
36
|
-
|
37
|
-
$test_client_configuration = config
|
38
|
-
end
|
39
|
-
|
40
|
-
def random_bucket(name = 'test_client')
|
41
|
-
bucket_name = [name, Time.now.to_i, random_key].join('-')
|
42
|
-
test_client.bucket bucket_name
|
43
|
-
end
|
44
|
-
|
45
|
-
def random_key
|
46
|
-
rand(36**10).to_s(36)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
RSpec.configure do |config|
|
51
|
-
config.include TestClient, test_client: true
|
52
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
# This file is used for configuring test_client used by
|
2
|
-
# many of the integration tests.
|
3
|
-
#
|
4
|
-
# Simply set the arguments you'd normally pass to
|
5
|
-
# Riak::Client.new in the file.
|
6
|
-
#
|
7
|
-
# Don't run multiple nodes, integration tests include
|
8
|
-
# quorum checks that may result in race conditions.
|
9
|
-
|
10
|
-
pb_port: 8087
|
@@ -1,402 +0,0 @@
|
|
1
|
-
shared_examples_for "Unified backend API" do
|
2
|
-
# ping
|
3
|
-
it "pings the server" do
|
4
|
-
expect(@backend.ping).to be_truthy
|
5
|
-
end
|
6
|
-
|
7
|
-
it "gets info about the server" do
|
8
|
-
expect{ @backend.server_info }.to_not raise_error
|
9
|
-
|
10
|
-
expect(@backend.server_info).to include(:node, :server_version)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "gets client id" do
|
14
|
-
expect{ @backend.get_client_id }.to_not raise_error
|
15
|
-
|
16
|
-
expect(@backend.get_client_id).to be_a String
|
17
|
-
end
|
18
|
-
|
19
|
-
# fetch_object
|
20
|
-
context "fetching an object" do
|
21
|
-
before do
|
22
|
-
@robject = Riak::RObject.new(@bucket, "fetch")
|
23
|
-
@robject.content_type = "application/json"
|
24
|
-
@robject.data = { "test" => "pass" }
|
25
|
-
@robject.indexes['test_bin'] << 'pass'
|
26
|
-
@robject.links << Riak::Link.new('/riak/foo/bar', 'next')
|
27
|
-
@robject.links << Riak::Link.new('/riak/foo/baz', 'next')
|
28
|
-
@backend.store_object(@robject)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "finds a stored object" do
|
32
|
-
robj = @backend.fetch_object(@bucket.name, "fetch")
|
33
|
-
expect(robj).to be_kind_of(Riak::RObject)
|
34
|
-
expect(robj.data).to eq({ "test" => "pass" })
|
35
|
-
expect(robj.links).to be_a Set
|
36
|
-
end
|
37
|
-
|
38
|
-
it "raises an error when the object is not found" do
|
39
|
-
begin
|
40
|
-
@backend.fetch_object(@bucket.name, "notfound")
|
41
|
-
rescue Riak::FailedRequest => exception
|
42
|
-
@exception = exception
|
43
|
-
end
|
44
|
-
expect(@exception).to be_kind_of(Riak::FailedRequest)
|
45
|
-
expect(@exception).to be_not_found
|
46
|
-
end
|
47
|
-
|
48
|
-
[1, 2, 3, :one, :quorum, :all, :default].each do |q|
|
49
|
-
it "accepts a R value of #{q.inspect} for the request" do
|
50
|
-
robj = @backend.fetch_object(@bucket.name, "fetch", :r => q)
|
51
|
-
expect(robj).to be_kind_of(Riak::RObject)
|
52
|
-
expect(robj.data).to eq({ "test" => "pass" })
|
53
|
-
end
|
54
|
-
|
55
|
-
it "accepts a PR value of #{q.inspect} for the request" do
|
56
|
-
robj = @backend.fetch_object(@bucket.name, "fetch", :pr => q)
|
57
|
-
expect(robj).to be_kind_of(Riak::RObject)
|
58
|
-
expect(robj.data).to eq({ "test" => "pass" })
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it "marshals indexes properly", :retries => 5 do
|
63
|
-
robj = @backend.fetch_object(@bucket.name, 'fetch')
|
64
|
-
expect(robj.indexes['test_bin']).to be
|
65
|
-
expect(robj.indexes['test_bin']).to include('pass')
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# reload_object
|
70
|
-
context "reloading an existing object" do
|
71
|
-
before do
|
72
|
-
@robject = Riak::RObject.new(@bucket, 'reload')
|
73
|
-
@robject.content_type = "application/json"
|
74
|
-
@robject.data = {"test" => "pass"}
|
75
|
-
@backend.store_object(@robject)
|
76
|
-
@robject2 = @backend.fetch_object(@bucket.name, "reload")
|
77
|
-
@robject2.data["test"] = "second"
|
78
|
-
@backend.store_object(@robject2, :returnbody => true)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "modifies the object with the reloaded data" do
|
82
|
-
@backend.reload_object(@robject)
|
83
|
-
end
|
84
|
-
|
85
|
-
[1, 2, 3, :one, :quorum, :all, :default].each do |q|
|
86
|
-
it "accepts a valid R value of #{q.inspect} for the request" do
|
87
|
-
@backend.reload_object(@robject, :r => q)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "accepts a valid PR value of #{q.inspect} for the request" do
|
91
|
-
@backend.reload_object(@robject, :pr => q)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
after do |example|
|
96
|
-
unless example.pending?
|
97
|
-
expect(@robject.vclock).to eq(@robject2.vclock)
|
98
|
-
expect(@robject.data['test']).to eq("second")
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# store_object
|
104
|
-
context "storing an object" do
|
105
|
-
before do
|
106
|
-
@robject = Riak::RObject.new(@bucket, random_key)
|
107
|
-
@robject.content_type = "application/json"
|
108
|
-
@robject.data = {"test" => "pass"}
|
109
|
-
end
|
110
|
-
|
111
|
-
it "saves the object" do
|
112
|
-
@backend.store_object(@robject)
|
113
|
-
end
|
114
|
-
|
115
|
-
it "modifies the object with the returned data if returnbody" do
|
116
|
-
@backend.store_object(@robject, :returnbody => true)
|
117
|
-
expect(@robject.vclock).to be_present
|
118
|
-
end
|
119
|
-
|
120
|
-
[1, 2, 3, :one, :quorum, :all, :default].each do |q|
|
121
|
-
it "accepts a W value of #{q.inspect} for the request" do
|
122
|
-
@backend.store_object(@robject, :returnbody => false, :w => q)
|
123
|
-
expect(@bucket.exists?(@robject.key)).to be_truthy
|
124
|
-
end
|
125
|
-
|
126
|
-
it "accepts a DW value of #{q.inspect} for the request" do
|
127
|
-
@backend.store_object(@robject, :returnbody => false, :w => :all, :dw => q)
|
128
|
-
end
|
129
|
-
|
130
|
-
it "accepts a PW value of #{q.inspect} for the request" do
|
131
|
-
@backend.store_object(@robject, :returnbody => false, :pw => q)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
it "stores an object with indexes" do
|
136
|
-
@robject.indexes['foo_bin'] << 'bar'
|
137
|
-
@backend.store_object(@robject, :returnbody => true)
|
138
|
-
expect(@robject.indexes).to include('foo_bin')
|
139
|
-
expect(@robject.indexes['foo_bin']).to include('bar')
|
140
|
-
end
|
141
|
-
|
142
|
-
after do
|
143
|
-
expect { @backend.fetch_object(@bucket.name, @robject.key) }.not_to raise_error
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
# delete_object
|
148
|
-
context "deleting an object" do
|
149
|
-
before do
|
150
|
-
@obj = Riak::RObject.new(@client.bucket("test"), "delete")
|
151
|
-
@obj.content_type = "application/json"
|
152
|
-
@obj.data = [1]
|
153
|
-
@backend.store_object(@obj)
|
154
|
-
end
|
155
|
-
|
156
|
-
it "removes the object" do
|
157
|
-
@backend.delete_object("test", "delete")
|
158
|
-
expect(@obj.bucket.exists?("delete")).to be_falsey
|
159
|
-
end
|
160
|
-
|
161
|
-
[1, 2, 3, :one, :quorum, :all, :default].each do |q|
|
162
|
-
it "accepts an RW value of #{q.inspect} for the request" do
|
163
|
-
@backend.delete_object("test", "delete", :rw => q)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
it "accepts a vclock value for the request" do
|
168
|
-
@backend.delete_object("test", "delete", :vclock => @obj.vclock)
|
169
|
-
end
|
170
|
-
|
171
|
-
after do
|
172
|
-
expect(@obj.bucket.exists?("delete")).to be_falsey
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
# get_bucket_props
|
177
|
-
context "fetching bucket properties" do
|
178
|
-
it "fetches a hash of bucket properties" do
|
179
|
-
props = @backend.get_bucket_props("test")
|
180
|
-
expect(props).to be_kind_of(Hash)
|
181
|
-
expect(props).to include("n_val")
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
# set_bucket_props
|
186
|
-
context "setting bucket properties" do
|
187
|
-
it "stores properties for the bucket" do
|
188
|
-
@backend.set_bucket_props("test", {"n_val" => 3})
|
189
|
-
expect(@backend.get_bucket_props("test")["n_val"]).to eq(3)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
# list_keys
|
194
|
-
context "listing keys in a bucket" do
|
195
|
-
before do
|
196
|
-
@list_bucket = random_bucket 'unified_backend_list_keys'
|
197
|
-
obj = Riak::RObject.new(@list_bucket, "keys")
|
198
|
-
obj.content_type = "application/json"
|
199
|
-
obj.data = [1]
|
200
|
-
@backend.store_object(obj)
|
201
|
-
end
|
202
|
-
|
203
|
-
it "fetches an array of string keys" do
|
204
|
-
expect(@backend.list_keys(@list_bucket)).to eq(["keys"])
|
205
|
-
end
|
206
|
-
|
207
|
-
context "streaming through a block" do
|
208
|
-
it "handles a large number of keys" do
|
209
|
-
obj = Riak::RObject.new(@list_bucket)
|
210
|
-
obj.content_type = "application/json"
|
211
|
-
obj.data = [1]
|
212
|
-
750.times do |i|
|
213
|
-
obj.key = i.to_s
|
214
|
-
obj.store(:w => 1, :dw => 0, :returnbody => false)
|
215
|
-
end
|
216
|
-
@backend.list_keys(@list_bucket) do |keys|
|
217
|
-
expect(keys).to be_all {|k| k == 'keys' || (0..749).include?(k.to_i) }
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
it "passes an array of keys to the block" do
|
222
|
-
@backend.list_keys(@list_bucket) do |keys|
|
223
|
-
expect(keys).to eq(["keys"]) unless keys.empty?
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
it "allows requests issued inside the block to execute" do
|
228
|
-
errors = []
|
229
|
-
@backend.list_keys(@list_bucket) do |keys|
|
230
|
-
keys.each do |key|
|
231
|
-
begin
|
232
|
-
@client.get_object(@list_bucket, key)
|
233
|
-
rescue => e
|
234
|
-
errors << e
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
expect(errors).to be_empty
|
239
|
-
end
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
# list_buckets
|
244
|
-
context "listing buckets" do
|
245
|
-
before do
|
246
|
-
obj = Riak::RObject.new(@client.bucket("test"), "buckets")
|
247
|
-
obj.content_type = "application/json"
|
248
|
-
obj.data = [1]
|
249
|
-
@backend.store_object(obj)
|
250
|
-
end
|
251
|
-
|
252
|
-
it "fetches a list of string bucket names" do
|
253
|
-
list = @backend.list_buckets
|
254
|
-
expect(list).to be_kind_of(Array)
|
255
|
-
expect(list).to include("test")
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
# get_index
|
260
|
-
context "querying secondary indexes" do
|
261
|
-
before do
|
262
|
-
50.times do |i|
|
263
|
-
@client.bucket('test').new(i.to_s).tap do |obj|
|
264
|
-
obj.indexes["index_int"] << i
|
265
|
-
obj.data = [i]
|
266
|
-
@backend.store_object(obj)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
it "finds keys for an equality query" do
|
272
|
-
expect(@backend.get_index('test', 'index_int', 20)).to eq(["20"])
|
273
|
-
end
|
274
|
-
|
275
|
-
it "finds keys for a range query" do
|
276
|
-
expect(@backend.get_index('test', 'index_int', 19..21)).to match_array(%w(19 20 21))
|
277
|
-
end
|
278
|
-
|
279
|
-
it "returns an empty array for a query that does not match any keys" do
|
280
|
-
expect(@backend.get_index('test', 'index_int', 10000)).to eq([])
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
# mapred
|
285
|
-
context "performing MapReduce" do
|
286
|
-
before do
|
287
|
-
@mapred_bucket = random_bucket("mapred_test")
|
288
|
-
obj = Riak::RObject.new(@mapred_bucket, "1")
|
289
|
-
obj.content_type = "application/json"
|
290
|
-
obj.data = {"value" => "1" }
|
291
|
-
@backend.store_object(obj)
|
292
|
-
@mapred = Riak::MapReduce.new(@client).
|
293
|
-
add(@mapred_bucket.name).
|
294
|
-
map("Riak.mapValuesJson", :keep => true)
|
295
|
-
end
|
296
|
-
|
297
|
-
it "doesn't raise an error without phases" do
|
298
|
-
@mapred.query.clear
|
299
|
-
@backend.mapred(@mapred)
|
300
|
-
end
|
301
|
-
|
302
|
-
it "performs a simple MapReduce request" do
|
303
|
-
expect(@backend.mapred(@mapred)).to eq([{"value" => "1"}])
|
304
|
-
end
|
305
|
-
|
306
|
-
it "returns an ordered array of results when multiple phases are kept" do
|
307
|
-
@mapred.reduce("function(objects){ return objects; }", :keep => true)
|
308
|
-
expect(@backend.mapred(@mapred)).to eq([[{"value" => "1"}], [{"value" => "1"}]])
|
309
|
-
end
|
310
|
-
|
311
|
-
it "doesn't remove empty phase results when multiple phases are kept" do
|
312
|
-
@mapred.reduce("function(){ return []; }", :keep => true)
|
313
|
-
expect(@backend.mapred(@mapred)).to eq([[{"value" => "1"}], []])
|
314
|
-
end
|
315
|
-
|
316
|
-
context "streaming results through a block" do
|
317
|
-
it "passes phase number and result to the block" do
|
318
|
-
@backend.mapred(@mapred) do |phase, result|
|
319
|
-
unless result.empty?
|
320
|
-
expect(phase).to eq(0)
|
321
|
-
expect(result).to eq([{"value" => "1"}])
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
it "allows requests issued inside the block to execute" do
|
327
|
-
errors = []
|
328
|
-
@backend.mapred(@mapred) do |phase, result|
|
329
|
-
unless result.empty?
|
330
|
-
result.each do |v|
|
331
|
-
begin
|
332
|
-
@client.get_object(@mapred_bucket, v['value'])
|
333
|
-
rescue => e
|
334
|
-
errors << e
|
335
|
-
end
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
339
|
-
expect(errors).to be_empty
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
343
|
-
|
344
|
-
# search
|
345
|
-
context "searching fulltext indexes" do
|
346
|
-
# Search functionality existed since Riak 0.13, but PBC only
|
347
|
-
# entered into the picture in 1.2. PBC can support searches
|
348
|
-
# against 1.1 and earlier nodes using MapReduce emulation, but has
|
349
|
-
# limited functionality. We'll enter separate tests for the
|
350
|
-
# pre-1.2 functionality.
|
351
|
-
include_context "search corpus setup"
|
352
|
-
|
353
|
-
it 'finds indexed documents, returning ids' do
|
354
|
-
results = @backend.search @search_bucket.name, 'predictable operations behavior', fl: '_yz_rk', df: 'text'
|
355
|
-
expect(results).to have_key 'docs'
|
356
|
-
expect(results).to have_key 'max_score'
|
357
|
-
expect(results).to have_key 'num_found'
|
358
|
-
|
359
|
-
found = results['docs'].any? do |e|
|
360
|
-
e['_yz_rk'] == 'bitcask-10'
|
361
|
-
end
|
362
|
-
|
363
|
-
expect(found).to be_truthy
|
364
|
-
end
|
365
|
-
|
366
|
-
it 'finds indexed documents, returning documents' do
|
367
|
-
# For now use '*' until #122 is merged into riak_search
|
368
|
-
results = @backend.search @search_bucket.name, 'predictable operations behavior', fl: '_yz_rk', df: 'text'
|
369
|
-
expect(results).to have_key 'docs'
|
370
|
-
expect(results).to have_key 'max_score'
|
371
|
-
expect(results).to have_key 'num_found'
|
372
|
-
|
373
|
-
found = results['docs'].any? do |e|
|
374
|
-
e['_yz_rk'] == 'bitcask-10'
|
375
|
-
end
|
376
|
-
|
377
|
-
expect(found).to be_truthy
|
378
|
-
end
|
379
|
-
end
|
380
|
-
|
381
|
-
# gzip
|
382
|
-
context "using gzip" do
|
383
|
-
before do
|
384
|
-
@robject = Riak::RObject.new(@bucket, "fetch")
|
385
|
-
@robject.content_type = "application/json"
|
386
|
-
@robject.content_encoding = "gzip"
|
387
|
-
@robject.data = { "test" => "pass" }
|
388
|
-
@backend.store_object(@robject)
|
389
|
-
end
|
390
|
-
|
391
|
-
it "stores a compressed object" do
|
392
|
-
expected_data = @robject.deserialize(@robject.decompress(@robject.raw_data))
|
393
|
-
expect(expected_data).to eq(@robject.data)
|
394
|
-
end
|
395
|
-
|
396
|
-
it "loads a compressed object" do
|
397
|
-
robj = @backend.fetch_object(@bucket.name, "fetch")
|
398
|
-
expect(robj).to be_kind_of(Riak::RObject)
|
399
|
-
expect(robj.data).to eq(@robject.data)
|
400
|
-
end
|
401
|
-
end
|
402
|
-
end
|