google-cloud-spanner 2.22.0 → 2.23.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 513a3295d6e11b7e4550647a7aad81ac3d52d4ea3e758d79eb39c7d62a2c7202
4
- data.tar.gz: a86f44421150171474e3335af0fa82712e26387c5ecb12051ea6d3b661a2c310
3
+ metadata.gz: 32575eadb5e1598ba5b49fc7dc27cc70e2d6f370c52aa42cdad5e9fa3059cf41
4
+ data.tar.gz: b5bec492eed277a46d4f4031e7f9ef9ef40472df57f747a1ea88266b397fafca
5
5
  SHA512:
6
- metadata.gz: b57e293bd3a352475fa1a57177dd54c153240850df552b230088c13fa5222916391dd17b36cb06817f214bd067b457ae0a66a638e30d7a364d1467e76cd70a1e
7
- data.tar.gz: a91b6efe6724f1f3a2e8b77fb2c85918bfe3b732bf17dc52b8728db9c10e1f18bde501dd09a08af24fd29f8297c4206cdbac3cdbb18427b21d97f2af584ecd81
6
+ metadata.gz: c826d09f5ff0abe190d1f51a942f120ee67b032b508edba22de82b42b079e8c833ed7e044570c5f1138c0d4e85aeb9fb3d93d571ce5db8deca898f0d456cf267
7
+ data.tar.gz: e06690d05125c1af27c8fb2e5f29f0b75b1a2d9eecd31fa6865e80fc0592caba84bc2cdb864ff25bd18a8b333019fabb52f13647b42521acf0c0706049bbc0f5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Release History
2
2
 
3
+ ### 2.23.0 (2024-06-27)
4
+
5
+ #### Features
6
+
7
+ * Support BatchWrite API ([#99](https://github.com/googleapis/ruby-spanner/issues/99))
8
+ * Support exclude_txn_from_change_streams ([#108](https://github.com/googleapis/ruby-spanner/issues/108))
9
+ #### Bug Fixes
10
+
11
+ * Resolve BigDecimal warning in Ruby 3.4 ([#103](https://github.com/googleapis/ruby-spanner/issues/103))
12
+ #### Documentation
13
+
14
+ * Update documentation regarding root partitionability ([#101](https://github.com/googleapis/ruby-spanner/issues/101))
15
+
3
16
  ### 2.22.0 (2024-04-01)
4
17
 
5
18
  #### Features
@@ -20,6 +20,8 @@ module Google
20
20
  module Spanner
21
21
  module Admin
22
22
  module Database
23
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
24
+
23
25
  ##
24
26
  # Create a new client object for a DatabaseAdmin.
25
27
  #
@@ -81,7 +83,6 @@ module Google
81
83
  #
82
84
  # @return [Admin::Database::V1::DatabaseAdmin::Client] A client object of version V1.
83
85
  #
84
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
85
86
  def self.database_admin project_id: nil,
86
87
  credentials: nil,
87
88
  scope: nil,
@@ -135,16 +136,6 @@ module Google
135
136
  # Configure the Google Cloud Spanner Database Admin library. This configuration can be
136
137
  # applied globally to all clients.
137
138
  #
138
- # @example
139
- #
140
- # Modify the global config, setting the timeout to 10 seconds for all admin databases.
141
- #
142
- # require "google/cloud/spanner/admin/database"
143
- #
144
- # ::Google::Cloud::Spanner::Admin::Database.configure do |config|
145
- # config.timeout = 10.0
146
- # end
147
- #
148
139
  # The following configuration parameters are supported:
149
140
  #
150
141
  # * `credentials` (*type:* `String, Hash, Google::Auth::Credentials`) -
@@ -172,6 +163,13 @@ module Google
172
163
  #
173
164
  # @return [::Google::Cloud::Config] The default configuration used by this library
174
165
  #
166
+ # @example Modify the global config, setting the timeout to 10 seconds for all admin databases.
167
+ # require "google/cloud/spanner/admin/database"
168
+ #
169
+ # ::Google::Cloud::Spanner::Admin::Database.configure do |config|
170
+ # config.timeout = 10.0
171
+ # end
172
+ #
175
173
  def self.configure
176
174
  @configure ||= begin
177
175
  namespace = ["Google", "Cloud", "Spanner"]
@@ -21,6 +21,8 @@ module Google
21
21
  module Spanner
22
22
  module Admin
23
23
  module Instance
24
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
25
+
24
26
  ##
25
27
  # Create a new client object for a InstanceAdmin.
26
28
  #
@@ -81,7 +83,6 @@ module Google
81
83
  #
82
84
  # @return [Admin::Instance::V1::InstanceAdmin::Client] A client object of version V1.
83
85
  #
84
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
85
86
  def self.instance_admin project_id: nil,
86
87
  credentials: nil,
87
88
  scope: nil,
@@ -135,16 +136,6 @@ module Google
135
136
  # Configure the Google Cloud Spanner Instance Admin library. This configuration can be
136
137
  # applied globally to all clients.
137
138
  #
138
- # @example
139
- #
140
- # Modify the global config, setting the timeout to 10 seconds for all admin instances.
141
- #
142
- # require "google/cloud/spanner/admin/instance"
143
- #
144
- # ::Google::Cloud::Spanner::Admin::Instance.configure do |config|
145
- # config.timeout = 10.0
146
- # end
147
- #
148
139
  # The following configuration parameters are supported:
149
140
  #
150
141
  # * `credentials` (*type:* `String, Hash, Google::Auth::Credentials`) -
@@ -172,6 +163,13 @@ module Google
172
163
  #
173
164
  # @return [::Google::Cloud::Config] The default configuration used by this library
174
165
  #
166
+ # @example Modify the global config, setting the timeout to 10 seconds for all admin instances.
167
+ # require "google/cloud/spanner/admin/instance"
168
+ #
169
+ # ::Google::Cloud::Spanner::Admin::Instance.configure do |config|
170
+ # config.timeout = 10.0
171
+ # end
172
+ #
175
173
  def self.configure
176
174
  @configure ||= begin
177
175
  namespace = ["Google", "Cloud", "Spanner"]
@@ -30,8 +30,7 @@ module Google
30
30
  # operations.
31
31
  #
32
32
  # @deprecated Use the result of
33
- # {Google::Cloud::Spanner::Admin::Database#database_admin Client#list_backup_operations}
34
- # instead.
33
+ # {Google::Cloud::Spanner::Admin::Database.database_admin}.list_backup_operations instead.
35
34
  #
36
35
  class List < DelegateClass(::Array)
37
36
  # @private
@@ -36,8 +36,7 @@ module Google
36
36
  # Long-running Operation
37
37
  #
38
38
  # @deprecated Use the long-running operation returned by
39
- # {Google::Cloud::Spanner::Admin::Database#database_admin Client#create_backup}
40
- # instead.
39
+ # {Google::Cloud::Spanner::Admin::Database.database_admin}.create_backup instead.
41
40
  #
42
41
  # @example
43
42
  # require "google/cloud/spanner"
@@ -28,9 +28,7 @@ module Google
28
28
  # Google::Cloud::Spanner::Backup::List is a special case Array with
29
29
  # additional values.
30
30
  #
31
- # @deprecated Use the result of
32
- # {Google::Cloud::Spanner::Admin::Database#database_admin Client#list_backups}
33
- # instead.
31
+ # @deprecated Use the result of {Google::Cloud::Spanner::Admin::Database.database_admin}.list_backups instead.
34
32
  #
35
33
  class List < DelegateClass(::Array)
36
34
  # @private
@@ -36,8 +36,7 @@ module Google
36
36
  # Long-running Operation
37
37
  #
38
38
  # @deprecated Use the long-running operation returned by
39
- # {Google::Cloud::Spanner::Admin::Database#database_admin Client#restore_database}
40
- # instead.
39
+ # {Google::Cloud::Spanner::Admin::Database.database_admin}.restore_database instead.
41
40
  #
42
41
  # @example
43
42
  # require "google/cloud/spanner"
@@ -101,12 +101,13 @@ module Google
101
101
  # configured, although the values given may not necessarily be honored
102
102
  # depending on the query and options in the request.
103
103
  #
104
- # The query must have a single [distributed
104
+ # The request will fail if the query is not root partitionable. For a
105
+ # query to be root partitionable, it needs to satisfy a few conditions.
106
+ # For example, if the query execution plan contains a [distributed
105
107
  # union](https://cloud.google.com/spanner/docs/query-execution-operators#distributed_union)
106
- # operator at the root of the query plan. Such queries are
107
- # root-partitionable. If a query cannot be partitioned at the root,
108
- # Cloud Spanner cannot achieve the parallelism and in this case
109
- # partition generation will fail.
108
+ # operator, then it must be the first operator in the plan. For more
109
+ # information about other conditions, see [Read data in
110
+ # parallel](https://cloud.google.com/spanner/docs/reads#read_data_in_parallel).
110
111
  #
111
112
  # @param [String] sql The SQL query string. See [Query
112
113
  # syntax](https://cloud.google.com/spanner/docs/query-syntax).
@@ -155,8 +155,7 @@ module Google
155
155
  end
156
156
 
157
157
  def to_grpc
158
- converted_params, converted_types = \
159
- Convert.to_input_params_and_types params, types
158
+ converted_params, converted_types = Convert.to_input_params_and_types params, types
160
159
  # param_types is a grpc map field, can't be nil
161
160
  converted_types ||= {}
162
161
  V1::ExecuteBatchDmlRequest::Statement.new(
@@ -0,0 +1,72 @@
1
+ # Copyright 2024 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
+ require "google/cloud/spanner/mutation_group"
16
+ require "google/cloud/spanner/v1"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Spanner
21
+ ##
22
+ # Part of the BatchWrite DSL.
23
+ #
24
+ # This object is passed as a parameter to the block passed to
25
+ # {Google::Cloud::Spanner::Client#batch_write}. Use this parameter to add
26
+ # mutation groups to the batch.
27
+ #
28
+ class BatchWrite
29
+ # @private
30
+ def initialize
31
+ @mutation_groups = []
32
+ end
33
+
34
+ ##
35
+ # Adds a group of mutations
36
+ #
37
+ # @example
38
+ # require "google/cloud/spanner"
39
+ #
40
+ # spanner = Google::Cloud::Spanner.new
41
+ #
42
+ # db = spanner.client "my-instance", "my-database"
43
+ #
44
+ # results = db.batch_write do |b|
45
+ # # First mutation group
46
+ # b.mutation_group do |mg|
47
+ # mg.upsert "Singers", [{ SingerId: 16, FirstName: "Charlie", LastName: "Terry" }]
48
+ # end
49
+ #
50
+ # # Second mutation group
51
+ # b.mutation_group do |mg|
52
+ # mg.upsert "Singers", [{ SingerId: 17, FirstName: "Catalina", LastName: "Smith" }]
53
+ # mg.update "Albums", [{ SingerId: 17, AlbumId: 1, AlbumTitle: "Go Go Go" }]
54
+ # end
55
+ # end
56
+ #
57
+ def mutation_group
58
+ mg = MutationGroup.new
59
+ yield mg
60
+ @mutation_groups << mg
61
+ end
62
+
63
+ # @private
64
+ def mutation_groups_grpc
65
+ @mutation_groups.map do |mg|
66
+ Google::Cloud::Spanner::V1::BatchWriteRequest::MutationGroup.new mutations: mg.mutations
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,142 @@
1
+ # Copyright 2024 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
+ require "google/cloud/errors"
16
+ require "google/cloud/spanner/convert"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Spanner
21
+ ##
22
+ # Results of a batch write.
23
+ #
24
+ # This is a stream of {BatchWriteResults::BatchResult} objects, each of
25
+ # which represents a set of mutation groups applied together.
26
+ #
27
+ # Use the Ruby Enumerable module to iterate over the results.
28
+ #
29
+ class BatchWriteResults
30
+ ##
31
+ # Result of a set of mutation groups applied together.
32
+ #
33
+ class BatchResult
34
+ # @private
35
+ def initialize grpc
36
+ @grpc = grpc
37
+ end
38
+
39
+ ##
40
+ # The indexes of the mutation groups applied together.
41
+ #
42
+ # @return [::Array<::Integer>]
43
+ #
44
+ def indexes
45
+ @grpc.indexes.to_a
46
+ end
47
+
48
+ ##
49
+ # The result of this set of mutation groups.
50
+ #
51
+ # @return [::Google::Rpc::Status]
52
+ #
53
+ def status
54
+ @grpc.status
55
+ end
56
+
57
+ ##
58
+ # Whether these mutation groups were successful.
59
+ #
60
+ # @return [::Boolean]
61
+ #
62
+ def ok?
63
+ status.code.zero?
64
+ end
65
+
66
+ ##
67
+ # Whether these mutation groups were unsuccessful.
68
+ #
69
+ # @return [::Boolean]
70
+ #
71
+ def error?
72
+ !ok?
73
+ end
74
+
75
+ ##
76
+ # The timestamp of the commit.
77
+ #
78
+ # @return [::Time]
79
+ #
80
+ def commit_timestamp
81
+ Convert.timestamp_to_time @grpc.commit_timestamp
82
+ end
83
+ end
84
+
85
+ # @private
86
+ def initialize enum
87
+ @enumerable = enum
88
+ end
89
+
90
+ ##
91
+ # Iterate over the results.
92
+ #
93
+ # @yield [::Google::Cloud::Spanner::BatchWriteResults::BatchResult]
94
+ #
95
+ def each &block
96
+ if defined? @results
97
+ @results.each(&block)
98
+ else
99
+ results = []
100
+ @enumerable.each do |grpc|
101
+ result = BatchResult.new grpc
102
+ results << result
103
+ yield result
104
+ end
105
+ @results = results
106
+ end
107
+ rescue GRPC::BadStatus => e
108
+ raise Google::Cloud::Error.from_error(e)
109
+ end
110
+
111
+ include Enumerable
112
+
113
+ ##
114
+ # Whether all mutation groups were successful.
115
+ #
116
+ # @return [::Boolean]
117
+ #
118
+ def ok?
119
+ all?(&:ok?)
120
+ end
121
+
122
+ ##
123
+ # Whether at least one mutation group encountered an error.
124
+ #
125
+ # @return [::Boolean]
126
+ #
127
+ def error?
128
+ !ok?
129
+ end
130
+
131
+ ##
132
+ # A list of the indexes of successful mutation groups.
133
+ #
134
+ # @return [::Array<::Integer>]
135
+ #
136
+ def successful_indexes
137
+ flat_map { |batch_result| batch_result.ok? ? batch_result.indexes : [] }
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end