google-cloud-bigtable 0.6.1 → 1.0.1

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHENTICATION.md +4 -26
  3. data/CHANGELOG.md +85 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/OVERVIEW.md +388 -19
  6. data/lib/google-cloud-bigtable.rb +19 -22
  7. data/lib/google/bigtable/admin/v2/bigtable_table_admin_services_pb.rb +1 -1
  8. data/lib/google/bigtable/v2/bigtable_pb.rb +3 -0
  9. data/lib/google/bigtable/v2/bigtable_services_pb.rb +1 -1
  10. data/lib/google/cloud/bigtable.rb +11 -17
  11. data/lib/google/cloud/bigtable/admin.rb +1 -1
  12. data/lib/google/cloud/bigtable/admin/v2.rb +1 -1
  13. data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client.rb +1 -1
  14. data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/policy.rb +42 -21
  15. data/lib/google/cloud/bigtable/app_profile.rb +162 -96
  16. data/lib/google/cloud/bigtable/app_profile/job.rb +5 -8
  17. data/lib/google/cloud/bigtable/app_profile/list.rb +18 -12
  18. data/lib/google/cloud/bigtable/chunk_processor.rb +24 -36
  19. data/lib/google/cloud/bigtable/cluster.rb +45 -18
  20. data/lib/google/cloud/bigtable/cluster/job.rb +3 -7
  21. data/lib/google/cloud/bigtable/cluster/list.rb +22 -20
  22. data/lib/google/cloud/bigtable/column_family.rb +18 -231
  23. data/lib/google/cloud/bigtable/column_family_map.rb +426 -0
  24. data/lib/google/cloud/bigtable/column_range.rb +15 -7
  25. data/lib/google/cloud/bigtable/convert.rb +12 -4
  26. data/lib/google/cloud/bigtable/errors.rb +4 -1
  27. data/lib/google/cloud/bigtable/gc_rule.rb +188 -69
  28. data/lib/google/cloud/bigtable/instance.rb +209 -189
  29. data/lib/google/cloud/bigtable/instance/cluster_map.rb +17 -13
  30. data/lib/google/cloud/bigtable/instance/job.rb +6 -5
  31. data/lib/google/cloud/bigtable/instance/list.rb +18 -13
  32. data/lib/google/cloud/bigtable/longrunning_job.rb +7 -1
  33. data/lib/google/cloud/bigtable/mutation_entry.rb +36 -39
  34. data/lib/google/cloud/bigtable/mutation_operations.rb +90 -73
  35. data/lib/google/cloud/bigtable/policy.rb +9 -5
  36. data/lib/google/cloud/bigtable/project.rb +87 -196
  37. data/lib/google/cloud/bigtable/read_modify_write_rule.rb +15 -10
  38. data/lib/google/cloud/bigtable/read_operations.rb +42 -59
  39. data/lib/google/cloud/bigtable/routing_policy.rb +172 -0
  40. data/lib/google/cloud/bigtable/row.rb +32 -21
  41. data/lib/google/cloud/bigtable/row_filter.rb +80 -35
  42. data/lib/google/cloud/bigtable/row_filter/chain_filter.rb +119 -68
  43. data/lib/google/cloud/bigtable/row_filter/condition_filter.rb +8 -2
  44. data/lib/google/cloud/bigtable/row_filter/interleave_filter.rb +117 -66
  45. data/lib/google/cloud/bigtable/row_filter/simple_filter.rb +24 -9
  46. data/lib/google/cloud/bigtable/row_range.rb +5 -0
  47. data/lib/google/cloud/bigtable/rows_mutator.rb +14 -21
  48. data/lib/google/cloud/bigtable/rows_reader.rb +23 -18
  49. data/lib/google/cloud/bigtable/sample_row_key.rb +6 -3
  50. data/lib/google/cloud/bigtable/service.rb +200 -253
  51. data/lib/google/cloud/bigtable/status.rb +76 -0
  52. data/lib/google/cloud/bigtable/table.rb +158 -262
  53. data/lib/google/cloud/bigtable/table/cluster_state.rb +17 -6
  54. data/lib/google/cloud/bigtable/table/list.rb +16 -9
  55. data/lib/google/cloud/bigtable/v2.rb +1 -1
  56. data/lib/google/cloud/bigtable/v2/bigtable_client.rb +12 -12
  57. data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/bigtable.rb +16 -13
  58. data/lib/google/cloud/bigtable/value_range.rb +19 -13
  59. data/lib/google/cloud/bigtable/version.rb +1 -1
  60. metadata +67 -25
  61. data/lib/google/cloud/bigtable/table/column_family_map.rb +0 -70
@@ -0,0 +1,76 @@
1
+ # Copyright 2019 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ module Google
17
+ module Cloud
18
+ module Bigtable
19
+ ##
20
+ # # Status
21
+ #
22
+ # Represents a logical error model from the Bigtable service, containing an
23
+ # error code, an error message, and optional error details.
24
+ #
25
+ # @attr [Integer] code The status code, which should be an enum value of
26
+ # [google.rpc.Code](https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto).
27
+ # @attr [String] description The human-readable description for the status code, which should be an enum value of
28
+ # [google.rpc.Code](https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto). For example,
29
+ # `INVALID_ARGUMENT`.
30
+ # @attr [String] message A developer-facing error message, which should be in English.
31
+ # @attr [Array<String>] details A list of messages that carry the error details.
32
+ #
33
+ # @example
34
+ # require "google/cloud/bigtable"
35
+ #
36
+ # bigtable = Google::Cloud::Bigtable.new
37
+ #
38
+ # table = bigtable.table("my-instance", "my-table")
39
+ #
40
+ # entries = []
41
+ # entries << table.new_mutation_entry("row-1").set_cell("cf1", "field1", "XYZ")
42
+ # entries << table.new_mutation_entry("row-2").set_cell("cf1", "field1", "ABC")
43
+ # responses = table.mutate_rows(entries)
44
+ #
45
+ # responses.each do |response|
46
+ # puts response.status.description
47
+ # end
48
+ #
49
+ class Status
50
+ attr_reader :code, :description, :message, :details
51
+
52
+ ##
53
+ # @private Creates a Status object.
54
+ def initialize code, description, message, details
55
+ @code = code
56
+ @description = description
57
+ @message = message
58
+ @details = details
59
+ end
60
+
61
+ ##
62
+ # @private New Status from a Google::Rpc::Status object.
63
+ def self.from_grpc grpc
64
+ new grpc.code, description_for(grpc.code), grpc.message, grpc.details
65
+ end
66
+
67
+ # @private Get a descriptive symbol for a google.rpc.Code integer
68
+ def self.description_for code
69
+ ["OK", "CANCELLED", "UNKNOWN", "INVALID_ARGUMENT", "DEADLINE_EXCEEDED", "NOT_FOUND", "ALREADY_EXISTS",
70
+ "PERMISSION_DENIED", "RESOURCE_EXHAUSTED", "FAILED_PRECONDITION", "ABORTED", "OUT_OF_RANGE", "UNIMPLEMENTED",
71
+ "INTERNAL", "UNAVAILABLE", "DATA_LOSS", "UNAUTHENTICATED"][code]
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -17,8 +17,7 @@
17
17
 
18
18
  require "google/cloud/bigtable/table/list"
19
19
  require "google/cloud/bigtable/table/cluster_state"
20
- require "google/cloud/bigtable/column_family"
21
- require "google/cloud/bigtable/table/column_family_map"
20
+ require "google/cloud/bigtable/column_family_map"
22
21
  require "google/cloud/bigtable/gc_rule"
23
22
  require "google/cloud/bigtable/mutation_operations"
24
23
  require "google/cloud/bigtable/read_operations"
@@ -26,6 +25,7 @@ require "google/cloud/bigtable/read_operations"
26
25
  module Google
27
26
  module Cloud
28
27
  module Bigtable
28
+ ##
29
29
  # # Table
30
30
  #
31
31
  # A collection of user data indexed by row, column, and timestamp.
@@ -36,23 +36,14 @@ module Google
36
36
  #
37
37
  # bigtable = Google::Cloud::Bigtable.new
38
38
  #
39
- # table = bigtable.table("my-instance", "my-table", perform_lookup: true)
39
+ # table = bigtable.table("my-instance", "my-table")
40
40
  #
41
- # table.column_families.each do |cf|
42
- # p cf.name
43
- # p cf.gc_rule
41
+ # if table.exists?
42
+ # p "Table exists."
43
+ # else
44
+ # p "Table does not exist"
44
45
  # end
45
46
  #
46
- # # Get column family by name
47
- # cf1 = table.column_families.find_by_name("cf1")
48
- #
49
- # # Create column family
50
- # gc_rule = Google::Cloud::Bigtable::GcRule.max_versions(3)
51
- # cf2 = table.column_families.create("cf2", gc_rule)
52
- #
53
- # # Delete table
54
- # table.delete
55
- #
56
47
  class Table
57
48
  # @!parse extend MutationOperations
58
49
  include MutationOperations
@@ -64,7 +55,9 @@ module Google
64
55
  # The gRPC Service object.
65
56
  attr_accessor :service
66
57
 
58
+ ##
67
59
  # @return [String] App profile ID for request routing.
60
+ #
68
61
  attr_accessor :app_profile_id
69
62
 
70
63
  # @private
@@ -76,100 +69,168 @@ module Google
76
69
  @view = view || :SCHEMA_VIEW
77
70
  end
78
71
 
79
- # The unique identifier for the project.
72
+ ##
73
+ # The unique identifier for the project to which the table belongs.
80
74
  #
81
75
  # @return [String]
76
+ #
82
77
  def project_id
83
78
  @grpc.name.split("/")[1]
84
79
  end
85
80
 
86
- # The unique identifier for the instance.
81
+ ##
82
+ # The unique identifier for the instance to which the table belongs.
87
83
  #
88
84
  # @return [String]
85
+ #
89
86
  def instance_id
90
87
  @grpc.name.split("/")[3]
91
88
  end
92
89
 
90
+ ##
93
91
  # The unique identifier for the table.
94
92
  #
95
93
  # @return [String]
94
+ #
96
95
  def name
97
96
  @grpc.name.split("/")[5]
98
97
  end
99
98
  alias table_id name
100
99
 
100
+ ##
101
101
  # The full path for the table resource. Values are of the form
102
102
  # `projects/<project_id>/instances/<instance_id>/table/<table_id>`.
103
103
  #
104
104
  # @return [String]
105
+ #
105
106
  def path
106
107
  @grpc.name
107
108
  end
108
109
 
109
- # Reload table information.
110
+ ##
111
+ # Reloads table data.
110
112
  #
111
113
  # @param view [Symbol] Table view type.
112
- # Default view type is `:SCHEMA_VIEW`
114
+ # Default view type is `:SCHEMA_VIEW`.
113
115
  # Valid view types are:
114
116
  #
115
- # * `:NAME_ONLY` - Only populates `name`
116
- # * `:SCHEMA_VIEW` - Only populates `name` and fields related to the table's schema
117
+ # * `:NAME_ONLY` - Only populates `name`.
118
+ # * `:SCHEMA_VIEW` - Only populates `name` and fields related to the table's schema.
117
119
  # * `:REPLICATION_VIEW` - Only populates `name` and fields related to the table's replication state.
118
- # * `:FULL` - Populates all fields
120
+ # * `:FULL` - Populates all fields.
119
121
  #
120
122
  # @return [Google::Cloud::Bigtable::Table]
121
-
123
+ #
122
124
  def reload! view: nil
123
125
  @view = view || :SCHEMA_VIEW
124
- @grpc = service.get_table(instance_id, name, view: view)
126
+ @grpc = service.get_table instance_id, name, view: view
125
127
  self
126
128
  end
127
129
 
130
+ ##
128
131
  # Map from cluster ID to per-cluster table state.
129
132
  # If it could not be determined whether or not the table has data in a
130
133
  # particular cluster (for example, if its zone is unavailable), then
131
134
  # there will be an entry for the cluster with UNKNOWN `replication_status`.
132
- # Views: `FULL`
135
+ # Views: `FULL`.
133
136
  #
134
137
  # @return [Array<Google::Cloud::Bigtable::Table::ClusterState>]
138
+ #
135
139
  def cluster_states
136
- check_view_and_load(:REPLICATION_VIEW)
140
+ check_view_and_load :REPLICATION_VIEW
137
141
  @grpc.cluster_states.map do |name, state_grpc|
138
- ClusterState.from_grpc(state_grpc, name)
142
+ ClusterState.from_grpc state_grpc, name
139
143
  end
140
144
  end
141
145
 
142
- # The column families configured for this table, mapped by column family ID.
143
- # Column-families data only available in table view types `SCHEMA_VIEW`, `FULL`.
146
+ ##
147
+ # Returns a frozen object containing the column families configured for
148
+ # the table, mapped by column family name. Reloads the table if
149
+ # necessary to retrieve the column families data, since it is only
150
+ # available in a table with view type `SCHEMA_VIEW` or `FULL`.
151
+ #
152
+ # Also accepts a block for making modifications to the table's column
153
+ # families. After the modifications are completed, the table will be
154
+ # updated with the changes, and the updated column families will be
155
+ # returned.
156
+ #
157
+ # @yield [column_families] A block for modifying the table's column
158
+ # families. Applies multiple column modifications. Performs a series
159
+ # of column family modifications on the specified table. Either all or
160
+ # none of the modifications will occur before this method returns, but
161
+ # data requests received prior to that point may see a table where
162
+ # only some modifications have taken effect.
163
+ # @yieldparam [ColumnFamilyMap] column_families
164
+ # A mutable object containing the column families for the table,
165
+ # mapped by column family name. Any changes made to this object will
166
+ # be stored in API.
167
+ #
168
+ # @return [ColumnFamilyMap] A frozen object containing the
169
+ # column families for the table, mapped by column family name.
170
+ #
171
+ # @example
172
+ # require "google/cloud/bigtable"
173
+ #
174
+ # bigtable = Google::Cloud::Bigtable.new
175
+ #
176
+ # table = bigtable.table("my-instance", "my-table", perform_lookup: true)
177
+ #
178
+ # table.column_families.each do |name, cf|
179
+ # puts name
180
+ # puts cf.gc_rule
181
+ # end
182
+ #
183
+ # # Get a column family by name
184
+ # cf1 = table.column_families["cf1"]
185
+ #
186
+ # @example Modify the table's column families
187
+ # require "google/cloud/bigtable"
188
+ #
189
+ # bigtable = Google::Cloud::Bigtable.new
190
+ #
191
+ # table = bigtable.table("my-instance", "my-table", perform_lookup: true)
192
+ #
193
+ # table.column_families do |cfm|
194
+ # cfm.add "cf4", gc_rule: Google::Cloud::Bigtable::GcRule.max_age(600)
195
+ # cfm.add "cf5", gc_rule: Google::Cloud::Bigtable::GcRule.max_versions(5)
196
+ #
197
+ # rule_1 = Google::Cloud::Bigtable::GcRule.max_versions(3)
198
+ # rule_2 = Google::Cloud::Bigtable::GcRule.max_age(600)
199
+ # rule_union = Google::Cloud::Bigtable::GcRule.union(rule_1, rule_2)
200
+ # cfm.update "cf2", gc_rule: rule_union
144
201
  #
202
+ # cfm.delete "cf3"
203
+ # end
145
204
  #
146
- # @return [Array<Google::Bigtable::ColumnFamily>]
205
+ # puts table.column_families["cf3"] #=> nil
147
206
  #
148
207
  def column_families
149
- check_view_and_load(:SCHEMA_VIEW)
150
- @grpc.column_families.map do |cf_name, cf_grpc|
151
- ColumnFamily.from_grpc(
152
- cf_grpc,
153
- service,
154
- name: cf_name,
155
- instance_id: instance_id,
156
- table_id: table_id
157
- )
208
+ check_view_and_load :SCHEMA_VIEW
209
+
210
+ if block_given?
211
+ column_families = ColumnFamilyMap.from_grpc @grpc.column_families
212
+ yield column_families
213
+ modifications = column_families.modifications @grpc.column_families
214
+ @grpc = service.modify_column_families instance_id, table_id, modifications if modifications.any?
158
215
  end
216
+
217
+ ColumnFamilyMap.from_grpc(@grpc.column_families).freeze
159
218
  end
160
219
 
220
+ ##
161
221
  # The granularity (e.g. `MILLIS`, `MICROS`) at which timestamps are stored in
162
222
  # this table. Timestamps not matching the granularity will be rejected.
163
223
  # If unspecified at creation time, the value will be set to `MILLIS`.
164
- # Views: `SCHEMA_VIEW`, `FULL`
224
+ # Views: `SCHEMA_VIEW`, `FULL`.
165
225
  #
166
226
  # @return [Symbol]
167
227
  #
168
228
  def granularity
169
- check_view_and_load(:SCHEMA_VIEW)
229
+ check_view_and_load :SCHEMA_VIEW
170
230
  @grpc.granularity
171
231
  end
172
232
 
233
+ ##
173
234
  # The table keeps data versioned at a granularity of 1 ms.
174
235
  #
175
236
  # @return [Boolean]
@@ -178,6 +239,7 @@ module Google
178
239
  granularity == :MILLIS
179
240
  end
180
241
 
242
+ ##
181
243
  # Permanently deletes the table from a instance.
182
244
  #
183
245
  # @return [Boolean] Returns `true` if the table was deleted.
@@ -187,15 +249,16 @@ module Google
187
249
  #
188
250
  # bigtable = Google::Cloud::Bigtable.new
189
251
  #
190
- # instance = bigtable.table("my-instance", "my-table")
252
+ # table = bigtable.table("my-instance", "my-table")
191
253
  # table.delete
192
254
  #
193
255
  def delete
194
256
  ensure_service!
195
- service.delete_table(instance_id, name)
257
+ service.delete_table instance_id, name
196
258
  true
197
259
  end
198
260
 
261
+ ##
199
262
  # Checks to see if the table exists.
200
263
  #
201
264
  # @return [Boolean]
@@ -219,7 +282,7 @@ module Google
219
282
  # bigtable = Google::Cloud::Bigtable.new
220
283
  #
221
284
  # instance = bigtable.instance("my-instance")
222
- # table = bigtable.table("my-table")
285
+ # table = instance.table("my-table")
223
286
  #
224
287
  # if table.exists?
225
288
  # p "Table exists."
@@ -227,205 +290,51 @@ module Google
227
290
  # p "Table does not exist"
228
291
  # end
229
292
  #
230
-
231
293
  def exists?
232
294
  !service.get_table(instance_id, name, view: :NAME_ONLY).nil?
233
295
  rescue Google::Cloud::NotFoundError
234
296
  false
235
297
  end
236
298
 
237
- # Returns a column family object that can be used to perform create,
238
- # update, or delete operations.
239
- #
240
- # @param name [String] Name of the column family
241
- # @param gc_rule [Google::Cloud::Bigtable::GcRule] The garbage
242
- # collection rule to be used for the column family. Optional. The
243
- # service default value will be used when not specified.
244
- #
245
- # @example Create column family
246
- # require "google/cloud/bigtable"
247
- #
248
- # bigtable = Google::Cloud::Bigtable.new
249
- #
250
- # table = bigtable.table("my-instance", my-table)
251
- #
252
- # # OR get table from Instance object.
253
- # instance = bigtable.instance("my-instance")
254
- # table = instance.table("my-table")
255
- #
256
- # gc_rule = Google::Cloud::Bigtable::GcRule.max_versions(5)
257
- # column_family = table.column_family("cf1", gc_rule)
258
- # column_family.create
259
- #
260
- # @example Update column family
261
- # require "google/cloud/bigtable"
262
- #
263
- # bigtable = Google::Cloud::Bigtable.new
264
- #
265
- # table = bigtable.table("my-instance", "my-table")
266
- #
267
- # gc_rule = Google::Cloud::Bigtable::GcRule.max_age(1800)
268
- # column_family = table.column_family("cf2", gc_rule)
269
- # column_family.save
270
- # # OR Using alias method update.
271
- # column_family.update
272
- #
273
- # @example Delete column family
274
- # require "google/cloud/bigtable"
275
- #
276
- # bigtable = Google::Cloud::Bigtable.new
277
- #
278
- # table = bigtable.table("my-instance", "my-table")
279
- #
280
- # column_family = table.column_family("cf3")
281
- # column_family.delete
282
- #
283
- def column_family name, gc_rule = nil
284
- cf_grpc = Google::Bigtable::Admin::V2::ColumnFamily.new
285
- cf_grpc.gc_rule = gc_rule.to_grpc if gc_rule
286
-
287
- ColumnFamily.from_grpc(
288
- cf_grpc,
289
- service,
290
- name: name,
291
- instance_id: instance_id,
292
- table_id: table_id
293
- )
294
- end
295
-
296
- # Applies multitple column modifications.
297
- # Performs a series of column family modifications on the specified table.
298
- # Either all or none of the modifications will occur before this method
299
- # returns, but data requests received prior to that point may see a table
300
- # where only some modifications have taken effect.
301
- #
302
- # @param modifications [Array<Google::Cloud::Bigtable::ColumnFamilyModification>]
303
- # Modifications to be atomically applied to the specified table's families.
304
- # Entries are applied in order, meaning that earlier modifications can be
305
- # masked by later ones (in the case of repeated updates to the same family,
306
- # for example).
307
- # @return [Google::Cloud::Bigtable::Table] Table with updated column families.
308
- #
309
- # @example Apply multiple modificationss
310
- # require "google/cloud/bigtable"
311
- #
312
- # bigtable = Google::Cloud::Bigtable.new
313
- #
314
- # instance = bigtable.instance("my-instance")
315
- # table = instance.table("my-table")
316
- #
317
- # modifications = []
318
- # modifications << Google::Cloud::Bigtable::ColumnFamily.create_modification(
319
- # "cf1", Google::Cloud::Bigtable::GcRule.max_age(600))
320
- # )
321
- #
322
- # modifications << Google::Cloud::Bigtable::ColumnFamily.update_modification(
323
- # "cf2", Google::Cloud::Bigtable::GcRule.max_versions(5)
324
- # )
325
- #
326
- # gc_rule_1 = Google::Cloud::Bigtable::GcRule.max_versions(3)
327
- # gc_rule_2 = Google::Cloud::Bigtable::GcRule.max_age(600)
328
- # modifications << Google::Cloud::Bigtable::ColumnFamily.update_modification(
329
- # "cf3", Google::Cloud::Bigtable::GcRule.union(gc_rule_1, gc_rule_2)
330
- # )
331
- #
332
- # max_age_gc_rule = Google::Cloud::Bigtable::GcRule.max_age(300)
333
- # modifications << Google::Cloud::Bigtable::ColumnFamily.update_modification(
334
- # "cf4", Google::Cloud::Bigtable::GcRule.union(max_version_gc_rule)
335
- # )
336
- #
337
- # modifications << Google::Cloud::Bigtable::ColumnFamily.drop_modification("cf5")
338
- #
339
- # table = bigtable.modify_column_families(modifications)
340
- #
341
- # p table.column_families
342
-
343
- def modify_column_families modifications
344
- ensure_service!
345
- self.class.modify_column_families(
346
- service,
347
- instance_id,
348
- table_id,
349
- modifications
350
- )
351
- end
352
-
353
- # @private
354
- #
355
- # Performs a series of column family modifications on the specified table.
356
- # Either all or none of the modifications will occur before this method
357
- # returns, but data requests received prior to that point may see a table
358
- # where only some modifications have taken effect.
359
- #
360
- # @param service [Google::Cloud::Bigtable::Service]
361
- # @param instance_id [String]
362
- # The unique ID of the instance the table is in.
363
- # @param table_id [String]
364
- # The unique ID of the table whose families should be modified.
365
- # @param modifications [Array<Google::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification> | Google::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification]
366
- # Modifications to be atomically applied to the specified table's families.
367
- # Entries are applied in order, meaning that earlier modifications can be
368
- # masked by later ones (in the case of repeated updates to the same family,
369
- # for example).
370
- # @return [Google::Cloud::Bigtable::Table] Table with updated column families.
371
- #
372
- def self.modify_column_families \
373
- service,
374
- instance_id,
375
- table_id,
376
- modifications
377
- modifications = [modifications] unless modifications.is_a?(Array)
378
- grpc = service.modify_column_families(
379
- instance_id,
380
- table_id,
381
- modifications
382
- )
383
- from_grpc(grpc, service)
384
- end
385
-
386
299
  # @private
387
300
  # Creates a table.
388
301
  #
389
302
  # @param service [Google::Cloud::Bigtable::Service]
390
303
  # @param instance_id [String]
391
304
  # @param table_id [String]
392
- # @param column_families [Hash{String => Google::Cloud::Bigtable::ColumnFamily}]
305
+ # @param column_families [ColumnFamilyMap]
393
306
  # @param granularity [Symbol]
394
307
  # @param initial_splits [Array<String>]
395
308
  # @yield [column_families] A block for adding column_families.
396
- # @yieldparam [Hash{String => Google::Cloud::Bigtable::ColumnFamily}]
309
+ # @yieldparam [ColumnFamilyMap]
397
310
  #
398
311
  # @return [Google::Cloud::Bigtable::Table]
399
- def self.create \
400
- service,
401
- instance_id,
402
- table_id,
403
- column_families: nil,
404
- granularity: nil,
405
- initial_splits: nil
406
- column_families ||= Table::ColumnFamilyMap.new
312
+ #
313
+ def self.create service, instance_id, table_id, column_families: nil, granularity: nil, initial_splits: nil
314
+ if column_families
315
+ # create an un-frozen and duplicate object
316
+ column_families = ColumnFamilyMap.from_grpc column_families.to_grpc
317
+ end
318
+ column_families ||= ColumnFamilyMap.new
319
+
407
320
  yield column_families if block_given?
408
321
 
409
322
  table = Google::Bigtable::Admin::V2::Table.new({
410
- column_families: column_families.to_h,
411
- granularity: granularity
323
+ column_families: column_families.to_grpc_hash,
324
+ granularity: granularity
412
325
  }.delete_if { |_, v| v.nil? })
413
326
 
414
- grpc = service.create_table(
415
- instance_id,
416
- table_id,
417
- table,
418
- initial_splits: initial_splits
419
- )
420
- from_grpc(grpc, service)
327
+ grpc = service.create_table instance_id, table_id, table, initial_splits: initial_splits
328
+ from_grpc grpc, service
421
329
  end
422
330
 
331
+ ##
423
332
  # Generates a consistency token for a table. The token can be used in
424
333
  # CheckConsistency to check whether mutations to the table that finished
425
334
  # before this call started have been replicated. The tokens will be available
426
335
  # for 90 days.
427
336
  #
428
- # @return [String] Generated consistency token
337
+ # @return [String] The generated consistency token
429
338
  #
430
339
  # @example
431
340
  # require "google/cloud/bigtable"
@@ -439,15 +348,16 @@ module Google
439
348
  #
440
349
  def generate_consistency_token
441
350
  ensure_service!
442
- response = service.generate_consistency_token(instance_id, name)
351
+ response = service.generate_consistency_token instance_id, name
443
352
  response.consistency_token
444
353
  end
445
354
 
355
+ ##
446
356
  # Checks replication consistency based on a consistency token. Replication is
447
357
  # considered consistent if replication has caught up based on the conditions
448
358
  # specified in the token and the check request.
449
359
  # @param token [String] Consistency token
450
- # @return [Boolean] Replication is consistent or not.
360
+ # @return [Boolean] `true` if replication is consistent
451
361
  #
452
362
  # @example
453
363
  # require "google/cloud/bigtable"
@@ -465,14 +375,15 @@ module Google
465
375
  #
466
376
  def check_consistency token
467
377
  ensure_service!
468
- response = service.check_consistency(instance_id, name, token)
378
+ response = service.check_consistency instance_id, name, token
469
379
  response.consistent
470
380
  end
471
381
 
382
+ ##
472
383
  # Wait for replication to check replication consistency.
473
384
  # Checks replication consistency by generating a consistency token and
474
385
  # making the `check_consistency` API call 5 times (by default).
475
- # If the response is consistent, returns true. Otherwise tries again
386
+ # If the response is consistent, returns `true`. Otherwise tries again
476
387
  # repeatedly until the timeout. If the check does not succeed by the
477
388
  # timeout, returns `false`.
478
389
  #
@@ -480,14 +391,14 @@ module Google
480
391
  # Timeout in seconds. Defaults value is 600 seconds.
481
392
  # @param check_interval [Integer]
482
393
  # Consistency check interval in seconds. Default is 5 seconds.
483
- # @return [Boolean] Replication is consistent or not.
394
+ # @return [Boolean] `true` if replication is consistent
484
395
  #
485
396
  # @example
486
397
  # require "google/cloud/bigtable"
487
398
  #
488
399
  # bigtable = Google::Cloud::Bigtable.new
489
400
  #
490
- # table = bigtable.table("instance_id", "my-table", perform_lookup: true)
401
+ # table = bigtable.table("my-instance", "my-table", perform_lookup: true)
491
402
  #
492
403
  # if table.wait_for_replication
493
404
  # puts "Replication done"
@@ -499,37 +410,24 @@ module Google
499
410
  # end
500
411
  #
501
412
  def wait_for_replication timeout: 600, check_interval: 5
502
- if check_interval > timeout
503
- raise(
504
- InvalidArgumentError,
505
- "'check_interval' can not be greather then timeout"
506
- )
507
- end
413
+ raise InvalidArgumentError, "'check_interval' cannot be greater than timeout" if check_interval > timeout
508
414
  token = generate_consistency_token
509
415
  status = false
510
416
  start_at = Time.now
511
417
 
512
418
  loop do
513
- status = check_consistency(token)
419
+ status = check_consistency token
514
420
 
515
421
  break if status || (Time.now - start_at) >= timeout
516
- sleep(check_interval)
422
+ sleep check_interval
517
423
  end
518
424
  status
519
425
  end
520
426
 
521
- # @private
522
- # Gets the data client instance.
523
- #
524
- # @return [Google::Cloud::Bigtable::V2::BigtableClient]
525
- #
526
- def client
527
- service.client
528
- end
529
-
427
+ ##
530
428
  # Deletes all rows.
531
429
  #
532
- # @param timeout [Integer] Call timeout in seconds
430
+ # @param timeout [Integer] Call timeout in seconds.
533
431
  # Use in case of insufficient deadline for DropRowRange, then
534
432
  # try again with a longer request deadline.
535
433
  # @return [Boolean]
@@ -547,13 +445,14 @@ module Google
547
445
  # table.delete_all_rows(timeout: 120) # 120 seconds.
548
446
  #
549
447
  def delete_all_rows timeout: nil
550
- drop_row_range(delete_all_data: true, timeout: timeout)
448
+ drop_row_range delete_all_data: true, timeout: timeout
551
449
  end
552
450
 
451
+ ##
553
452
  # Deletes rows using row key prefix.
554
453
  #
555
- # @param prefix [String] Row key prefix (for example, "user")
556
- # @param timeout [Integer] Call timeout in seconds
454
+ # @param prefix [String] Row key prefix (for example, "user").
455
+ # @param timeout [Integer] Call timeout in seconds.
557
456
  # @return [Boolean]
558
457
  # @example
559
458
  # require "google/cloud/bigtable"
@@ -565,15 +464,16 @@ module Google
565
464
  # table.delete_rows_by_prefix("user-100")
566
465
  #
567
466
  # # With timeout
568
- # table.delete_all_rows("user-1", timeout: 120) # 120 seconds.
467
+ # table.delete_rows_by_prefix("user-1", timeout: 120) # 120 seconds.
569
468
  #
570
469
  def delete_rows_by_prefix prefix, timeout: nil
571
- drop_row_range(row_key_prefix: prefix, timeout: timeout)
470
+ drop_row_range row_key_prefix: prefix, timeout: timeout
572
471
  end
573
472
 
473
+ ##
574
474
  # Drops row range by row key prefix or deletes all.
575
475
  #
576
- # @param row_key_prefix [String] Row key prefix (for example, "user")
476
+ # @param row_key_prefix [String] Row key prefix (for example, "user").
577
477
  # @param delete_all_data [Boolean]
578
478
  # @return [Boolean]
579
479
  #
@@ -585,22 +485,19 @@ module Google
585
485
  # table = bigtable.table("my-instance", "my-table")
586
486
  #
587
487
  # # Delete rows using row key prefix.
588
- # table.drop_row_range("user-100")
488
+ # table.drop_row_range(row_key_prefix: "user-100")
589
489
  #
590
490
  # # Delete all data With timeout
591
491
  # table.drop_row_range(delete_all_data: true, timeout: 120) # 120 seconds.
592
492
  #
593
- def drop_row_range \
594
- row_key_prefix: nil,
595
- delete_all_data: nil,
596
- timeout: nil
493
+ def drop_row_range row_key_prefix: nil, delete_all_data: nil, timeout: nil
597
494
  ensure_service!
598
495
  service.drop_row_range(
599
496
  instance_id,
600
497
  name,
601
- row_key_prefix: row_key_prefix,
498
+ row_key_prefix: row_key_prefix,
602
499
  delete_all_data_from_table: delete_all_data,
603
- timeout: timeout
500
+ timeout: timeout
604
501
  )
605
502
  true
606
503
  end
@@ -614,7 +511,7 @@ module Google
614
511
  # @return [Google::Cloud::Bigtable::Table]
615
512
  #
616
513
  def self.from_grpc grpc, service, view: nil
617
- new(grpc, service, view: view)
514
+ new grpc, service, view: view
618
515
  end
619
516
 
620
517
  # @private
@@ -627,8 +524,8 @@ module Google
627
524
  # @return [Google::Cloud::Bigtable::Table]
628
525
  #
629
526
  def self.from_path path, service
630
- grpc = Google::Bigtable::Admin::V2::Table.new(name: path)
631
- new(grpc, service, view: :NAME_ONLY)
527
+ grpc = Google::Bigtable::Admin::V2::Table.new name: path
528
+ new grpc, service, view: :NAME_ONLY
632
529
  end
633
530
 
634
531
  protected
@@ -642,9 +539,9 @@ module Google
642
539
  end
643
540
 
644
541
  FIELDS_BY_VIEW = {
645
- SCHEMA_VIEW: %w[granularity column_families],
542
+ SCHEMA_VIEW: ["granularity", "column_families"],
646
543
  REPLICATION_VIEW: ["cluster_states"],
647
- FULL: %w[granularity column_families cluster_states]
544
+ FULL: ["granularity", "column_families", "cluster_states"]
648
545
  }.freeze
649
546
 
650
547
  # @private
@@ -653,13 +550,12 @@ module Google
653
550
  # @param view [Symbol] Expected view type.
654
551
  #
655
552
  def check_view_and_load view
656
- @loaded_views ||= Set.new([@view])
553
+ ensure_service!
554
+ @loaded_views ||= Set.new [@view]
657
555
 
658
- if @loaded_views.include?(view) || @loaded_views.include?(:FULL)
659
- return
660
- end
556
+ return if @loaded_views.include?(view) || @loaded_views.include?(:FULL)
661
557
 
662
- grpc = service.get_table(instance_id, table_id, view: view)
558
+ grpc = service.get_table instance_id, table_id, view: view
663
559
  @loaded_views << view
664
560
 
665
561
  FIELDS_BY_VIEW[view].each do |field|