riak-client 2.2.0.pre1 → 2.2.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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +0 -2
  4. data/README.markdown +11 -7
  5. data/RELEASE_NOTES.md +29 -2
  6. data/Rakefile +5 -3
  7. data/lib/riak/bucket.rb +55 -23
  8. data/lib/riak/bucket_properties.rb +8 -1
  9. data/lib/riak/bucket_type.rb +29 -0
  10. data/lib/riak/bucket_typed/bucket.rb +15 -7
  11. data/lib/riak/client.rb +24 -8
  12. data/lib/riak/client/beefcake/bucket_properties_operator.rb +8 -8
  13. data/lib/riak/client/beefcake/crdt/set_loader.rb +1 -1
  14. data/lib/riak/client/beefcake/crdt_loader.rb +1 -1
  15. data/lib/riak/client/beefcake/crdt_operator.rb +9 -9
  16. data/lib/riak/client/beefcake/message_codes.rb +4 -0
  17. data/lib/riak/client/beefcake/message_overlay.rb +4 -0
  18. data/lib/riak/client/beefcake/messages.rb +35 -5
  19. data/lib/riak/client/beefcake/object_methods.rb +21 -13
  20. data/lib/riak/client/beefcake/protocol.rb +7 -7
  21. data/lib/riak/client/beefcake/socket.rb +2 -2
  22. data/lib/riak/client/beefcake_protobuffs_backend.rb +58 -33
  23. data/lib/riak/client/protobuffs_backend.rb +5 -5
  24. data/lib/riak/client/yokozuna.rb +3 -3
  25. data/lib/riak/core_ext/deep_dup.rb +1 -1
  26. data/lib/riak/counter.rb +10 -10
  27. data/lib/riak/crdt/base.rb +39 -21
  28. data/lib/riak/crdt/batch_counter.rb +5 -5
  29. data/lib/riak/crdt/batch_map.rb +2 -2
  30. data/lib/riak/crdt/counter.rb +7 -7
  31. data/lib/riak/crdt/inner_counter.rb +4 -4
  32. data/lib/riak/crdt/inner_flag.rb +3 -3
  33. data/lib/riak/crdt/inner_map.rb +1 -1
  34. data/lib/riak/crdt/inner_register.rb +1 -1
  35. data/lib/riak/crdt/inner_set.rb +5 -5
  36. data/lib/riak/crdt/map.rb +9 -9
  37. data/lib/riak/crdt/set.rb +10 -10
  38. data/lib/riak/crdt/typed_collection.rb +39 -36
  39. data/lib/riak/errors/base.rb +1 -1
  40. data/lib/riak/errors/crdt_error.rb +20 -0
  41. data/lib/riak/errors/search_error.rb +6 -0
  42. data/lib/riak/index_collection.rb +1 -1
  43. data/lib/riak/link.rb +5 -3
  44. data/lib/riak/locale/en.yml +5 -1
  45. data/lib/riak/map_reduce.rb +7 -7
  46. data/lib/riak/map_reduce/filter_builder.rb +2 -2
  47. data/lib/riak/map_reduce/phase.rb +2 -2
  48. data/lib/riak/preflist_item.rb +7 -0
  49. data/lib/riak/rcontent.rb +8 -8
  50. data/lib/riak/robject.rb +27 -14
  51. data/lib/riak/search.rb +1 -0
  52. data/lib/riak/search/index.rb +17 -3
  53. data/lib/riak/search/query.rb +14 -6
  54. data/lib/riak/search/result_collection.rb +56 -3
  55. data/lib/riak/search/result_document.rb +71 -1
  56. data/lib/riak/search/schema.rb +6 -6
  57. data/lib/riak/secondary_index.rb +20 -12
  58. data/lib/riak/serializers.rb +0 -1
  59. data/lib/riak/util/escape.rb +2 -2
  60. data/lib/riak/util/translation.rb +1 -2
  61. data/lib/riak/version.rb +1 -1
  62. data/lib/riak/walk_spec.rb +67 -32
  63. data/riak-client.gemspec +5 -4
  64. data/spec/integration/riak/bucket_types_spec.rb +35 -5
  65. data/spec/integration/riak/conflict_resolution_spec.rb +1 -1
  66. data/spec/integration/riak/counters_spec.rb +1 -1
  67. data/spec/integration/riak/crdt/configuration_spec.rb +37 -0
  68. data/spec/integration/riak/crdt_search_spec.rb +176 -0
  69. data/spec/integration/riak/crdt_spec.rb +9 -33
  70. data/spec/integration/riak/crdt_validation/map_spec.rb +4 -4
  71. data/spec/integration/riak/crdt_validation/set_spec.rb +13 -13
  72. data/spec/integration/riak/preflist_spec.rb +31 -0
  73. data/spec/integration/riak/protobuffs/interrupted_request_spec.rb +2 -2
  74. data/spec/integration/riak/protobuffs_backends_spec.rb +9 -2
  75. data/spec/integration/riak/search_spec.rb +3 -3
  76. data/spec/integration/riak/secondary_index_spec.rb +3 -3
  77. data/spec/integration/riak/security_spec.rb +7 -7
  78. data/spec/integration/yokozuna/queries_spec.rb +1 -1
  79. data/spec/riak/beefcake_protobuffs_backend/bucket_properties_operator_spec.rb +9 -9
  80. data/spec/riak/beefcake_protobuffs_backend/crdt_operator_spec.rb +9 -9
  81. data/spec/riak/beefcake_protobuffs_backend/protocol_spec.rb +5 -5
  82. data/spec/riak/beefcake_protobuffs_backend_spec.rb +8 -8
  83. data/spec/riak/bucket_properties_spec.rb +27 -6
  84. data/spec/riak/bucket_spec.rb +5 -5
  85. data/spec/riak/bucket_type_spec.rb +21 -5
  86. data/spec/riak/bucket_typed/bucket_spec.rb +62 -0
  87. data/spec/riak/client_spec.rb +36 -18
  88. data/spec/riak/counter_spec.rb +4 -4
  89. data/spec/riak/crdt/counter_spec.rb +2 -2
  90. data/spec/riak/crdt/inner_flag_spec.rb +2 -2
  91. data/spec/riak/crdt/inner_map_spec.rb +4 -4
  92. data/spec/riak/crdt/inner_register_spec.rb +1 -1
  93. data/spec/riak/crdt/map_spec.rb +4 -4
  94. data/spec/riak/crdt/shared_examples.rb +5 -5
  95. data/spec/riak/crdt/typed_collection_spec.rb +21 -21
  96. data/spec/riak/map_reduce/filter_builder_spec.rb +2 -2
  97. data/spec/riak/map_reduce/phase_spec.rb +4 -4
  98. data/spec/riak/map_reduce_spec.rb +60 -42
  99. data/spec/riak/multiget_spec.rb +2 -2
  100. data/spec/riak/robject_spec.rb +55 -14
  101. data/spec/riak/search/index_spec.rb +12 -2
  102. data/spec/riak/search/query_spec.rb +4 -4
  103. data/spec/riak/search/result_collection_spec.rb +6 -4
  104. data/spec/riak/search/result_document_spec.rb +52 -9
  105. data/spec/riak/search/schema_spec.rb +2 -2
  106. data/spec/riak/secondary_index_spec.rb +6 -6
  107. data/spec/riak/serializers_spec.rb +27 -10
  108. data/spec/riak/walk_spec_spec.rb +10 -6
  109. data/spec/spec_helper.rb +11 -2
  110. data/spec/support/crdt_search_config.rb +112 -0
  111. data/spec/support/crdt_search_fixtures.rb +42 -0
  112. data/spec/support/search_config.rb +7 -5
  113. data/spec/support/search_corpus_setup.rb +2 -2
  114. data/spec/support/test_client.rb +2 -2
  115. data/spec/support/unified_backend_examples.rb +5 -5
  116. data/spec/support/version_filter.rb +5 -3
  117. data/spec/support/wait_until.rb +9 -3
  118. metadata +36 -13
  119. data/spec/riak/bucket_typed/bucket.rb +0 -43
@@ -2,15 +2,15 @@ require 'spec_helper'
2
2
  require 'riak/search/query'
3
3
 
4
4
  describe Riak::Search::Query do
5
- let(:client) do
5
+ let(:client) do
6
6
  instance_double('Riak::Client').tap do |c|
7
7
  allow(c).to receive(:backend).and_yield(backend)
8
8
  end
9
9
  end
10
- let(:index) do
10
+ let(:index) do
11
11
  instance_double(
12
12
  'Riak::Search::Index',
13
- name: index_name,
13
+ name: index_name,
14
14
  'exists?' => true).tap do |i|
15
15
  allow(i).to receive(:is_a?).with(String).and_return(false)
16
16
  allow(i).to receive(:is_a?).with(Riak::Search::Index).and_return(true)
@@ -48,7 +48,7 @@ describe Riak::Search::Query do
48
48
  expect{ described_class.new client, index, term }.to_not raise_error
49
49
  end
50
50
 
51
- it 'creates query objects with a client, index name, and query string' do
51
+ it 'creates query objects with a client, index name, and query string' do
52
52
  class_double('Riak::Search::Index', new: index).as_stubbed_const
53
53
  allow(index).to receive(:is_a?).with(Riak::Search::Index).and_return(true)
54
54
 
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
  require 'riak/search/result_collection'
3
3
 
4
- describe Riak::Search::ResultCollection do
5
- let(:client) do
4
+ describe Riak::Search::ResultCollection, crdt_search_fixtures: true do
5
+ let(:client) do
6
6
  instance_double('Riak::Client').tap do |c|
7
7
  allow(c).to receive(:bucket_type).
8
8
  with(bucket_type_name).
@@ -44,7 +44,8 @@ describe Riak::Search::ResultCollection do
44
44
  {"score"=>"6.73738599999999937529e-02",
45
45
  "_yz_rb"=>"search_test-1419261439-ew70sak2qr",
46
46
  "_yz_rt"=>"yokozuna",
47
- "_yz_rk"=>"bitcask-4"}
47
+ "_yz_rk"=>"bitcask-4"},
48
+ map_raw
48
49
  ]
49
50
  }
50
51
  end
@@ -81,7 +82,8 @@ describe Riak::Search::ResultCollection do
81
82
 
82
83
  it 'fetches individual documents on demand' do
83
84
  fetch_first_expectation
84
-
85
+ allow(bucket_type).to receive(:data_type_class).and_return nil
86
+
85
87
  expect(subject.first).to eq first_result
86
88
  end
87
89
  end
@@ -1,26 +1,31 @@
1
1
  require 'spec_helper'
2
2
  require 'riak/search/result_document'
3
3
 
4
- describe Riak::Search::ResultDocument do
4
+ describe Riak::Search::ResultDocument, crdt_search_fixtures: true do
5
5
  let(:key){ 'bitcask-10' }
6
6
  let(:bucket_name){ 'search_test' }
7
7
  let(:bucket_type_name){ 'yokozuna' }
8
8
  let(:score){ 43.21 }
9
9
  let(:other_field){ 'banana' }
10
10
 
11
- let(:client) do
11
+ let(:client) do
12
12
  instance_double('Riak::Client').tap do |c|
13
13
  allow(c).to receive(:bucket_type).
14
- with(bucket_type_name).
15
- and_return(bucket_type)
14
+ with(bucket_type_name).
15
+ and_return(bucket_type)
16
+ allow(c).to receive(:bucket_type).
17
+ with(maps_type_name).
18
+ and_return(maps_bucket_type)
16
19
  end
17
20
  end
18
21
 
19
22
  let(:bucket_type) do
20
23
  instance_double('Riak::BucketType').tap do |bt|
21
24
  allow(bt).to receive(:bucket).
22
- with(bucket_name).
23
- and_return(bucket)
25
+ with(bucket_name).
26
+ and_return(bucket)
27
+ allow(bt).to receive(:data_type_class).
28
+ and_return(nil)
24
29
  end
25
30
  end
26
31
 
@@ -53,11 +58,49 @@ describe Riak::Search::ResultDocument do
53
58
  expect(subject.score).to eq score
54
59
  end
55
60
 
56
- it 'makes other yz fields aavailable' do
61
+ it 'makes other yz fields available' do
57
62
  expect(subject[:other_field]).to eq other_field
58
63
  end
59
64
 
60
- it 'fetches the robject it identifies' do
61
- expect(subject.robject).to eq robject
65
+ describe 'identifying a key-value object' do
66
+ it 'fetches the robject it identifies' do
67
+ expect(subject.robject).to eq robject
68
+ end
69
+
70
+ it 'returns the data type class the document is' do
71
+ expect(subject.type_class).to eq Riak::RObject
72
+ end
73
+
74
+ it 'refuses to return a CRDT' do
75
+ expect{ subject.crdt }.to raise_error Riak::CrdtError::NotACrdt
76
+ end
77
+ end
78
+
79
+ describe 'identifying a CRDT map object' do
80
+ subject { map_results }
81
+
82
+ it 'returns the data type class the document is' do
83
+ expect(subject.type_class).to eq Riak::Crdt::Map
84
+ end
85
+
86
+ let(:fake_map){ instance_double 'Riak::Crdt::Map' }
87
+
88
+ it 'fetches the map it identifies' do
89
+ expect(Riak::Crdt::Map).
90
+ to receive(:new).
91
+ with(map_bucket, 'map-key', maps_bucket_type).
92
+ and_return(fake_map).
93
+ twice
94
+
95
+ expect(subject.map).to eq fake_map
96
+ expect(subject.crdt).to eq fake_map
97
+ end
98
+
99
+ it 'refuses to fetch a counter or set' do
100
+ expect{ subject.counter }.
101
+ to raise_error Riak::CrdtError::UnexpectedDataType
102
+ expect{ subject.set }.
103
+ to raise_error Riak::CrdtError::UnexpectedDataType
104
+ end
62
105
  end
63
106
  end
@@ -15,7 +15,7 @@ describe Riak::Search::Schema do
15
15
  resp = instance_double 'Riak::Client::BeefcakeProtobuffsBackend::RpbYokozunaSchema'
16
16
  allow(resp).to receive(:name).and_return(schema_name)
17
17
  allow(resp).to receive(:content).and_return(schema_content)
18
-
18
+
19
19
  resp
20
20
  end
21
21
 
@@ -51,7 +51,7 @@ describe Riak::Search::Schema do
51
51
 
52
52
  it 'raises an error when creating a schema that already exists' do
53
53
  schema_exists_expectation
54
-
54
+
55
55
  expect{ subject.create! schema_content }.to raise_error(Riak::SearchError::SchemaExistsError)
56
56
  end
57
57
 
@@ -80,8 +80,8 @@ describe Riak::SecondaryIndex do
80
80
 
81
81
 
82
82
  @index = Riak::SecondaryIndex.new(
83
- @bucket,
84
- 'asdf',
83
+ @bucket,
84
+ 'asdf',
85
85
  'aaaa'..'zzzz',
86
86
  :max_results => @max_results
87
87
  )
@@ -115,8 +115,8 @@ describe Riak::SecondaryIndex do
115
115
 
116
116
 
117
117
  @index = Riak::SecondaryIndex.new(
118
- @bucket,
119
- 'asdf',
118
+ @bucket,
119
+ 'asdf',
120
120
  'aaaa'..'zzzz',
121
121
  max_results: @max_results,
122
122
  continuation: 'examplecontinuation'
@@ -151,8 +151,8 @@ describe Riak::SecondaryIndex do
151
151
 
152
152
 
153
153
  @index = Riak::SecondaryIndex.new(
154
- @bucket,
155
- 'asdf',
154
+ @bucket,
155
+ 'asdf',
156
156
  'aaaa'..'zzzz',
157
157
  :max_results => @max_results
158
158
  )
@@ -8,7 +8,8 @@ describe Riak::Serializers do
8
8
  end
9
9
 
10
10
  it "deserializes #{serialized} to #{deserialized}" do
11
- expect(described_class.deserialize(type, serialized)).to eq(deserialized)
11
+ expect(described_class.deserialize(type, serialized)).
12
+ to eq(deserialized)
12
13
  end
13
14
 
14
15
  it "round trips properly" do
@@ -19,11 +20,17 @@ describe Riak::Serializers do
19
20
  end
20
21
 
21
22
  it_behaves_like "a serializer", "text/plain", "a string", "a string"
22
- it_behaves_like "a serializer", "application/json", { "a" => 7 }, %q|{"a":7}|
23
- it_behaves_like "a serializer", "application/x-ruby-marshal", { :a => 3 }, Marshal.dump({ :a => 3 })
23
+ it_behaves_like "a serializer", "application/json", { "a" => 7 }, '{"a":7}'
24
+ it_behaves_like "a serializer",
25
+ "application/x-ruby-marshal",
26
+ { a: 3 },
27
+ Marshal.dump({ a: 3 })
24
28
 
25
29
  described_class::YAML_MIME_TYPES.each do |mime_type|
26
- it_behaves_like "a serializer", mime_type, { "a" => 7 }, YAML.dump({ "a" => 7 })
30
+ it_behaves_like "a serializer",
31
+ mime_type,
32
+ { "a" => 7 },
33
+ YAML.dump({ "a" => 7 })
27
34
  end
28
35
 
29
36
  %w[ serialize deserialize ].each do |meth|
@@ -38,7 +45,8 @@ describe Riak::Serializers do
38
45
 
39
46
  describe "plain text serializer" do
40
47
  it 'calls #to_s to convert the object to a string' do
41
- expect(described_class.serialize("text/plain", :a_string)).to eq("a_string")
48
+ expect(described_class.serialize('text/plain', :a_string)).
49
+ to eq('a_string')
42
50
  end
43
51
  end
44
52
 
@@ -80,11 +88,15 @@ describe Riak::Serializers do
80
88
 
81
89
  it 'can be registered' do
82
90
  described_class['application/custom-type-1'] = custom_serializer
83
- expect(described_class['application/custom-type-1']).to be(custom_serializer)
91
+ expect(described_class['application/custom-type-1']).
92
+ to be(custom_serializer)
84
93
  # fail
85
94
  end
86
95
 
87
- it_behaves_like "a serializer", "application/custom-type-a", "foo", "The string is: foo" do
96
+ it_behaves_like "a serializer",
97
+ "application/custom-type-a",
98
+ "foo",
99
+ "The string is: foo" do
88
100
  before(:each) do
89
101
  described_class['application/custom-type-a'] = custom_serializer
90
102
  end
@@ -98,7 +110,12 @@ describe Riak::Serializers do
98
110
  end
99
111
  end
100
112
 
101
- it_behaves_like "a serializer", "application/json; charset=UTF-8", { "a" => 7 }, %q|{"a":7}|
102
- it_behaves_like "a serializer", "application/json ;charset=UTF-8", { "a" => 7 }, %q|{"a":7}|
113
+ it_behaves_like "a serializer",
114
+ "application/json; charset=UTF-8",
115
+ { "a" => 7 },
116
+ '{"a":7}'
117
+ it_behaves_like "a serializer",
118
+ "application/json ;charset=UTF-8",
119
+ { "a" => 7 },
120
+ '{"a":7}'
103
121
  end
104
-
@@ -65,7 +65,7 @@ describe Riak::WalkSpec do
65
65
  it "raises an ArgumentError for invalid arguments" do
66
66
  expect { Riak::WalkSpec.new }.to raise_error(ArgumentError)
67
67
  expect { Riak::WalkSpec.new("foo") }.to raise_error(ArgumentError)
68
- expect { Riak::WalkSpec.new("foo","bar") }.to raise_error(ArgumentError)
68
+ expect { Riak::WalkSpec.new("foo", "bar") }.to raise_error(ArgumentError)
69
69
  end
70
70
  end
71
71
 
@@ -96,7 +96,7 @@ describe Riak::WalkSpec do
96
96
 
97
97
  describe "creating from a list of parameters" do
98
98
  it "detects hashes and WalkSpecs interleaved with other parameters" do
99
- specs = Riak::WalkSpec.normalize(nil,"next",nil,{:bucket => "foo"},Riak::WalkSpec.new({:tag => "child", :keep => true}))
99
+ specs = Riak::WalkSpec.normalize(nil, "next", nil, {:bucket => "foo"}, Riak::WalkSpec.new({:tag => "child", :keep => true}))
100
100
  expect(specs.size).to eq(3)
101
101
  expect(specs).to be_all {|s| s.kind_of?(Riak::WalkSpec) }
102
102
  expect(specs.join("/")).to eq("_,next,_/foo,_,_/_,child,1")
@@ -171,12 +171,14 @@ describe Riak::WalkSpec do
171
171
  end
172
172
 
173
173
  it "matches a walk spec with the same bucket" do
174
- @other.bucket = "foo"; @spec.bucket = "foo"
174
+ @other.bucket = "foo"
175
+ @spec.bucket = "foo"
175
176
  expect(@spec).to be === @other
176
177
  end
177
178
 
178
179
  it "doesn't match a walk spec with a different bucket" do
179
- @other.bucket = "foo"; @spec.bucket = "bar"
180
+ @other.bucket = "foo"
181
+ @spec.bucket = "bar"
180
182
  expect(@spec).not_to be === @other
181
183
  end
182
184
 
@@ -186,12 +188,14 @@ describe Riak::WalkSpec do
186
188
  end
187
189
 
188
190
  it "matches a walk spec with the same tag" do
189
- @other.tag = "next"; @spec.tag = "next"
191
+ @other.tag = "next"
192
+ @spec.tag = "next"
190
193
  expect(@spec).to be === @other
191
194
  end
192
195
 
193
196
  it "doesn't match a walk spec with a different tag" do
194
- @other.tag = "next"; @spec.tag = "previous"
197
+ @other.tag = "next"
198
+ @spec.tag = "previous"
195
199
  expect(@spec).not_to be === @other
196
200
  end
197
201
  end
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,13 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
 
4
4
  if ENV['COVERAGE']
5
5
  require 'simplecov'
6
- SimpleCov.start
6
+ SimpleCov.start do
7
+ if ENV['COVERAGE_SUITE']
8
+ SimpleCov.command_name ENV['COVERAGE_SUITE']
9
+ end
10
+ add_filter 'vendor/'
11
+ end
12
+
7
13
  end
8
14
 
9
15
  require 'rubygems' # Use the gems path only for the spec suite
@@ -20,7 +26,10 @@ Riak.disable_list_keys_warnings = true
20
26
  search_corpus_setup
21
27
  unified_backend_examples
22
28
  test_client
23
- search_config].each do |file|
29
+ search_config
30
+ crdt_search_config
31
+ crdt_search_fixtures
32
+ ].each do |file|
24
33
  require File.join("support", file)
25
34
  end
26
35
 
@@ -0,0 +1,112 @@
1
+ module CrdtSearchConfig
2
+ include SearchConfig
3
+
4
+ def counter_bucket
5
+ @counter_bucket ||= bucket_for :counter
6
+ end
7
+
8
+ def map_bucket
9
+ @map_bucket ||= bucket_for :map
10
+ end
11
+
12
+ def set_bucket
13
+ @set_bucket ||= bucket_for :set
14
+ end
15
+
16
+ def first_counter
17
+ return @first_counter if defined? @first_counter
18
+
19
+ @first_counter = Riak::Crdt::Counter.new counter_bucket, nil
20
+ @first_counter.increment 83475 # BEANS in leet, i guess
21
+
22
+ @first_counter.tap do |c|
23
+ wait_until do
24
+ index.query('counter:83475').results.length > 0
25
+ end
26
+ end
27
+ end
28
+
29
+ def first_map
30
+ return @first_map if defined? @first_map
31
+
32
+ @first_map = Riak::Crdt::Map.new map_bucket, nil
33
+ @first_map.registers['arroz'] = 'frijoles'
34
+
35
+ @first_map.tap do |m|
36
+ wait_until do
37
+ index.query('arroz_register:frijoles').results.length > 0
38
+ end
39
+ end
40
+ end
41
+
42
+ def first_set
43
+ return @first_set if defined? @first_set
44
+
45
+ @first_set = Riak::Crdt::Set.new set_bucket, nil
46
+ @first_set.add 'frijoles'
47
+
48
+ @first_set.tap do |s|
49
+ wait_until do
50
+ index.query('set:frijoles').results.length > 0
51
+ end
52
+ end
53
+ end
54
+
55
+ def configure_crdt_buckets
56
+ return if defined? @crdt_buckets_configured
57
+
58
+ create_index
59
+
60
+ cp = Riak::BucketProperties.new counter_bucket
61
+ mp = Riak::BucketProperties.new map_bucket
62
+ sp = Riak::BucketProperties.new set_bucket
63
+
64
+ cp['search_index'] = index_name
65
+ cp.store
66
+ mp['search_index'] = index_name
67
+ mp.store
68
+ sp['search_index'] = index_name
69
+ sp.store
70
+
71
+ wait_until do
72
+ cp.reload
73
+ cp['search_index'] == index_name
74
+ end
75
+ wait_until do
76
+ mp.reload
77
+ mp['search_index'] == index_name
78
+ end
79
+ wait_until do
80
+ sp.reload
81
+ sp['search_index'] == index_name
82
+ end
83
+
84
+ @crdt_buckets_configured = true
85
+ end
86
+
87
+ private
88
+
89
+ def bucket_for(type)
90
+ @bucket_for ||= Hash.new
91
+ return @bucket_for[type] if @bucket_for[type]
92
+
93
+ test_client.
94
+ bucket_type(Riak::Crdt::DEFAULT_BUCKET_TYPES[type]).
95
+ bucket("crdt-search-#{ type }-#{ random_key }").
96
+ tap do |bucket|
97
+ @bucket_for[type] = bucket
98
+ props = Riak::BucketProperties.new bucket
99
+ props['search_index'] = index.name
100
+ props.store
101
+
102
+ wait_until do
103
+ props.reload
104
+ props['search_index'] == index.name
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ RSpec.configure do |config|
111
+ config.include CrdtSearchConfig, crdt_search_config: true
112
+ end