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
@@ -18,6 +18,7 @@
18
18
  module Google
19
19
  module Cloud
20
20
  module Bigtable
21
+ ##
21
22
  # # ReadModifyWriteRule
22
23
  #
23
24
  # Specifies an atomic read/modify/write operation on the latest value of the
@@ -35,7 +36,7 @@ module Google
35
36
  #
36
37
  class ReadModifyWriteRule
37
38
  # @private
38
- # Create an instance of ReadModifyWriteRule
39
+ # Creates an instance of ReadModifyWriteRule
39
40
  #
40
41
  # @param family [String]
41
42
  # The name of the family to which the read/modify/write should be applied.
@@ -48,7 +49,8 @@ module Google
48
49
  @grpc.column_qualifier = qualifier
49
50
  end
50
51
 
51
- # Create an instance of an append-value rule.
52
+ ##
53
+ # Creates an instance of an append-value rule.
52
54
  #
53
55
  # @param family [String]
54
56
  # The name of the family to which the read/modify/write should be applied.
@@ -65,12 +67,13 @@ module Google
65
67
  # )
66
68
  #
67
69
  def self.append family, qualifier, value
68
- rule = new(family, qualifier)
69
- rule.append(value)
70
+ rule = new family, qualifier
71
+ rule.append value
70
72
  rule
71
73
  end
72
74
 
73
- # Create an instance of an increment-amount rule.
75
+ ##
76
+ # Creates an instance of an increment-amount rule.
74
77
  #
75
78
  # @param family [String]
76
79
  # The name of the family to which the read/modify/write should be applied.
@@ -83,18 +86,19 @@ module Google
83
86
  # as a 64-bit big-endian signed integer), or the entire request will fail.
84
87
  # @return [Google::Cloud::Bigtable::ReadModifyWriteRule]
85
88
  #
86
- # @example increment value rule
89
+ # @example
87
90
  # rule = Google::Cloud::Bigtable::ReadModifyWriteRule.increment(
88
91
  # "cf", "field01", 1
89
92
  # )
90
93
  #
91
94
  def self.increment family, qualifier, amount
92
- rule = new(family, qualifier)
93
- rule.increment(amount)
95
+ rule = new family, qualifier
96
+ rule.increment amount
94
97
  rule
95
98
  end
96
99
 
97
- # Set append value.
100
+ ##
101
+ # Sets the append value.
98
102
  #
99
103
  # @param value [String]
100
104
  # @return [Google::Cloud::Bigtable::ReadModifyWriteRule]
@@ -104,7 +108,8 @@ module Google
104
108
  self
105
109
  end
106
110
 
107
- # Set increment amount.
111
+ ##
112
+ # Sets the increment amount.
108
113
  #
109
114
  # @param amount [Integer]
110
115
  # @return [Google::Cloud::Bigtable::ReadModifyWriteRule]
@@ -24,6 +24,7 @@ require "google/cloud/bigtable/sample_row_key"
24
24
  module Google
25
25
  module Cloud
26
26
  module Bigtable
27
+ ##
27
28
  # # ReadOperations
28
29
  #
29
30
  # Collection of read-rows APIs.
@@ -33,6 +34,7 @@ module Google
33
34
  # * Read rows
34
35
  #
35
36
  module ReadOperations
37
+ ##
36
38
  # Reads sample row keys.
37
39
  #
38
40
  # Returns a sample of row keys in the table. The returned row keys will
@@ -45,7 +47,7 @@ module Google
45
47
  # Yield block for each processed SampleRowKey.
46
48
  #
47
49
  # @example
48
- # require "google/cloud"
50
+ # require "google/cloud/bigtable"
49
51
  #
50
52
  # bigtable = Google::Cloud::Bigtable.new
51
53
  # table = bigtable.table("my-instance", "my-table")
@@ -56,17 +58,15 @@ module Google
56
58
  # end
57
59
  #
58
60
  def sample_row_keys
59
- return enum_for(:sample_row_keys) unless block_given?
61
+ return enum_for :sample_row_keys unless block_given?
60
62
 
61
- response = client.sample_row_keys(
62
- path,
63
- app_profile_id: @app_profile_id
64
- )
63
+ response = service.sample_row_keys path, app_profile_id: @app_profile_id
65
64
  response.each do |grpc|
66
- yield SampleRowKey.from_grpc(grpc)
65
+ yield SampleRowKey.from_grpc grpc
67
66
  end
68
67
  end
69
68
 
69
+ ##
70
70
  # Reads rows.
71
71
  #
72
72
  # Streams back the contents of all requested rows in key order, optionally
@@ -86,7 +86,7 @@ module Google
86
86
  # The default (zero) is to return all results.
87
87
  # @return [Array<Google::Cloud::Bigtable::Row> | :yields: row]
88
88
  # Array of row or yield block for each processed row.
89
- # @example Read with limit
89
+ # @example Read with limit.
90
90
  # require "google/cloud/bigtable"
91
91
  #
92
92
  # bigtable = Google::Cloud::Bigtable.new
@@ -96,7 +96,7 @@ module Google
96
96
  # puts row
97
97
  # end
98
98
  #
99
- # @example Read using row keys
99
+ # @example Read using row keys.
100
100
  # require "google/cloud/bigtable"
101
101
  #
102
102
  # bigtable = Google::Cloud::Bigtable.new
@@ -106,20 +106,19 @@ module Google
106
106
  # puts row
107
107
  # end
108
108
  #
109
- # @example Read using row ranges
109
+ # @example Read using row ranges.
110
110
  # require "google/cloud/bigtable"
111
111
  #
112
112
  # bigtable = Google::Cloud::Bigtable.new
113
113
  # table = bigtable.table("my-instance", "my-table")
114
114
  #
115
- # range = table.row_range.between("user-1", "user-100")
115
+ # range = table.new_row_range.between("user-1", "user-100")
116
116
  #
117
117
  # table.read_rows(ranges: range).each do |row|
118
118
  # puts row
119
119
  # end
120
120
  #
121
- # @example Read using filter
122
- #
121
+ # @example Read using filter.
123
122
  # require "google/cloud/bigtable"
124
123
  #
125
124
  # bigtable = Google::Cloud::Bigtable.new
@@ -133,8 +132,7 @@ module Google
133
132
  # puts row
134
133
  # end
135
134
  #
136
- # @example Read using filter with limit
137
- #
135
+ # @example Read using filter with limit.
138
136
  # require "google/cloud/bigtable"
139
137
  #
140
138
  # bigtable = Google::Cloud::Bigtable.new
@@ -148,52 +146,33 @@ module Google
148
146
  # puts row
149
147
  # end
150
148
  #
151
- def read_rows \
152
- keys: nil,
153
- ranges: nil,
154
- filter: nil,
155
- limit: nil,
156
- &block
157
- unless block_given?
158
- return enum_for(
159
- :read_rows,
160
- keys: keys,
161
- ranges: ranges,
162
- filter: filter,
163
- limit: limit
164
- )
165
- end
166
- row_set = build_row_set(keys, ranges)
149
+ def read_rows keys: nil, ranges: nil, filter: nil, limit: nil, &block
150
+ return enum_for :read_rows, keys: keys, ranges: ranges, filter: filter, limit: limit unless block_given?
151
+
152
+ row_set = build_row_set keys, ranges
167
153
  rows_limit = limit
168
154
  rows_filter = filter.to_grpc if filter
169
- rows_reader = RowsReader.new(self)
155
+ rows_reader = RowsReader.new self
170
156
 
171
157
  begin
172
- rows_reader.read(
173
- rows: row_set,
174
- filter: rows_filter,
175
- rows_limit: rows_limit,
176
- &block
177
- )
158
+ rows_reader.read rows: row_set, filter: rows_filter, rows_limit: rows_limit, &block
178
159
  rescue *RowsReader::RETRYABLE_ERRORS => e
179
160
  rows_reader.retry_count += 1
180
- unless rows_reader.retryable?
181
- raise Google::Cloud::Error.from_error(e)
182
- end
183
- rows_limit, row_set = rows_reader.retry_options(limit, row_set)
161
+ raise Google::Cloud::Error.from_error(e) unless rows_reader.retryable?
162
+ rows_limit, row_set = rows_reader.retry_options limit, row_set
184
163
  retry
185
164
  end
186
165
  end
187
166
 
167
+ ##
188
168
  # Reads a single row by row key.
189
169
  #
190
- # @param key [String] Row key. Required
170
+ # @param key [String] Row key. Required.
191
171
  # @param filter [Google::Cloud::Bigtable::RowFilter]
192
172
  # The filter to apply to the contents of the specified row. Optional.
193
173
  # @return [Google::Cloud::Bigtable::Row]
194
174
  #
195
- # @example Read row
196
- #
175
+ # @example
197
176
  # require "google/cloud/bigtable"
198
177
  #
199
178
  # bigtable = Google::Cloud::Bigtable.new
@@ -201,8 +180,7 @@ module Google
201
180
  #
202
181
  # row = table.read_row("user-1")
203
182
  #
204
- # @example Read row
205
- #
183
+ # @example Read row with filter.
206
184
  # require "google/cloud/bigtable"
207
185
  #
208
186
  # bigtable = Google::Cloud::Bigtable.new
@@ -216,6 +194,7 @@ module Google
216
194
  read_rows(keys: [key], filter: filter).first
217
195
  end
218
196
 
197
+ ##
219
198
  # Creates a new instance of ValueRange.
220
199
  #
221
200
  # @return [Google::Cloud::Bigtable::ValueRange]
@@ -226,14 +205,14 @@ module Google
226
205
  # bigtable = Google::Cloud::Bigtable.new
227
206
  # table = bigtable.table("my-instance", "my-table")
228
207
  #
229
- # range = table.value_range
208
+ # range = table.new_value_range
230
209
  # range.from("abc")
231
210
  # range.to("xyz")
232
211
  #
233
212
  # # OR
234
213
  # range = table.new_value_range.from("abc").to("xyz")
235
214
  #
236
- # @example With exclusive from range
215
+ # @example With exclusive from range.
237
216
  # require "google/cloud/bigtable"
238
217
  #
239
218
  # bigtable = Google::Cloud::Bigtable.new
@@ -245,9 +224,10 @@ module Google
245
224
  Google::Cloud::Bigtable::ValueRange.new
246
225
  end
247
226
 
248
- # Get a new instance of ColumnRange.
227
+ ##
228
+ # Gets a new instance of ColumnRange.
249
229
  #
250
- # @param family [String] Column family name
230
+ # @param family [String] Column family name.
251
231
  # @return [Google::Cloud::Bigtable::ColumnRange]
252
232
  #
253
233
  # @example
@@ -256,14 +236,14 @@ module Google
256
236
  # bigtable = Google::Cloud::Bigtable.new
257
237
  # table = bigtable.table("my-instance", "my-table")
258
238
  #
259
- # range = table.column_range("test-family")
239
+ # range = table.new_column_range("test-family")
260
240
  # range.from("abc")
261
241
  # range.to("xyz")
262
242
  #
263
243
  # # OR
264
244
  # range = table.new_column_range("test-family").from("key-1").to("key-5")
265
245
  #
266
- # @example With exclusive from range
246
+ # @example With exclusive from range.
267
247
  # require "google/cloud/bigtable"
268
248
  #
269
249
  # bigtable = Google::Cloud::Bigtable.new
@@ -272,10 +252,11 @@ module Google
272
252
  # range = table.new_column_range("test-family").from("key-1", inclusive: false).to("key-5")
273
253
  #
274
254
  def new_column_range family
275
- Google::Cloud::Bigtable::ColumnRange.new(family)
255
+ Google::Cloud::Bigtable::ColumnRange.new family
276
256
  end
277
257
 
278
- # Get a new instance of RowRange.
258
+ ##
259
+ # Gets a new instance of RowRange.
279
260
  #
280
261
  # @return [Google::Cloud::Bigtable::RowRange]
281
262
  #
@@ -285,14 +266,14 @@ module Google
285
266
  # bigtable = Google::Cloud::Bigtable.new
286
267
  # table = bigtable.table("my-instance", "my-table")
287
268
  #
288
- # range = table.row_range
269
+ # range = table.new_row_range
289
270
  # range.from("abc")
290
271
  # range.to("xyz")
291
272
  #
292
273
  # # OR
293
274
  # range = table.new_row_range.from("key-1").to("key-5")
294
275
  #
295
- # @example With exclusive from range
276
+ # @example With exclusive from range.
296
277
  # require "google/cloud/bigtable"
297
278
  #
298
279
  # bigtable = Google::Cloud::Bigtable.new
@@ -304,6 +285,7 @@ module Google
304
285
  Google::Cloud::Bigtable::RowRange.new
305
286
  end
306
287
 
288
+ ##
307
289
  # Gets a row filter.
308
290
  #
309
291
  # @return [Google::Cloud::Bigtable::RowRange]
@@ -322,6 +304,7 @@ module Google
322
304
 
323
305
  private
324
306
 
307
+ ##
325
308
  # Builds a RowSet object from row keys and row ranges.
326
309
  #
327
310
  # @param row_keys [Array<String>]
@@ -333,11 +316,11 @@ module Google
333
316
  row_set[:row_keys] = row_keys if row_keys
334
317
 
335
318
  if row_ranges
336
- row_ranges = [row_ranges] unless row_ranges.instance_of?(Array)
319
+ row_ranges = [row_ranges] unless row_ranges.instance_of? Array
337
320
  row_set[:row_ranges] = row_ranges.map(&:to_grpc)
338
321
  end
339
322
 
340
- Google::Bigtable::V2::RowSet.new(row_set)
323
+ Google::Bigtable::V2::RowSet.new row_set
341
324
  end
342
325
  end
343
326
  end
@@ -0,0 +1,172 @@
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
+ # # RoutingPolicy
21
+ #
22
+ # An abstract routing policy.
23
+ #
24
+ # See subclasses for concrete implementations:
25
+ # * {Google::Cloud::Bigtable::MultiClusterRoutingUseAny} - Read/write
26
+ # requests may be routed to any cluster in the instance and will
27
+ # fail over to another cluster in the event of transient errors or
28
+ # delays. Choosing this option sacrifices read-your-writes
29
+ # consistency to improve availability.
30
+ # * {Google::Cloud::Bigtable::SingleClusterRouting} - Unconditionally
31
+ # routes all read/write requests to a specific cluster. This option
32
+ # preserves read-your-writes consistency but does not improve
33
+ # availability. Value contains `cluster_id` and optional field
34
+ # `allow_transactional_writes`.
35
+ #
36
+ # @example Create an app profile with a single cluster routing policy.
37
+ # require "google/cloud/bigtable"
38
+ #
39
+ # bigtable = Google::Cloud::Bigtable.new
40
+ #
41
+ # instance = bigtable.instance("my-instance")
42
+ #
43
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.single_cluster_routing(
44
+ # "my-instance-cluster-1",
45
+ # allow_transactional_writes: true
46
+ # )
47
+ #
48
+ # app_profile = instance.create_app_profile(
49
+ # "my-app-profile",
50
+ # routing_policy,
51
+ # description: "App profile for user data instance"
52
+ # )
53
+ # puts app_profile.routing_policy
54
+ #
55
+ # @example Create an app profile with multi-cluster routing policy.
56
+ # require "google/cloud/bigtable"
57
+ #
58
+ # bigtable = Google::Cloud::Bigtable.new
59
+ #
60
+ # instance = bigtable.instance("my-instance")
61
+ #
62
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.multi_cluster_routing
63
+ #
64
+ # app_profile = instance.create_app_profile(
65
+ # "my-app-profile",
66
+ # routing_policy,
67
+ # description: "App profile for user data instance"
68
+ # )
69
+ # puts app_profile.routing_policy
70
+ #
71
+ class RoutingPolicy
72
+ end
73
+
74
+ ##
75
+ # A multi-cluster routing policy for all read/write requests that use the
76
+ # associated app profile.
77
+ #
78
+ # Read/write requests may be routed to any cluster in the instance, and will
79
+ # fail over to another cluster in the event of transient errors or delays.
80
+ # Choosing this option sacrifices read-your-writes consistency to improve
81
+ # availability.
82
+ #
83
+ # @example
84
+ # require "google/cloud/bigtable"
85
+ #
86
+ # bigtable = Google::Cloud::Bigtable.new
87
+ #
88
+ # instance = bigtable.instance("my-instance")
89
+ #
90
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.multi_cluster_routing
91
+ #
92
+ # app_profile = instance.create_app_profile(
93
+ # "my-app-profile",
94
+ # routing_policy,
95
+ # description: "App profile for user data instance"
96
+ # )
97
+ # puts app_profile.routing_policy
98
+ #
99
+ class MultiClusterRoutingUseAny < RoutingPolicy
100
+ # @private
101
+ def to_grpc
102
+ Google::Bigtable::Admin::V2::AppProfile::MultiClusterRoutingUseAny.new
103
+ end
104
+ end
105
+
106
+ ##
107
+ # A single-cluster routing policy for all read/write requests that use the
108
+ # associated app profile.
109
+ #
110
+ # Unconditionally routes all read/write requests to a specific cluster.
111
+ # This option preserves read-your-writes consistency, but does not improve
112
+ # availability.
113
+ #
114
+ # @example
115
+ # require "google/cloud/bigtable"
116
+ #
117
+ # bigtable = Google::Cloud::Bigtable.new
118
+ #
119
+ # instance = bigtable.instance("my-instance")
120
+ #
121
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.single_cluster_routing(
122
+ # "my-instance-cluster-1",
123
+ # allow_transactional_writes: true
124
+ # )
125
+ #
126
+ # app_profile = instance.create_app_profile(
127
+ # "my-app-profile",
128
+ # routing_policy,
129
+ # description: "App profile for user data instance"
130
+ # )
131
+ # puts app_profile.routing_policy
132
+ #
133
+ # @!attribute [rw] cluster_id
134
+ # @return [String]
135
+ # The cluster to which read/write requests should be routed.
136
+ # @!attribute [rw] allow_transactional_writes
137
+ # @return [true, false]
138
+ # If true, `CheckAndMutateRow` and `ReadModifyWriteRow` requests are
139
+ # allowed by this app profile. It is unsafe to send these requests to
140
+ # the same table/row/column in multiple clusters.
141
+ # Default value is false.
142
+ #
143
+ class SingleClusterRouting < RoutingPolicy
144
+ attr_reader :cluster_id, :allow_transactional_writes
145
+
146
+ ##
147
+ # Creates a new single-cluster routing policy.
148
+ #
149
+ # @param cluster_id [String] The cluster to which read/write requests
150
+ # should be routed.
151
+ # @param allow_transactional_writes [Boolean]
152
+ # If true, `CheckAndMutateRow` and `ReadModifyWriteRow` requests are
153
+ # allowed by this app profile. It is unsafe to send these requests to
154
+ # the same table/row/column in multiple clusters.
155
+ # Default value is false.
156
+ #
157
+ def initialize cluster_id, allow_transactional_writes
158
+ @cluster_id = cluster_id
159
+ @allow_transactional_writes = allow_transactional_writes
160
+ end
161
+
162
+ # @private
163
+ def to_grpc
164
+ Google::Bigtable::Admin::V2::AppProfile::SingleClusterRouting.new(
165
+ cluster_id: cluster_id,
166
+ allow_transactional_writes: allow_transactional_writes
167
+ )
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end