riak-client 2.2.0.pre1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,5 +1,5 @@
1
1
  module Riak
2
-
2
+
3
3
  # Superclass for all errors raised by riak-client. If you catch an error
4
4
  # that the client raises that isn't descended from this class, please
5
5
  # file a bug. Thanks!
@@ -14,5 +14,25 @@ module Riak
14
14
  super t('crdt.precondition', message: message)
15
15
  end
16
16
  end
17
+
18
+ class UnrecognizedDataType < CrdtError
19
+ def initialize(given_type)
20
+ super t('crdt.unrecognized_type', type: given_type)
21
+ end
22
+ end
23
+
24
+ class UnexpectedDataType < CrdtError
25
+ def initialize(given_type, expected_type)
26
+ super t('crdt.unexpected_type',
27
+ given: given_type,
28
+ expected: expected_type)
29
+ end
30
+ end
31
+
32
+ class NotACrdt < CrdtError
33
+ def initialize
34
+ super t('crdt.not_a_crdt')
35
+ end
36
+ end
17
37
  end
18
38
  end
@@ -25,5 +25,11 @@ module Riak
25
25
  super t('search.index_non_exist', index: index)
26
26
  end
27
27
  end
28
+
29
+ class UnexpectedResultError < SearchError
30
+ def initialize(expected, actual)
31
+ super t('search.unexpected_result', expected: expected, actual: actual)
32
+ end
33
+ end
28
34
  end
29
35
  end
@@ -18,7 +18,7 @@ module Riak
18
18
  parsed = JSON.parse json
19
19
  fresh = nil
20
20
  if parsed['keys']
21
- fresh = new parsed['keys']
21
+ fresh = new parsed['keys']
22
22
  elsif parsed['results']
23
23
  fresh_terms = load_json_terms(parsed)
24
24
  fresh = new fresh_terms.values.flatten
data/lib/riak/link.rb CHANGED
@@ -52,7 +52,7 @@ module Riak
52
52
  end
53
53
 
54
54
  # @return [String] the URL (relative or absolute) of the related resource
55
- def url(new_scheme=false)
55
+ def url(new_scheme = false)
56
56
  return @url unless @bucket
57
57
 
58
58
  if new_scheme
@@ -68,9 +68,11 @@ module Riak
68
68
  @key = unescape($1) if value =~ %r{^/buckets/[^/]+/keys/([^/]+)/?} || value =~ %r{^/[^/]+/[^/]+/([^/]+)/?}
69
69
  end
70
70
 
71
- def inspect; to_s; end
71
+ def inspect
72
+ to_s
73
+ end
72
74
 
73
- def to_s(new_scheme=false)
75
+ def to_s(new_scheme = false)
74
76
  %Q[<#{url(new_scheme)}>; riaktag="#{tag}"]
75
77
  end
76
78
 
@@ -13,9 +13,12 @@ en:
13
13
  increment_by_integer: "Counters can only be incremented or decremented by integers."
14
14
  crdt:
15
15
  precondition_error: "Riak server returned precondition error: %{message}"
16
+ not_a_crdt: "Expected to find a CRDT, but failed."
16
17
  set_removal_without_context: "CRDT Sets do not support removal without context. Store and reload the set before removing members."
17
18
  unknown_field: "Unknown field type %{symbol}, expected one of :counter, :map, or :set."
18
19
  unknown_inner_field: "Unknown field type %{symbol}, expected one of :counter, :flag, :map, :register, or :set."
20
+ unexpected_type: "Tried to initialize %{expected}, found unexpected %{given}."
21
+ unrecognized_type: "Couldn't determine CRDT class for datatype %{type}"
19
22
  serialize_no_ops: "Can't serialize an empty list of CRDT operations."
20
23
  flag:
21
24
  not_boolean: "Flags can only be true or false."
@@ -49,7 +52,7 @@ en:
49
52
  invalid_ssl_verify_mode: "%{invalid} is not a valid :verify_mode option for SSL. Valid options are 'peer' and 'none'."
50
53
  invalid_index_query: "%{value} is not a valid index query term, only Strings, Integers, and Ranges of those are allowed."
51
54
  indexes_unsupported: "Riak server does not support secondary indexes."
52
- loading_bucket: "while loading bucket '%{name}'"
55
+ loading_bucket: "while loading bucket '%{name}'"
53
56
  list_buckets: "Riak::Client#buckets is an expensive operation that should not be used in production.\n %{backtrace}"
54
57
  list_keys: "Riak::Bucket#keys is an expensive operation that should not be used in production.\n %{backtrace}"
55
58
  missing_block: "A block must be given."
@@ -75,6 +78,7 @@ en:
75
78
  index_non_exist: "The index %{index} doesn't exist."
76
79
  index_argument_error: "invalid argument %{index} is not a Riak::Search::Index or a String"
77
80
  schema_exists: "The schema %{name} already exists."
81
+ unexpected_result: "Expected %{expected} but got %{actual} from search result."
78
82
  search_unsupported: "Riak server does not support search."
79
83
  search_docs_require_id: "Search index documents must include the 'id' field."
80
84
  search_remove_requires_id_or_query: "Search index documents to be removed must have 'id' or 'query' keys."
@@ -85,7 +85,7 @@ module Riak
85
85
  else
86
86
  bucket = maybe_escape(bucket)
87
87
  end
88
-
88
+
89
89
  warn(t('full_bucket_mapred', :backtrace => caller.join("\n "))) unless Riak.disable_list_keys_warnings
90
90
  @inputs = {:bucket => bucket, :key_filters => params.first }
91
91
  else
@@ -246,13 +246,13 @@ module Riak
246
246
 
247
247
  # Processes a {RObject} into a single-object {MapReduce} input, whether it
248
248
  # has a bucket type or not.
249
- def robject_input(obj, key_data='')
249
+ def robject_input(obj, key_data = '')
250
250
  bucket = obj.bucket
251
251
  if bucket.needs_type?
252
252
  return [
253
- maybe_escape(bucket.name),
254
- maybe_escape(obj.key),
255
- key_data,
253
+ maybe_escape(bucket.name),
254
+ maybe_escape(obj.key),
255
+ key_data,
256
256
  maybe_escape(bucket.type.name)
257
257
  ]
258
258
  end
@@ -263,13 +263,13 @@ module Riak
263
263
  # Processes a key into a single-object {MapReduce} input, doing the correct
264
264
  # thing if the bucket argument is a {String}, {Bucket}, or a
265
265
  # {BucketTyped::Bucket}.
266
- def key_input(key, bucket, key_data='')
266
+ def key_input(key, bucket, key_data = '')
267
267
  kd = []
268
268
  kd << key_data unless key_data.blank?
269
269
 
270
270
  if bucket.is_a? String
271
271
  return [
272
- maybe_escape(bucket),
272
+ maybe_escape(bucket),
273
273
  maybe_escape(key)
274
274
  ] + kd
275
275
  elsif bucket.needs_type?
@@ -28,7 +28,7 @@ module Riak
28
28
  :less_than => 1,
29
29
  :greater_than_eq => 1,
30
30
  :less_than_eq => 1,
31
- :between => [2,3],
31
+ :between => [2, 3],
32
32
  :matches => 1,
33
33
  :neq => 1,
34
34
  :eq => 1,
@@ -52,7 +52,7 @@ module Riak
52
52
  # end
53
53
  LOGICAL_OPERATIONS = %w{and or not}
54
54
 
55
- FILTERS.each do |f,arity|
55
+ FILTERS.each do |f, arity|
56
56
  arities = [arity].flatten
57
57
 
58
58
  define_method(f) { |*args|
@@ -31,7 +31,7 @@ module Riak
31
31
  # @option options [String, Array, Hash] :function In the case of Javascript, a literal function in a string, or a hash with :bucket and :key. In the case of Erlang, an Array of [module, function]. For a :link phase, a hash including any of :bucket, :tag or a WalkSpec.
32
32
  # @option options [Boolean] :keep (false) whether to return the results of this phase
33
33
  # @option options [Array] :arg (nil) any extra static arguments to pass to the phase
34
- def initialize(options={})
34
+ def initialize(options = {})
35
35
  self.type = options[:type]
36
36
  self.language = options[:language] || "javascript"
37
37
  self.function = options[:function]
@@ -70,7 +70,7 @@ module Riak
70
70
 
71
71
  # Converts the phase to its JSON-compatible representation for job invocation.
72
72
  # @return [Hash] a Hash-equivalent of the phase
73
- def as_json(options=nil)
73
+ def as_json(options = nil)
74
74
  obj = case type
75
75
  when :map, :reduce
76
76
  defaults = {"language" => language, "keep" => keep}
@@ -0,0 +1,7 @@
1
+ require 'riak'
2
+
3
+ module Riak
4
+ # @abstract Parent module for preflist items
5
+ module PreflistItem
6
+ end
7
+ end
data/lib/riak/rcontent.rb CHANGED
@@ -52,7 +52,7 @@ module Riak
52
52
  end
53
53
 
54
54
  def indexes=(hash)
55
- @indexes = hash.inject(new_index_hash) do |h, (k,v)|
55
+ @indexes = hash.inject(new_index_hash) do |h, (k, v)|
56
56
  h[k].merge([*v])
57
57
  h
58
58
  end
@@ -68,9 +68,9 @@ module Riak
68
68
  @data
69
69
  end
70
70
 
71
- # @param [Object] new_data unmarshaled form of the data to be stored in
72
- # Riak. Object will be serialized using {#serialize} if a known
73
- # content_type is used. Setting this overrides values stored with
71
+ # @param [Object] new_data unmarshaled form of the data to be stored in
72
+ # Riak. Object will be serialized using {#serialize} if a known
73
+ # content_type is used. Setting this overrides values stored with
74
74
  # {#raw_data=}
75
75
  # @return [Object] the object stored
76
76
  def data=(new_data)
@@ -142,14 +142,14 @@ module Riak
142
142
  extract_if_present(metadata, 'content-type', :content_type)
143
143
  extract_if_present(metadata, 'X-Riak-Last-Modified', :last_modified) { |v| Time.httpdate( v ) }
144
144
  extract_if_present(metadata, 'index', :indexes) do |entries|
145
- Hash[ entries.map {|k,v| [k, Set.new(Array(v))] } ]
145
+ Hash[ entries.map {|k, v| [k, Set.new(Array(v))] } ]
146
146
  end
147
147
  extract_if_present(metadata, 'Links', :links) do |links|
148
148
  Set.new( links.map { |l| Link.new(*l) } )
149
149
  end
150
150
  extract_if_present(metadata, 'X-Riak-Meta', :meta) do |meta|
151
151
  Hash[
152
- meta.map do |k,v|
152
+ meta.map do |k, v|
153
153
  [k.sub(%r{^x-riak-meta-}i, ''), [v]]
154
154
  end
155
155
  ]
@@ -158,7 +158,7 @@ module Riak
158
158
  end
159
159
 
160
160
  private
161
- def extract_if_present(hash, key, attribute=nil)
161
+ def extract_if_present(hash, key, attribute = nil)
162
162
  if hash[key].present?
163
163
  attribute ||= key
164
164
  value = block_given? ? yield(hash[key]) : hash[key]
@@ -167,7 +167,7 @@ module Riak
167
167
  end
168
168
 
169
169
  def new_index_hash
170
- Hash.new {|h,k| h[k] = Set.new }
170
+ Hash.new {|h, k| h[k] = Set.new }
171
171
  end
172
172
  end
173
173
  end
data/lib/riak/robject.rb CHANGED
@@ -12,7 +12,7 @@ module Riak
12
12
  # the Riak database, the base unit of data manipulation.
13
13
  class RObject
14
14
  include Util::Translation
15
- extend Util::Translation
15
+ extend Util::Translation
16
16
  include Util::Escape
17
17
  extend Util::Escape
18
18
  extend Forwardable
@@ -23,13 +23,15 @@ module Riak
23
23
  # @return [String] the key of this object within its bucket
24
24
  attr_accessor :key
25
25
 
26
- # @return [String] the Riak vector clock for the object
26
+ # @return [String] the Riak causal context/vector clock for the object
27
27
  attr_accessor :vclock
28
28
 
29
+ alias :causal_context :vclock
30
+ alias :causal_context= :vclock=
29
31
  alias :vector_clock :vclock
30
32
  alias :vector_clock= :vclock=
31
33
 
32
- # @return [Boolean] whether to attempt to prevent stale writes using
34
+ # @return [Boolean] whether to attempt to prevent stale writes using
33
35
  # conditional PUT semantics, If-None-Match: * or If-Match: etag
34
36
  # @see http://wiki.basho.com/display/RIAK/REST+API#RESTAPI-Storeaneworexistingobjectwithakey Riak Rest API Docs
35
37
  attr_accessor :prevent_stale_writes
@@ -94,7 +96,7 @@ module Riak
94
96
  # @param [String] key the key at which the object resides. If nil, a key will be assigned when the object is saved.
95
97
  # @yield self the new RObject
96
98
  # @see Bucket#get
97
- def initialize(bucket, key=nil)
99
+ def initialize(bucket, key = nil)
98
100
  @bucket, @key = bucket, key
99
101
 
100
102
  # fix a require-loop
@@ -108,8 +110,8 @@ module Riak
108
110
  end
109
111
 
110
112
  # Load object data from a map/reduce response item.
111
- # This method is used by RObject::load_from_mapreduce to instantiate the necessary
112
- # objects.
113
+ # This method is used by RObject::load_from_mapreduce to instantiate the
114
+ # necessary objects.
113
115
  # @param [Hash] response a response from {Riak::MapReduce}
114
116
  # @return [RObject] self
115
117
  def load_from_mapreduce(response)
@@ -124,17 +126,21 @@ module Riak
124
126
 
125
127
  # Store the object in Riak
126
128
  # @param [Hash] options query parameters
127
- # @option options [Fixnum] :r the "r" parameter (Read quorum for the implicit read performed when validating the store operation)
129
+ # @option options [Fixnum] :r the "r" parameter (Read quorum for the
130
+ # implicit read performed when validating the store operation)
128
131
  # @option options [Fixnum] :w the "w" parameter (Write quorum)
129
132
  # @option options [Fixnum] :dw the "dw" parameter (Durable-write quorum)
130
- # @option options [Boolean] :returnbody (true) whether to return the result of a successful write in the body of the response. Set to false for fire-and-forget updates, set to true to immediately have access to the object's stored representation.
133
+ # @option options [Boolean] :returnbody (true) whether to return the result
134
+ # of a successful write in the body of the response. Set to false for
135
+ # fire-and-forget updates, set to true to immediately have access to the
136
+ # object's stored representation.
131
137
  # @return [Riak::RObject] self
132
138
  # @raise [ArgumentError] if the content_type is not defined
133
139
  # @raise [Conflict] if the object has siblings
134
- def store(options={})
135
- raise Conflict, self if conflict?
136
- raise ArgumentError, t("content_type_undefined") unless content_type.present?
137
- raise ArgumentError, t("zero_length_key") if key == ''
140
+ def store(options = {})
141
+ fail Conflict, self if conflict?
142
+ fail ArgumentError, t('content_type_undefined') unless content_type.present?
143
+ fail ArgumentError, t('zero_length_key') if key == ''
138
144
  @bucket.client.store_object(self, default(options))
139
145
  self
140
146
  end
@@ -146,7 +152,7 @@ module Riak
146
152
  # the vclock is not present, useful for reloading the object after
147
153
  # a store (not passed in the query params)
148
154
  # @return [Riak::RObject] self
149
- def reload(options={})
155
+ def reload(options = {})
150
156
  force = options.delete(:force)
151
157
  return self unless @key && (@vclock || force)
152
158
  self.etag = self.last_modified = nil if force
@@ -158,7 +164,7 @@ module Riak
158
164
  # Delete the object from Riak and freeze this instance. Will work whether or not the object actually
159
165
  # exists in the Riak database.
160
166
  # @see Bucket#delete
161
- def delete(options={})
167
+ def delete(options = {})
162
168
  return if key.blank?
163
169
  options[:vclock] = vclock if vclock
164
170
  @bucket.delete(key, default(options))
@@ -197,6 +203,13 @@ module Riak
197
203
  Link.new(@bucket.name, @key, tag)
198
204
  end
199
205
 
206
+ # Retrieves a preflist for this RObject; useful for
207
+ # figuring out where in the cluster it is stored.
208
+ # @return [Array<PreflistItem>] an array of preflist entries
209
+ def preflist(options = {})
210
+ bucket.get_preflist key, options
211
+ end
212
+
200
213
  private
201
214
 
202
215
  def default(options)
data/lib/riak/search.rb CHANGED
@@ -8,3 +8,4 @@ require 'riak/search/query'
8
8
  require 'riak/search/result_collection'
9
9
  require 'riak/search/result_document'
10
10
  require 'riak/search/schema'
11
+ require 'riak/errors/search_error'
@@ -6,9 +6,14 @@ module Riak::Search
6
6
  # bucket or bucket type property must be configured to use the index in order
7
7
  # for new and updated documents to be indexed and searchable.
8
8
  class Index
9
+ # @!attribute [r] name
9
10
  # @return [String] the name of the index
10
11
  attr_reader :name
11
12
 
13
+ # @!attribute [r] client
14
+ # @return [Riak::Client] the client to operate on the index with
15
+ attr_reader :client
16
+
12
17
  # Initializes an index object, that may or may not exist.
13
18
  #
14
19
  # @param [Riak::Client] client the client connected to the Riak cluster
@@ -36,13 +41,13 @@ module Riak::Search
36
41
 
37
42
  # Attempt to create this index
38
43
  #
39
- # @raise [Riak::SearchError::IndexExistsError] if an index with the given
44
+ # @raise [Riak::SearchError::IndexExistsError] if an index with the given
40
45
  # name already exists
41
- def create!(schema = nil, n_val = nil)
46
+ def create!(schema = nil, n_val = nil, timeout = nil)
42
47
  raise Riak::SearchError::IndexExistsError.new name if exists?
43
48
 
44
49
  @client.backend do |b|
45
- b.create_search_index name, schema, n_val
50
+ b.create_search_index name, schema, n_val, timeout
46
51
  end
47
52
 
48
53
  @index_data = nil
@@ -50,6 +55,15 @@ module Riak::Search
50
55
  true
51
56
  end
52
57
 
58
+ # Create a {Riak::Search::Query} using this index and client
59
+ #
60
+ # @param [String] term the query term
61
+ # @param [Hash] options a hash of options to set attributes on the query
62
+ # @return [Riak::Search::Query] a query using this index
63
+ def query(term, options = { })
64
+ Riak::Search::Query.new(@client, self, term, options)
65
+ end
66
+
53
67
  private
54
68
  def index_data
55
69
  return @index_data if defined?(@index_data) && @index_data
@@ -3,7 +3,7 @@ require 'riak/search'
3
3
  module Riak::Search
4
4
  # A {Riak::Search::Query} wraps a Solr query for Riak Search 2.
5
5
  class Query
6
-
6
+
7
7
  # @!attribute rows
8
8
  # @return [Numeric] the number of rows to return from the query
9
9
  attr_accessor :rows
@@ -36,6 +36,14 @@ module Riak::Search
36
36
  # @return [String] the term to query
37
37
  attr_reader :term
38
38
 
39
+ # @!attribute [r] index
40
+ # @return [Riak::Search::Index] the index to query against
41
+ attr_reader :index
42
+
43
+ # @!attribute [r] client
44
+ # @return [Riak::Client] the client to query against
45
+ attr_reader :client
46
+
39
47
  # Initializes a query object.
40
48
  #
41
49
  # @param [Riak::Client] client the client connected to the Riak cluster
@@ -43,7 +51,7 @@ module Riak::Search
43
51
  # {Riak::Search::Index} instance or a {String}
44
52
  # @param [String] term the query term
45
53
  # @param [Hash] options a hash of options to quickly set attributes
46
- def initialize(client, index, term, options={ })
54
+ def initialize(client, index, term, options = { })
47
55
  @client = client
48
56
  validate_index index
49
57
  @term = term
@@ -63,7 +71,7 @@ module Riak::Search
63
71
  end
64
72
 
65
73
  private
66
-
74
+
67
75
  def index_name
68
76
  return @index if @index.is_a? String
69
77
  return @index.name
@@ -95,14 +103,14 @@ module Riak::Search
95
103
  @df = %w{text}
96
104
  @op = nil
97
105
  @fl = %w{_yz_rb _yz_rk _yz_rt score}
98
-
106
+
99
107
  @presort = nil
100
108
  end
101
109
 
102
110
  def consume_options
103
111
  @rows = @options[:rows] if @options[:rows]
104
112
  @start = @options[:start] if @options[:start]
105
-
113
+
106
114
  @sort = @options[:sort] if @options[:sort]
107
115
  @filter = @options[:filter] if @options[:filter]
108
116
 
@@ -112,7 +120,7 @@ module Riak::Search
112
120
  end
113
121
 
114
122
  def prepare_options
115
- configured_options = {
123
+ configured_options = {
116
124
  rows: @rows,
117
125
  start: @start,
118
126
  sort: @sort,