riak-client 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|