google-cloud-bigtable 0.6.2 → 0.7.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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/CONTRIBUTING.md +1 -1
  4. data/lib/google-cloud-bigtable.rb +19 -21
  5. data/lib/google/cloud/bigtable.rb +11 -17
  6. data/lib/google/cloud/bigtable/app_profile.rb +148 -82
  7. data/lib/google/cloud/bigtable/app_profile/job.rb +5 -8
  8. data/lib/google/cloud/bigtable/app_profile/list.rb +11 -5
  9. data/lib/google/cloud/bigtable/chunk_processor.rb +23 -35
  10. data/lib/google/cloud/bigtable/cluster.rb +38 -11
  11. data/lib/google/cloud/bigtable/cluster/job.rb +3 -7
  12. data/lib/google/cloud/bigtable/cluster/list.rb +20 -18
  13. data/lib/google/cloud/bigtable/column_family.rb +22 -229
  14. data/lib/google/cloud/bigtable/column_family_map.rb +426 -0
  15. data/lib/google/cloud/bigtable/column_range.rb +9 -1
  16. data/lib/google/cloud/bigtable/convert.rb +12 -4
  17. data/lib/google/cloud/bigtable/errors.rb +4 -1
  18. data/lib/google/cloud/bigtable/gc_rule.rb +184 -65
  19. data/lib/google/cloud/bigtable/instance.rb +136 -126
  20. data/lib/google/cloud/bigtable/instance/cluster_map.rb +9 -7
  21. data/lib/google/cloud/bigtable/instance/job.rb +4 -3
  22. data/lib/google/cloud/bigtable/instance/list.rb +14 -9
  23. data/lib/google/cloud/bigtable/longrunning_job.rb +6 -0
  24. data/lib/google/cloud/bigtable/mutation_entry.rb +19 -23
  25. data/lib/google/cloud/bigtable/mutation_operations.rb +82 -29
  26. data/lib/google/cloud/bigtable/policy.rb +9 -5
  27. data/lib/google/cloud/bigtable/project.rb +62 -140
  28. data/lib/google/cloud/bigtable/read_modify_write_rule.rb +9 -4
  29. data/lib/google/cloud/bigtable/read_operations.rb +28 -41
  30. data/lib/google/cloud/bigtable/routing_policy.rb +171 -0
  31. data/lib/google/cloud/bigtable/row.rb +18 -7
  32. data/lib/google/cloud/bigtable/row_filter.rb +49 -20
  33. data/lib/google/cloud/bigtable/row_filter/chain_filter.rb +71 -43
  34. data/lib/google/cloud/bigtable/row_filter/condition_filter.rb +4 -1
  35. data/lib/google/cloud/bigtable/row_filter/interleave_filter.rb +74 -43
  36. data/lib/google/cloud/bigtable/row_filter/simple_filter.rb +22 -7
  37. data/lib/google/cloud/bigtable/row_range.rb +5 -0
  38. data/lib/google/cloud/bigtable/rows_mutator.rb +14 -17
  39. data/lib/google/cloud/bigtable/rows_reader.rb +18 -14
  40. data/lib/google/cloud/bigtable/sample_row_key.rb +5 -2
  41. data/lib/google/cloud/bigtable/service.rb +161 -242
  42. data/lib/google/cloud/bigtable/status.rb +76 -0
  43. data/lib/google/cloud/bigtable/table.rb +141 -236
  44. data/lib/google/cloud/bigtable/table/cluster_state.rb +7 -1
  45. data/lib/google/cloud/bigtable/table/list.rb +14 -7
  46. data/lib/google/cloud/bigtable/value_range.rb +5 -0
  47. data/lib/google/cloud/bigtable/version.rb +1 -1
  48. metadata +27 -25
  49. data/lib/google/cloud/bigtable/table/column_family_map.rb +0 -70
@@ -19,16 +19,17 @@ module Google
19
19
  module Cloud
20
20
  module Bigtable
21
21
  class Instance
22
+ ##
22
23
  # Instance::ClusterMap is a hash with cluster name and gRPC object.
23
24
  # It is used to create an instance.
24
25
  # @example Create
25
26
  #
26
27
  # clusters = Google::Cloud::Bigtable::Instance::ClusterMap.new
27
28
  #
28
- # clusters.add("cluster-1", 3, location: "us-east1-b", storage_type: :SSD)
29
+ # clusters.add("cluster-1", "us-east1-b", nodes: 3, storage_type: :SSD)
29
30
  #
30
31
  # # Or
31
- # cluster.add("cluster-2", 1)
32
+ # clusters.add("cluster-2", "us-east1-b")
32
33
  #
33
34
  class ClusterMap < DelegateClass(::Hash)
34
35
  # @private
@@ -36,9 +37,10 @@ module Google
36
37
  # Creates a new Instance::ClusterMap with an hash of Cluster name and
37
38
  # cluster grpc instances.
38
39
  def initialize value = {}
39
- super(value)
40
+ super value
40
41
  end
41
42
 
43
+ ##
42
44
  # Adds a cluster to a map
43
45
  #
44
46
  # @param name [String] Cluster name
@@ -53,15 +55,15 @@ module Google
53
55
  # *`:HDD`(Magnetic drive (HDD) storage should be used)
54
56
  #
55
57
  # If not set then default will set to `:STORAGE_TYPE_UNSPECIFIED`
56
-
58
+ #
57
59
  def add name, location, nodes: nil, storage_type: nil
58
60
  attrs = {
59
- serve_nodes: nodes,
60
- location: location,
61
+ serve_nodes: nodes,
62
+ location: location,
61
63
  default_storage_type: storage_type
62
64
  }.delete_if { |_, v| v.nil? }
63
65
 
64
- self[name] = Google::Bigtable::Admin::V2::Cluster.new(attrs)
66
+ self[name] = Google::Bigtable::Admin::V2::Cluster.new attrs
65
67
  end
66
68
  end
67
69
  end
@@ -17,6 +17,7 @@ module Google
17
17
  module Cloud
18
18
  module Bigtable
19
19
  class Instance
20
+ ##
20
21
  # # Job
21
22
  #
22
23
  # A resource representing the long-running, asynchronous processing of
@@ -57,8 +58,8 @@ module Google
57
58
  # instance = job.instance
58
59
  # end
59
60
  #
60
- #
61
61
  class Job < LongrunningJob
62
+ ##
62
63
  # Get the instance object from operation results.
63
64
  #
64
65
  # @return [Google::Cloud::Bigtable::Instance, nil] The Instance instance, or
@@ -71,7 +72,7 @@ module Google
71
72
  #
72
73
  # job = bigtable.create_instance(
73
74
  # "my-instance",
74
- # "Instance for user data",
75
+ # display_name: "Instance for user data",
75
76
  # type: :DEVELOPMENT,
76
77
  # labels: { "env" => "dev"}
77
78
  # ) do |clusters|
@@ -88,7 +89,7 @@ module Google
88
89
  # instance = job.instance
89
90
  #
90
91
  def instance
91
- Instance.from_grpc(results, service) if results
92
+ Instance.from_grpc results, service if results
92
93
  end
93
94
  end
94
95
  end
@@ -21,6 +21,7 @@ module Google
21
21
  module Cloud
22
22
  module Bigtable
23
23
  class Instance
24
+ ##
24
25
  # Instance::List is a special-case array with additional
25
26
  # values and failed_locations.
26
27
  class List < DelegateClass(::Array)
@@ -28,10 +29,12 @@ module Google
28
29
  # The gRPC Service object.
29
30
  attr_accessor :service
30
31
 
32
+ ##
31
33
  # If not empty, indicates that more records match
32
34
  # the request and this value should be passed to continue.
33
35
  attr_accessor :token
34
36
 
37
+ ##
35
38
  # Locations from which Instance information could not be retrieved,
36
39
  # due to an outage or some other transient condition.
37
40
  # Instances whose Clusters are all in one of the failed locations
@@ -43,9 +46,10 @@ module Google
43
46
  # Creates a new Instance::List with an array of
44
47
  # Instance instances.
45
48
  def initialize arr = []
46
- super(arr)
49
+ super arr
47
50
  end
48
51
 
52
+ ##
49
53
  # Whether there is a next page of instances.
50
54
  #
51
55
  # @return [Boolean]
@@ -59,10 +63,12 @@ module Google
59
63
  # if instances.next?
60
64
  # next_instances = instances.next
61
65
  # end
66
+ #
62
67
  def next?
63
68
  !token.nil?
64
69
  end
65
70
 
71
+ ##
66
72
  # Retrieves the next page of instances.
67
73
  #
68
74
  # @return [Instance::List] The list of instances.
@@ -80,14 +86,13 @@ module Google
80
86
  def next
81
87
  return nil unless next?
82
88
  ensure_service!
83
- grpc = service.list_instances(token: token)
84
- next_list = self.class.from_grpc(grpc, service)
85
- if failed_locations
86
- next_list.failed_locations.concat(failed_locations.map(&:to_s))
87
- end
89
+ grpc = service.list_instances token: token
90
+ next_list = self.class.from_grpc grpc, service
91
+ next_list.failed_locations.concat(failed_locations.map(&:to_s)) if failed_locations
88
92
  next_list
89
93
  end
90
94
 
95
+ ##
91
96
  # Retrieves remaining results by repeatedly invoking {#next} until
92
97
  # {#next?} returns `false`. Calls the given block once for each
93
98
  # result, which is passed as the argument to the block.
@@ -122,7 +127,7 @@ module Google
122
127
  # end
123
128
  #
124
129
  def all
125
- return enum_for(:all) unless block_given?
130
+ return enum_for :all unless block_given?
126
131
 
127
132
  results = self
128
133
  loop do
@@ -136,10 +141,10 @@ module Google
136
141
  # New Instance::List from a Google::Bigtable::Admin::V2::Instance object.
137
142
  def self.from_grpc grpc, service
138
143
  instances = List.new(Array(grpc.instances).map do |instance|
139
- Instance.from_grpc(instance, service)
144
+ Instance.from_grpc instance, service
140
145
  end)
141
146
  token = grpc.next_page_token
142
- token = nil if token == "".freeze
147
+ token = nil if token == ""
143
148
  instances.token = token
144
149
  instances.service = service
145
150
  instances.failed_locations = grpc.failed_locations.map(&:to_s)
@@ -18,6 +18,7 @@
18
18
  module Google
19
19
  module Cloud
20
20
  module Bigtable
21
+ ##
21
22
  # # LongrunningJob
22
23
  #
23
24
  # A resource representing the long-running, asynchronous processing operation.
@@ -35,6 +36,7 @@ module Google
35
36
  # The gRPC Service object.
36
37
  attr_accessor :service
37
38
 
39
+ ##
38
40
  # Get result object of the operation.
39
41
  #
40
42
  # @return [Object, nil]
@@ -46,6 +48,7 @@ module Google
46
48
  @grpc.results
47
49
  end
48
50
 
51
+ ##
49
52
  # Checks if the processing of the instance operation is complete.
50
53
  #
51
54
  # @return [boolean] `true` when complete, `false` otherwise.
@@ -54,6 +57,7 @@ module Google
54
57
  @grpc.done?
55
58
  end
56
59
 
60
+ ##
57
61
  # Checks if the processing of the instance operation has errored.
58
62
  #
59
63
  # @return [boolean] `true` when errored, `false` otherwise.
@@ -74,6 +78,7 @@ module Google
74
78
  @grpc.error
75
79
  end
76
80
 
81
+ ##
77
82
  # Reloads the job with current data from the long-running,
78
83
  # asynchronous processing of an operation.
79
84
  #
@@ -84,6 +89,7 @@ module Google
84
89
  self
85
90
  end
86
91
 
92
+ ##
87
93
  # Reloads the job until the operation is complete. The delay between
88
94
  # reloads will incrementally increase.
89
95
  #
@@ -18,6 +18,7 @@
18
18
  module Google
19
19
  module Cloud
20
20
  module Bigtable
21
+ ##
21
22
  # # MutationEntry
22
23
  #
23
24
  # MutationEntry is a chainable structure that holds data for different
@@ -56,19 +57,23 @@ module Google
56
57
  class MutationEntry
57
58
  attr_accessor :row_key
58
59
 
60
+ # @private
59
61
  # mutations gRPC list
60
62
  # @return [Array<Google::Bigtable::V2::Mutation>]
61
63
  attr_accessor :mutations
62
64
 
65
+ ##
63
66
  # Creates a mutation entry instance.
64
67
  #
65
68
  # @param row_key [String]
69
+ #
66
70
  def initialize row_key = nil
67
71
  @row_key = row_key
68
72
  @mutations = []
69
73
  @retryable = true
70
74
  end
71
75
 
76
+ ##
72
77
  # Add SetCell mutation to list of mutations.
73
78
  #
74
79
  # A mutation that sets the value of the specified cell.
@@ -107,11 +112,11 @@ module Google
107
112
  #
108
113
  def set_cell family, qualifier, value, timestamp: nil
109
114
  # If value is integer, covert it to a 64-bit signed big-endian integer.
110
- value = [value].pack("q>") if value.is_a?(Integer)
115
+ value = [value].pack "q>" if value.is_a? Integer
111
116
  options = {
112
- family_name: family,
117
+ family_name: family,
113
118
  column_qualifier: qualifier,
114
- value: value
119
+ value: value
115
120
  }
116
121
 
117
122
  if timestamp
@@ -122,6 +127,7 @@ module Google
122
127
  self
123
128
  end
124
129
 
130
+ ##
125
131
  # Add DeleteFromColumn entry to list of mutations.
126
132
  #
127
133
  # A mutation that deletes cells from the specified column, optionally
@@ -169,27 +175,19 @@ module Google
169
175
  # timestamp_from: timestamp_micros - 5000000
170
176
  # )
171
177
  #
172
- def delete_cells \
173
- family,
174
- qualifier,
175
- timestamp_from: nil,
176
- timestamp_to: nil
177
- grpc = Google::Bigtable::V2::Mutation::DeleteFromColumn.new(
178
- family_name: family,
179
- column_qualifier: qualifier
180
- )
178
+ def delete_cells family, qualifier, timestamp_from: nil, timestamp_to: nil
179
+ grpc = Google::Bigtable::V2::Mutation::DeleteFromColumn.new family_name: family, column_qualifier: qualifier
181
180
  if timestamp_from || timestamp_to
182
181
  time_range = Google::Bigtable::V2::TimestampRange.new
183
182
  time_range.start_timestamp_micros = timestamp_from if timestamp_from
184
183
  time_range.end_timestamp_micros = timestamp_to if timestamp_to
185
184
  grpc.time_range = time_range
186
185
  end
187
- @mutations << Google::Bigtable::V2::Mutation.new(
188
- delete_from_column: grpc
189
- )
186
+ @mutations << Google::Bigtable::V2::Mutation.new(delete_from_column: grpc)
190
187
  self
191
188
  end
192
189
 
190
+ ##
193
191
  # Add DeleteFromFamily to list of mutations.
194
192
  #
195
193
  # A mutation that deletes all cells from the specified column family.
@@ -204,12 +202,11 @@ module Google
204
202
  # entry.delete_from_family("cf-1")
205
203
  #
206
204
  def delete_from_family family
207
- @mutations << Google::Bigtable::V2::Mutation.new(
208
- delete_from_family: { family_name: family }
209
- )
205
+ @mutations << Google::Bigtable::V2::Mutation.new(delete_from_family: { family_name: family })
210
206
  self
211
207
  end
212
208
 
209
+ ##
213
210
  # Add DeleteFromRow entry to list of mutations
214
211
  #
215
212
  # A Mutation which deletes all cells from the containing row.
@@ -225,6 +222,7 @@ module Google
225
222
  self
226
223
  end
227
224
 
225
+ ##
228
226
  # Mutation entry is retryable or not based on set_cell value.
229
227
  #
230
228
  # @return [Boolean]
@@ -233,10 +231,11 @@ module Google
233
231
  @retryable
234
232
  end
235
233
 
234
+ ##
236
235
  # Number of mutations
237
236
  #
238
237
  # @return [Integer]
239
-
238
+ #
240
239
  def length
241
240
  @mutations.length
242
241
  end
@@ -248,10 +247,7 @@ module Google
248
247
  # @return [Google::Bigtable::V2::MutateRowsRequest::Entry]
249
248
  #
250
249
  def to_grpc
251
- Google::Bigtable::V2::MutateRowsRequest::Entry.new(
252
- row_key: @row_key,
253
- mutations: @mutations
254
- )
250
+ Google::Bigtable::V2::MutateRowsRequest::Entry.new row_key: @row_key, mutations: @mutations
255
251
  end
256
252
  end
257
253
  end
@@ -19,10 +19,12 @@ require "google/cloud/bigtable/mutation_entry"
19
19
  require "google/cloud/bigtable/row"
20
20
  require "google/cloud/bigtable/rows_mutator"
21
21
  require "google/cloud/bigtable/read_modify_write_rule"
22
+ require "google/cloud/bigtable/status"
22
23
 
23
24
  module Google
24
25
  module Cloud
25
26
  module Bigtable
27
+ ##
26
28
  # # MutationOperations
27
29
  #
28
30
  # Collection of mutations APIs.
@@ -33,6 +35,7 @@ module Google
33
35
  # * Check and mutate row
34
36
  #
35
37
  module MutationOperations
38
+ ##
36
39
  # Mutate row.
37
40
  #
38
41
  # Mutates a row atomically. Cells in the row are left
@@ -45,18 +48,18 @@ module Google
45
48
  # Mutation entry with row key and list of mutations.
46
49
  # @return [Boolean]
47
50
  # @example Single mutation on row.
48
- # require "google/cloud"
51
+ # require "google/cloud/bigtable"
49
52
  #
50
53
  # bigtable = Google::Cloud::Bigtable.new
51
54
  #
52
55
  # table = bigtable.table("my-instance", "my-table")
53
56
  #
54
- # entry = table.new_mutation_entry.new("user-1")
57
+ # entry = table.new_mutation_entry("user-1")
55
58
  # entry.set_cell("cf1", "field1", "XYZ")
56
59
  # table.mutate_row(entry)
57
60
  #
58
61
  # @example Multiple mutations on row.
59
- # require "google/cloud"
62
+ # require "google/cloud/bigtable"
60
63
  #
61
64
  # bigtable = Google::Cloud::Bigtable.new
62
65
  #
@@ -73,15 +76,11 @@ module Google
73
76
  # table.mutate_row(entry)
74
77
  #
75
78
  def mutate_row entry
76
- client.mutate_row(
77
- path,
78
- entry.row_key,
79
- entry.mutations,
80
- app_profile_id: @app_profile_id
81
- )
79
+ client.mutate_row path, entry.row_key, entry.mutations, app_profile_id: @app_profile_id
82
80
  true
83
81
  end
84
82
 
83
+ ##
85
84
  # Mutates multiple rows in a batch. Each individual row is mutated
86
85
  # atomically as in MutateRow, but the entire batch is not executed
87
86
  # atomically.
@@ -95,7 +94,7 @@ module Google
95
94
  # @return [Array<Google::Bigtable::V2::MutateRowsResponse::Entry>]
96
95
  #
97
96
  # @example
98
- # require "google/cloud"
97
+ # require "google/cloud/bigtable"
99
98
  #
100
99
  # bigtable = Google::Cloud::Bigtable.new
101
100
  #
@@ -104,12 +103,18 @@ module Google
104
103
  # entries = []
105
104
  # entries << table.new_mutation_entry("row-1").set_cell("cf1", "field1", "XYZ")
106
105
  # entries << table.new_mutation_entry("row-2").set_cell("cf1", "field1", "ABC")
107
- # table.mutate_row(entries)
106
+ # responses = table.mutate_rows(entries)
107
+ #
108
+ # responses.each do |response|
109
+ # puts response.status.description
110
+ # end
108
111
  #
109
112
  def mutate_rows entries
110
- RowsMutator.new(self, entries).apply_mutations
113
+ statuses = RowsMutator.new(self, entries).apply_mutations
114
+ statuses.map { |s| Response.from_grpc s }
111
115
  end
112
116
 
117
+ ##
113
118
  # Modifies a row atomically on the server. The method reads the latest
114
119
  # existing timestamp and value from the specified columns and writes a new
115
120
  # entry based on pre-defined read/modify/write rules. The new value for the
@@ -118,7 +123,8 @@ module Google
118
123
  #
119
124
  # @param key [String]
120
125
  # The row key of the row to which the read/modify/write rules should be applied.
121
- # @param rules [Google::Cloud::Bigtable::ReadModifyWriteRule, Array<Google::Cloud::Bigtable::ReadModifyWriteRule>]
126
+ # @param rules [Google::Cloud::Bigtable::ReadModifyWriteRule,
127
+ # Array<Google::Cloud::Bigtable::ReadModifyWriteRule>]
122
128
  # Rules specifying how the specified row's contents are to be transformed
123
129
  # into writes. Entries are applied in order, meaning that earlier rules will
124
130
  # affect the results of later ones.
@@ -158,7 +164,7 @@ module Google
158
164
  Array(rules).map(&:to_grpc),
159
165
  app_profile_id: @app_profile_id
160
166
  ).row
161
- row = Row.new(res_row.key)
167
+ row = Row.new res_row.key
162
168
 
163
169
  res_row.families.each do |family|
164
170
  family.columns.each do |column|
@@ -177,6 +183,7 @@ module Google
177
183
  row
178
184
  end
179
185
 
186
+ ##
180
187
  # Mutates a row atomically based on the output of a predicate reader filter.
181
188
  #
182
189
  # NOTE: Condition predicate filter is not supported.
@@ -222,35 +229,32 @@ module Google
222
229
  # otherwise_mutations = Google::Cloud::Bigtable::MutationEntry.new
223
230
  # otherwise_mutations.delete_from_family("cf3")
224
231
  #
225
- # response = table.check_and_mutate_row(
232
+ # predicate_matched = table.check_and_mutate_row(
226
233
  # "user01",
227
234
  # predicate_filter,
228
235
  # on_match: on_match_mutations,
229
236
  # otherwise: otherwise_mutations
230
237
  # )
231
238
  #
232
- # if response
239
+ # if predicate_matched
233
240
  # puts "All predicates matched"
234
241
  # end
235
242
  #
236
- def check_and_mutate_row \
237
- key,
238
- predicate,
239
- on_match: nil,
240
- otherwise: nil
243
+ def check_and_mutate_row key, predicate, on_match: nil, otherwise: nil
241
244
  true_mutations = on_match.mutations if on_match
242
245
  false_mutations = otherwise.mutations if otherwise
243
246
  response = client.check_and_mutate_row(
244
247
  path,
245
248
  key,
246
249
  predicate_filter: predicate.to_grpc,
247
- true_mutations: true_mutations,
248
- false_mutations: false_mutations,
249
- app_profile_id: @app_profile_id
250
+ true_mutations: true_mutations,
251
+ false_mutations: false_mutations,
252
+ app_profile_id: @app_profile_id
250
253
  )
251
254
  response.predicate_matched
252
255
  end
253
256
 
257
+ ##
254
258
  # Read sample row keys.
255
259
  #
256
260
  # Returns a sample of row keys in the table. The returned row keys will
@@ -263,7 +267,7 @@ module Google
263
267
  # Yield block for each processed SampleRowKey.
264
268
  #
265
269
  # @example
266
- # require "google/cloud"
270
+ # require "google/cloud/bigtable"
267
271
  #
268
272
  # bigtable = Google::Cloud::Bigtable.new
269
273
  # table = bigtable.table("my-instance", "my-table")
@@ -274,17 +278,18 @@ module Google
274
278
  # end
275
279
  #
276
280
  def sample_row_keys
277
- return enum_for(:sample_row_keys) unless block_given?
281
+ return enum_for :sample_row_keys unless block_given?
278
282
 
279
283
  response = client.sample_row_keys(
280
284
  path,
281
285
  app_profile_id: @app_profile_id
282
286
  )
283
287
  response.each do |grpc|
284
- yield SampleRowKey.from_grpc(grpc)
288
+ yield SampleRowKey.from_grpc grpc
285
289
  end
286
290
  end
287
291
 
292
+ ##
288
293
  # Create an instance of mutation_entry
289
294
  #
290
295
  # @param row_key [String] Row key. Optional
@@ -303,9 +308,10 @@ module Google
303
308
  # entry = table.new_mutation_entry
304
309
  #
305
310
  def new_mutation_entry row_key = nil
306
- Google::Cloud::Bigtable::MutationEntry.new(row_key)
311
+ Google::Cloud::Bigtable::MutationEntry.new row_key
307
312
  end
308
313
 
314
+ ##
309
315
  # Create an instance of ReadModifyWriteRule to append or increment the value
310
316
  # of the cell qualifier.
311
317
  #
@@ -332,7 +338,54 @@ module Google
332
338
  # rule.increment(100)
333
339
  #
334
340
  def new_read_modify_write_rule family, qualifier
335
- Google::Cloud::Bigtable::ReadModifyWriteRule.new(family, qualifier)
341
+ Google::Cloud::Bigtable::ReadModifyWriteRule.new family, qualifier
342
+ end
343
+
344
+ ##
345
+ # # MutationEntry::Response
346
+ #
347
+ # Represents a response message from BigtableService.MutateRows.
348
+ #
349
+ # @attr [Integer] index The index into the original request's `entries`
350
+ # list of the Entry for which a result is being reported.
351
+ # @attr [Google::Cloud::Bigtable::Status] The result of the request
352
+ # Entry identified by `index`. Depending on how requests are batched
353
+ # during execution, it is possible for one Entry to fail due to an
354
+ # error with another Entry. In the event that this occurs, the same
355
+ # error will be reported for both entries.
356
+ #
357
+ # @example
358
+ # require "google/cloud/bigtable"
359
+ #
360
+ # bigtable = Google::Cloud::Bigtable.new
361
+ #
362
+ # table = bigtable.table("my-instance", "my-table")
363
+ #
364
+ # entries = []
365
+ # entries << table.new_mutation_entry("row-1").set_cell("cf1", "field1", "XYZ")
366
+ # entries << table.new_mutation_entry("row-2").set_cell("cf1", "field1", "ABC")
367
+ # responses = table.mutate_rows(entries)
368
+ #
369
+ # responses.each do |response|
370
+ # puts response.status.description
371
+ # end
372
+ #
373
+ class Response
374
+ attr_reader :index, :status
375
+
376
+ ##
377
+ # @private Creates a MutationEntry::Response object.
378
+ def initialize index, status
379
+ @index = index
380
+ @status = status
381
+ end
382
+
383
+ ##
384
+ # @private New MutationEntry::Response from a
385
+ # Google::Bigtable::V2::MutateRowsResponse::Entry object.
386
+ def self.from_grpc grpc
387
+ new grpc.index, Status.from_grpc(grpc.status)
388
+ end
336
389
  end
337
390
  end
338
391
  end