google-cloud-spanner 2.6.0 → 2.9.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: 0faea5b1e581fbc3981a52fa5ea8b2f1674f79fc71bc3000639020739747b5ea
4
- data.tar.gz: bd4d345cbf3cefc8dbba31a2d74d4f729e8a5d9e3364277ba3d168d572c2538b
3
+ metadata.gz: 39a33a615e75cde66aa1d0ebf4631f34d5b139fa0a5c9fe203a20a4f157c5534
4
+ data.tar.gz: 415409aa55971910e5c337a6d88a2ee0e78671a3cde9ab0ebf3170edab8151ca
5
5
  SHA512:
6
- metadata.gz: 8b315bed1e2a9ef29f956333086d2ad35a77f8d8c305440fea90830b89d074269c8969cb5c6002a33f3f660974defa165eb270d4671338a3f7df43c07015d78f
7
- data.tar.gz: c2807ef7f0f1289a6515114c34aba03dd3959a50467f4c2fa6ef22efd88c2b75db87b40e1ec8b5a3b29a7e334f5c96d2fc07a1196e3100a3a6c518d726da3ecd
6
+ metadata.gz: a83fc9125b21861b192099c025596c0224eb3b2d4c7904809a52062358c35d621510ef0e8d2b9ecd583609514d440e19927130fcdf56242ea2a6765a5ce83a03
7
+ data.tar.gz: 0e5a053289cb6393d62533836eda651217e60388d43931613245ac3b55ddb3d17b8c98cbb866fc0efec703bba398ccb7f18b38fb6129c11b03306bb8419f823f
data/AUTHENTICATION.md CHANGED
@@ -95,7 +95,8 @@ client = Google::Cloud::Spanner.new
95
95
 
96
96
  ### Configuration
97
97
 
98
- The **Project ID** and **Credentials JSON** can be configured instead of placing them in environment variables or providing them as arguments.
98
+ The **Project ID** and the path to the **Credentials JSON** file can be configured
99
+ instead of placing them in environment variables or providing them as arguments.
99
100
 
100
101
  ```ruby
101
102
  require "google/cloud/spanner"
data/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # Release History
2
2
 
3
+ ### 2.9.0 / 2021-07-26
4
+
5
+ #### Features
6
+
7
+ * support request tagging ([#8163](https://www.github.com/googleapis/google-cloud-ruby/issues/8163))
8
+
9
+ ### 2.8.1 / 2021-07-08
10
+
11
+ #### Documentation
12
+
13
+ * Update AUTHENTICATION.md in handwritten packages
14
+
15
+ ### 2.8.0 / 2021-06-17
16
+
17
+ #### Features
18
+
19
+ * create instance using processing units/node count ([#11379](https://www.github.com/googleapis/google-cloud-ruby/issues/11379))
20
+ * create instance using processing units/node count
21
+ * fix typo
22
+ * removed node count and processing unit validations
23
+ * update orignal value on instance save
24
+ * remove orignal_values to current_valuess
25
+
26
+ ### 2.7.0 / 2021-06-09
27
+
28
+ #### Features
29
+
30
+ * add the support of optimizer statistics package ([#7591](https://www.github.com/googleapis/google-cloud-ruby/issues/7591))
31
+ * feat(spanner): add the support of optimizer statistics package
32
+ * Fix rubocop issues.
33
+ * Fix the env issue.
34
+ * database create time access method ([#11617](https://www.github.com/googleapis/google-cloud-ruby/issues/11617))
35
+ * added database create time method
36
+ * remove assert for databse create time
37
+ * RPC priority request option. ([#11258](https://www.github.com/googleapis/google-cloud-ruby/issues/11258))
38
+
39
+ #### Bug Fixes
40
+
41
+ * extract binary retry info from error ([#11656](https://www.github.com/googleapis/google-cloud-ruby/issues/11656))
42
+ * fix: extract binary retry info from error
43
+ * fix: remove unrelated frozen_string_literal change
44
+ * fix: remove unnecessary parentheses
45
+
3
46
  ### 2.6.0 / 2021-03-31
4
47
 
5
48
  #### Features
data/OVERVIEW.md CHANGED
@@ -316,7 +316,7 @@ spanner = Google::Cloud::Spanner.new
316
316
  instance = spanner.instance "my-instance"
317
317
 
318
318
  instance.delete
319
- ````
319
+ ```
320
320
 
321
321
  ## Additional information
322
322
 
@@ -156,7 +156,9 @@ Google::Cloud.configure.add_config! :spanner do |config|
156
156
  default_query_options = Google::Cloud::Config.deferred do
157
157
  query_options = {}
158
158
  optimizer_version = ENV["SPANNER_OPTIMIZER_VERSION"]
159
+ optimizer_stats_pkg = ENV["SPANNER_OPTIMIZER_STATISTICS_PACKAGE"]
159
160
  query_options[:optimizer_version] = optimizer_version if optimizer_version
161
+ query_options[:optimizer_statistics_package] = optimizer_stats_pkg if optimizer_stats_pkg
160
162
  query_options = nil if query_options.empty?
161
163
  query_options
162
164
  end
@@ -173,6 +173,8 @@ module Google
173
173
  # * `:optimizer_version` (String) The version of optimizer to use.
174
174
  # Empty to use database default. "latest" to use the latest
175
175
  # available optimizer version.
176
+ # * `:optimizer_statistics_package` (String) Statistics package to
177
+ # use. Empty to use the database default.
176
178
  # @param [Hash] call_options A hash of values to specify the custom
177
179
  # call options, e.g., timeout, retries, etc. Call options are
178
180
  # optional. The following settings can be provided:
@@ -473,6 +475,8 @@ module Google
473
475
  # * `:optimizer_version` (String) The version of optimizer to use.
474
476
  # Empty to use database default. "latest" to use the latest
475
477
  # available optimizer version.
478
+ # * `:optimizer_statistics_package` (String) Statistics package to
479
+ # use. Empty to use the database default.
476
480
  # @param [Hash] call_options A hash of values to specify the custom
477
481
  # call options, e.g., timeout, retries, etc. Call options are
478
482
  # optional. The following settings can be provided:
@@ -598,8 +602,11 @@ module Google
598
602
  # batch_snapshot = batch_client.batch_snapshot
599
603
  #
600
604
  # results = batch_snapshot.execute_query \
601
- # "SELECT * FROM users",
602
- # query_options: { optimizer_version: "1" }
605
+ # "SELECT * FROM users",
606
+ # query_options: {
607
+ # optimizer_version: "1",
608
+ # optimizer_statistics_package: "auto_20191128_14_47_22UTC"
609
+ # }
603
610
  #
604
611
  # results.rows.each do |row|
605
612
  # puts "User #{row[:id]} is #{row[:name]}"
@@ -42,12 +42,10 @@ module Google
42
42
  #
43
43
  # db = spanner.client "my-instance", "my-database"
44
44
  #
45
- # db.transaction do |tx|
46
- # results = tx.execute_query "SELECT * FROM users"
45
+ # results = db.execute_query "SELECT * FROM users"
47
46
  #
48
- # results.rows.each do |row|
49
- # puts "User #{row[:id]} is #{row[:name]}"
50
- # end
47
+ # results.rows.each do |row|
48
+ # puts "User #{row[:id]} is #{row[:name]}"
51
49
  # end
52
50
  #
53
51
  class Client
@@ -129,6 +127,7 @@ module Google
129
127
  # | `BOOL` | `true`/`false` | |
130
128
  # | `INT64` | `Integer` | |
131
129
  # | `FLOAT64` | `Float` | |
130
+ # | `NUMERIC` | `BigDecimal` | |
132
131
  # | `STRING` | `String` | |
133
132
  # | `DATE` | `Date` | |
134
133
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -154,6 +153,7 @@ module Google
154
153
  # * `:BYTES`
155
154
  # * `:DATE`
156
155
  # * `:FLOAT64`
156
+ # * `:NUMERIC`
157
157
  # * `:INT64`
158
158
  # * `:STRING`
159
159
  # * `:TIMESTAMP`
@@ -167,6 +167,9 @@ module Google
167
167
  # @param [Hash] single_use Perform the read with a single-use snapshot
168
168
  # (read-only transaction). (See
169
169
  # [TransactionOptions](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#transactionoptions).)
170
+ # If no value is specified for this parameter, Cloud Spanner will use
171
+ # a single use read-only transaction with strong timestamp bound as
172
+ # default.
170
173
  # The snapshot can be created by providing exactly one of the
171
174
  # following options in the hash:
172
175
  #
@@ -223,6 +226,20 @@ module Google
223
226
  # * `:optimizer_version` (String) The version of optimizer to use.
224
227
  # Empty to use database default. "latest" to use the latest
225
228
  # available optimizer version.
229
+ # * `:optimizer_statistics_package` (String) Statistics package to
230
+ # use. Empty to use the database default.
231
+ # @param [Hash] request_options Common request options.
232
+ #
233
+ # * `:priority` (Symbol) The relative priority for requests.
234
+ # The priority acts as a hint to the Cloud Spanner scheduler
235
+ # and does not guarantee priority or order of execution.
236
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
237
+ # `:PRIORITY_HIGH`. If priority not set then default is
238
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
239
+ # * `:tag` (String) A per-request tag which can be applied to
240
+ # queries or reads, used for statistics collection. Tag must be a
241
+ # valid identifier of the form: `[a-zA-Z][a-zA-Z0-9_\-]` between 2
242
+ # and 64 characters in length.
226
243
  # @param [Hash] call_options A hash of values to specify the custom
227
244
  # call options, e.g., timeout, retries, etc. Call options are
228
245
  # optional. The following settings can be provided:
@@ -343,7 +360,10 @@ module Google
343
360
  # db = spanner.client "my-instance", "my-database"
344
361
  #
345
362
  # results = db.execute_query \
346
- # "SELECT * FROM users", query_options: { optimizer_version: "1" }
363
+ # "SELECT * FROM users", query_options: {
364
+ # optimizer_version: "1",
365
+ # optimizer_statistics_package: "auto_20191128_14_47_22UTC"
366
+ # }
347
367
  #
348
368
  # results.rows.each do |row|
349
369
  # puts "User #{row[:id]} is #{row[:name]}"
@@ -372,19 +392,52 @@ module Google
372
392
  # puts "User #{row[:id]} is #{row[:name]}"
373
393
  # end
374
394
  #
395
+ # @example Using request options.
396
+ # require "google/cloud/spanner"
397
+ #
398
+ # spanner = Google::Cloud::Spanner.new
399
+ #
400
+ # db = spanner.client "my-instance", "my-database"
401
+ #
402
+ # request_options = { priority: :PRIORITY_MEDIUM }
403
+ # results = db.execute_query "SELECT * FROM users",
404
+ # request_options: request_options
405
+ #
406
+ # results.rows.each do |row|
407
+ # puts "User #{row[:id]} is #{row[:name]}"
408
+ # end
409
+ #
410
+ # @example Query using tag for request query statistics collection.
411
+ # require "google/cloud/spanner"
412
+ #
413
+ # spanner = Google::Cloud::Spanner.new
414
+ #
415
+ # db = spanner.client "my-instance", "my-database"
416
+ #
417
+ # request_options = { tag: "Read-Users" }
418
+ # results = db.execute_query "SELECT * FROM users",
419
+ # request_options: request_options
420
+ #
421
+ # results.rows.each do |row|
422
+ # puts "User #{row[:id]} is #{row[:name]}"
423
+ # end
424
+ #
375
425
  def execute_query sql, params: nil, types: nil, single_use: nil,
376
- query_options: nil, call_options: nil
426
+ query_options: nil, request_options: nil,
427
+ call_options: nil
377
428
  validate_single_use_args! single_use
378
429
  ensure_service!
379
430
 
380
431
  params, types = Convert.to_input_params_and_types params, types
381
-
432
+ request_options = Convert.to_request_options request_options,
433
+ tag_type: :request_tag
382
434
  single_use_tx = single_use_transaction single_use
383
435
  results = nil
384
436
  @pool.with_session do |session|
385
437
  results = session.execute_query \
386
438
  sql, params: params, types: types, transaction: single_use_tx,
387
- query_options: query_options, call_options: call_options
439
+ query_options: query_options, request_options: request_options,
440
+ call_options: call_options
388
441
  end
389
442
  results
390
443
  end
@@ -408,7 +461,7 @@ module Google
408
461
  # once" semantics.
409
462
  #
410
463
  # Where DML statements must be executed using Transaction (see
411
- # {Transaction#execute_update}), Paritioned DML statements are executed
464
+ # {Transaction#execute_update}), Partitioned DML statements are executed
412
465
  # outside of a read/write transaction.
413
466
  #
414
467
  # Not all DML statements can be executed in the Partitioned DML mode and
@@ -494,6 +547,7 @@ module Google
494
547
  # | `BOOL` | `true`/`false` | |
495
548
  # | `INT64` | `Integer` | |
496
549
  # | `FLOAT64` | `Float` | |
550
+ # | `NUMERIC` | `BigDecimal` | |
497
551
  # | `STRING` | `String` | |
498
552
  # | `DATE` | `Date` | |
499
553
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -520,6 +574,7 @@ module Google
520
574
  # * `:BYTES`
521
575
  # * `:DATE`
522
576
  # * `:FLOAT64`
577
+ # * `:NUMERIC`
523
578
  # * `:INT64`
524
579
  # * `:STRING`
525
580
  # * `:TIMESTAMP`
@@ -535,6 +590,20 @@ module Google
535
590
  # * `:optimizer_version` (String) The version of optimizer to use.
536
591
  # Empty to use database default. "latest" to use the latest
537
592
  # available optimizer version.
593
+ # * `:optimizer_statistics_package` (String) Statistics package to
594
+ # use. Empty to use the database default.
595
+ # @param [Hash] request_options Common request options.
596
+ #
597
+ # * `:priority` (String) The relative priority for requests.
598
+ # The priority acts as a hint to the Cloud Spanner scheduler
599
+ # and does not guarantee priority or order of execution.
600
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
601
+ # `:PRIORITY_HIGH`. If priority not set then default is
602
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
603
+ # * `:tag` (String) A per-request tag which can be applied to
604
+ # queries or reads, used for statistics collection. Tag must be a
605
+ # valid identifier of the form: `[a-zA-Z][a-zA-Z0-9_\-]` between 2
606
+ # and 64 characters in length.
538
607
  # @param [Hash] call_options A hash of values to specify the custom
539
608
  # call options, e.g., timeout, retries, etc. Call options are
540
609
  # optional. The following settings can be provided:
@@ -577,7 +646,10 @@ module Google
577
646
  #
578
647
  # row_count = db.execute_partition_update \
579
648
  # "UPDATE users SET friends = NULL WHERE active = false",
580
- # query_options: { optimizer_version: "1" }
649
+ # query_options: {
650
+ # optimizer_version: "1",
651
+ # optimizer_statistics_package: "auto_20191128_14_47_22UTC"
652
+ # }
581
653
  #
582
654
  # @example Query using custom timeout and retry policy:
583
655
  # require "google/cloud/spanner"
@@ -598,17 +670,45 @@ module Google
598
670
  # "UPDATE users SET friends = NULL WHERE active = false",
599
671
  # call_options: call_options
600
672
  #
673
+ # @example Using request options.
674
+ # require "google/cloud/spanner"
675
+ #
676
+ # spanner = Google::Cloud::Spanner.new
677
+ # db = spanner.client "my-instance", "my-database"
678
+ #
679
+ # request_options = { priority: :PRIORITY_MEDIUM }
680
+ # row_count = db.execute_partition_update \
681
+ # "UPDATE users SET friends = NULL WHERE active = @active",
682
+ # params: { active: false }, request_options: request_options
683
+ #
684
+ # @example Query using tag for request query statistics collection.
685
+ #
686
+ # require "google/cloud/spanner"
687
+ #
688
+ # spanner = Google::Cloud::Spanner.new
689
+ # db = spanner.client "my-instance", "my-database"
690
+ #
691
+ # request_options = { tag: "Update-Users" }
692
+ # row_count = db.execute_partition_update \
693
+ # "UPDATE users SET friends = NULL WHERE active = false",
694
+ # request_options: request_options
695
+ #
601
696
  def execute_partition_update sql, params: nil, types: nil,
602
- query_options: nil, call_options: nil
697
+ query_options: nil, request_options: nil,
698
+ call_options: nil
603
699
  ensure_service!
604
700
 
605
701
  params, types = Convert.to_input_params_and_types params, types
702
+ request_options = Convert.to_request_options request_options,
703
+ tag_type: :request_tag
704
+
606
705
  results = nil
607
706
  @pool.with_session do |session|
608
707
  results = session.execute_query \
609
708
  sql, params: params, types: types,
610
709
  transaction: pdml_transaction(session),
611
- query_options: query_options, call_options: call_options
710
+ query_options: query_options, request_options: request_options,
711
+ call_options: call_options
612
712
  end
613
713
  # Stream all PartialResultSet to get ResultSetStats
614
714
  results.rows.to_a
@@ -640,6 +740,9 @@ module Google
640
740
  # @param [Hash] single_use Perform the read with a single-use snapshot
641
741
  # (read-only transaction). (See
642
742
  # [TransactionOptions](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#transactionoptions).)
743
+ # If no value is specified for this parameter, Cloud Spanner will use
744
+ # a single use read-only transaction with strong timestamp bound as
745
+ # default.
643
746
  # The snapshot can be created by providing exactly one of the
644
747
  # following options in the hash:
645
748
  #
@@ -689,6 +792,18 @@ module Google
689
792
  # Useful for reading the freshest data available at a nearby
690
793
  # replica, while bounding the possible staleness if the local
691
794
  # replica has fallen behind.
795
+ # @param [Hash] request_options Common request options.
796
+ #
797
+ # * `:priority` (Symbol) The relative priority for requests.
798
+ # The priority acts as a hint to the Cloud Spanner scheduler
799
+ # and does not guarantee priority or order of execution.
800
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
801
+ # `:PRIORITY_HIGH`. If priority not set then default is
802
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
803
+ # * `:tag` (String) A per-request tag which can be applied to
804
+ # queries or reads, used for statistics collection. Tag must be a
805
+ # valid identifier of the form: `[a-zA-Z][a-zA-Z0-9_\-]` between 2
806
+ # and 64 characters in length.
692
807
  # @param [Hash] call_options A hash of values to specify the custom
693
808
  # call options, e.g., timeout, retries, etc. Call options are
694
809
  # optional. The following settings can be provided:
@@ -753,20 +868,54 @@ module Google
753
868
  # puts "User #{row[:id]} is #{row[:name]}"
754
869
  # end
755
870
  #
871
+ # @example Using request options.
872
+ # require "google/cloud/spanner"
873
+ #
874
+ # spanner = Google::Cloud::Spanner.new
875
+ #
876
+ # db = spanner.client "my-instance", "my-database"
877
+ #
878
+ # request_options = { priority: :PRIORITY_MEDIUM }
879
+ # results = db.read "users", [:id, :name],
880
+ # request_options: request_options
881
+ #
882
+ # results.rows.each do |row|
883
+ # puts "User #{row[:id]} is #{row[:name]}"
884
+ # end
885
+ #
886
+ # @example Read using tag for read statistics collection.
887
+ #
888
+ # require "google/cloud/spanner"
889
+ #
890
+ # spanner = Google::Cloud::Spanner.new
891
+ #
892
+ # db = spanner.client "my-instance", "my-database"
893
+ #
894
+ # request_options = { tag: "Read-Users-All" }
895
+ # results = db.read "users", [:id, :name],
896
+ # request_options: request_options
897
+ #
898
+ # results.rows.each do |row|
899
+ # puts "User #{row[:id]} is #{row[:name]}"
900
+ # end
901
+ #
756
902
  def read table, columns, keys: nil, index: nil, limit: nil,
757
- single_use: nil, call_options: nil
903
+ single_use: nil, request_options: nil, call_options: nil
758
904
  validate_single_use_args! single_use
759
905
  ensure_service!
760
906
 
761
907
  columns = Array(columns).map(&:to_s)
762
908
  keys = Convert.to_key_set keys
763
-
764
909
  single_use_tx = single_use_transaction single_use
910
+ request_options = Convert.to_request_options request_options,
911
+ tag_type: :request_tag
912
+
765
913
  results = nil
766
914
  @pool.with_session do |session|
767
915
  results = session.read \
768
916
  table, columns, keys: keys, index: index, limit: limit,
769
917
  transaction: single_use_tx,
918
+ request_options: request_options,
770
919
  call_options: call_options
771
920
  end
772
921
  results
@@ -801,6 +950,7 @@ module Google
801
950
  # | `BOOL` | `true`/`false` | |
802
951
  # | `INT64` | `Integer` | |
803
952
  # | `FLOAT64` | `Float` | |
953
+ # | `NUMERIC` | `BigDecimal` | |
804
954
  # | `STRING` | `String` | |
805
955
  # | `DATE` | `Date` | |
806
956
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -817,6 +967,17 @@ module Google
817
967
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
818
968
  # then statistics related to the transaction will be included in
819
969
  # {CommitResponse}. Default value is `false`
970
+ # @param [Hash] request_options Common request options.
971
+ #
972
+ # * `:priority` (String) The relative priority for requests.
973
+ # The priority acts as a hint to the Cloud Spanner scheduler
974
+ # and does not guarantee priority or order of execution.
975
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
976
+ # `:PRIORITY_HIGH`. If priority not set then default is
977
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
978
+ # * `:tag` (String) A tag used for statistics collection
979
+ # about transaction. A tag must be a valid identifier of the format:
980
+ # `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`.
820
981
  #
821
982
  # @return [Time, CommitResponse] The timestamp at which the operation
822
983
  # committed. If commit options are set it returns {CommitResponse}.
@@ -846,9 +1007,37 @@ module Google
846
1007
  # puts commit_resp.timestamp
847
1008
  # puts commit_resp.stats.mutation_count
848
1009
  #
849
- def upsert table, rows, commit_options: nil
1010
+ # @example Using request options.
1011
+ # require "google/cloud/spanner"
1012
+ #
1013
+ # spanner = Google::Cloud::Spanner.new
1014
+ #
1015
+ # db = spanner.client "my-instance", "my-database"
1016
+ #
1017
+ # request_options = { priority: :PRIORITY_MEDIUM }
1018
+ # db.upsert "users", [{ id: 1, name: "Charlie", active: false }],
1019
+ # request_options: request_options
1020
+ #
1021
+ # @example Upsert using tag for transaction statistics collection.
1022
+ #
1023
+ # require "google/cloud/spanner"
1024
+ #
1025
+ # spanner = Google::Cloud::Spanner.new
1026
+ #
1027
+ # db = spanner.client "my-instance", "my-database"
1028
+ #
1029
+ # request_options = { tag: "Bulk-Upsert" }
1030
+ # db.upsert "users", [{ id: 1, name: "Charlie", active: false },
1031
+ # { id: 2, name: "Harvey", active: true }],
1032
+ # request_options: request_options
1033
+ #
1034
+ def upsert table, rows, commit_options: nil, request_options: nil
1035
+ request_options = Convert.to_request_options \
1036
+ request_options, tag_type: :transaction_tag
1037
+
850
1038
  @pool.with_session do |session|
851
- session.upsert table, rows, commit_options: commit_options
1039
+ session.upsert table, rows, commit_options: commit_options,
1040
+ request_options: request_options
852
1041
  end
853
1042
  end
854
1043
  alias save upsert
@@ -881,6 +1070,7 @@ module Google
881
1070
  # | `BOOL` | `true`/`false` | |
882
1071
  # | `INT64` | `Integer` | |
883
1072
  # | `FLOAT64` | `Float` | |
1073
+ # | `NUMERIC` | `BigDecimal` | |
884
1074
  # | `STRING` | `String` | |
885
1075
  # | `DATE` | `Date` | |
886
1076
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -889,7 +1079,6 @@ module Google
889
1079
  #
890
1080
  # See [Data
891
1081
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
892
- #
893
1082
  # @param [Hash] commit_options A hash of commit options.
894
1083
  # e.g., return_commit_stats. Commit options are optional.
895
1084
  # The following options can be provided:
@@ -897,6 +1086,17 @@ module Google
897
1086
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
898
1087
  # then statistics related to the transaction will be included in
899
1088
  # {CommitResponse}. Default value is `false`
1089
+ # @param [Hash] request_options Common request options.
1090
+ #
1091
+ # * `:priority` (String) The relative priority for requests.
1092
+ # The priority acts as a hint to the Cloud Spanner scheduler
1093
+ # and does not guarantee priority or order of execution.
1094
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1095
+ # `:PRIORITY_HIGH`. If priority not set then default is
1096
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1097
+ # * `:tag` (String) A tag used for statistics collection
1098
+ # about transaction. A tag must be a valid identifier of the
1099
+ # format: `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`.
900
1100
  #
901
1101
  # @return [Time, CommitResponse] The timestamp at which the operation
902
1102
  # committed. If commit options are set it returns {CommitResponse}.
@@ -926,9 +1126,37 @@ module Google
926
1126
  # puts commit_resp.timestamp
927
1127
  # puts commit_resp.stats.mutation_count
928
1128
  #
929
- def insert table, rows, commit_options: nil
1129
+ # @example Using request options.
1130
+ # require "google/cloud/spanner"
1131
+ #
1132
+ # spanner = Google::Cloud::Spanner.new
1133
+ #
1134
+ # db = spanner.client "my-instance", "my-database"
1135
+ #
1136
+ # request_options = { priority: :PRIORITY_MEDIUM }
1137
+ # db.insert "users", [{ id: 1, name: "Charlie", active: false }],
1138
+ # request_options: request_options
1139
+ #
1140
+ # @example Insert using tag for transaction statistics collection.
1141
+ #
1142
+ # require "google/cloud/spanner"
1143
+ #
1144
+ # spanner = Google::Cloud::Spanner.new
1145
+ #
1146
+ # db = spanner.client "my-instance", "my-database"
1147
+ #
1148
+ # request_options = { tag: "BulkInsert-Users" }
1149
+ # db.insert "users", [{ id: 1, name: "Charlie", active: false },
1150
+ # { id: 2, name: "Harvey", active: true }],
1151
+ # request_options: request_options
1152
+ #
1153
+ def insert table, rows, commit_options: nil, request_options: nil
1154
+ request_options = Convert.to_request_options \
1155
+ request_options, tag_type: :transaction_tag
1156
+
930
1157
  @pool.with_session do |session|
931
- session.insert table, rows, commit_options: commit_options
1158
+ session.insert table, rows, commit_options: commit_options,
1159
+ request_options: request_options
932
1160
  end
933
1161
  end
934
1162
 
@@ -960,6 +1188,7 @@ module Google
960
1188
  # | `BOOL` | `true`/`false` | |
961
1189
  # | `INT64` | `Integer` | |
962
1190
  # | `FLOAT64` | `Float` | |
1191
+ # | `NUMERIC` | `BigDecimal` | |
963
1192
  # | `STRING` | `String` | |
964
1193
  # | `DATE` | `Date` | |
965
1194
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -968,7 +1197,6 @@ module Google
968
1197
  #
969
1198
  # See [Data
970
1199
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
971
- #
972
1200
  # @param [Hash] commit_options A hash of commit options.
973
1201
  # e.g., return_commit_stats. Commit options are optional.
974
1202
  # The following options can be provided:
@@ -976,6 +1204,17 @@ module Google
976
1204
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
977
1205
  # then statistics related to the transaction will be included in
978
1206
  # {CommitResponse}. Default value is `false`
1207
+ # @param [Hash] request_options Common request options.
1208
+ #
1209
+ # * `:priority` (String) The relative priority for requests.
1210
+ # The priority acts as a hint to the Cloud Spanner scheduler
1211
+ # and does not guarantee priority or order of execution.
1212
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1213
+ # `:PRIORITY_HIGH`. If priority not set then default is
1214
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1215
+ # * `:tag` (String) A tag used for statistics collection
1216
+ # about transaction. A tag must be a valid identifier of the
1217
+ # format: `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`.
979
1218
  #
980
1219
  # @return [Time, CommitResponse] The timestamp at which the operation
981
1220
  # committed. If commit options are set it returns {CommitResponse}.
@@ -1005,9 +1244,36 @@ module Google
1005
1244
  # puts commit_resp.timestamp
1006
1245
  # puts commit_resp.stats.mutation_count
1007
1246
  #
1008
- def update table, rows, commit_options: nil
1247
+ # @example Using request options.
1248
+ # require "google/cloud/spanner"
1249
+ #
1250
+ # spanner = Google::Cloud::Spanner.new
1251
+ #
1252
+ # db = spanner.client "my-instance", "my-database"
1253
+ #
1254
+ # request_options = { priority: :PRIORITY_MEDIUM }
1255
+ # db.update "users", [{ id: 1, name: "Charlie", active: false }],
1256
+ # request_options: request_options
1257
+ #
1258
+ # @example Updte using tag for transaction statistics collection.
1259
+ # require "google/cloud/spanner"
1260
+ #
1261
+ # spanner = Google::Cloud::Spanner.new
1262
+ #
1263
+ # db = spanner.client "my-instance", "my-database"
1264
+ #
1265
+ # request_options = { tag: "BulkUpdate-Users" }
1266
+ # db.update "users", [{ id: 1, name: "Charlie", active: false },
1267
+ # { id: 2, name: "Harvey", active: true }],
1268
+ # request_options: request_options
1269
+ #
1270
+ def update table, rows, commit_options: nil, request_options: nil
1271
+ request_options = Convert.to_request_options \
1272
+ request_options, tag_type: :transaction_tag
1273
+
1009
1274
  @pool.with_session do |session|
1010
- session.update table, rows, commit_options: commit_options
1275
+ session.update table, rows, commit_options: commit_options,
1276
+ request_options: request_options
1011
1277
  end
1012
1278
  end
1013
1279
 
@@ -1041,6 +1307,7 @@ module Google
1041
1307
  # | `BOOL` | `true`/`false` | |
1042
1308
  # | `INT64` | `Integer` | |
1043
1309
  # | `FLOAT64` | `Float` | |
1310
+ # | `NUMERIC` | `BigDecimal` | |
1044
1311
  # | `STRING` | `String` | |
1045
1312
  # | `DATE` | `Date` | |
1046
1313
  # | `TIMESTAMP` | `Time`, `DateTime` | |
@@ -1049,7 +1316,6 @@ module Google
1049
1316
  #
1050
1317
  # See [Data
1051
1318
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
1052
- #
1053
1319
  # @param [Hash] commit_options A hash of commit options.
1054
1320
  # e.g., return_commit_stats. Commit options are optional.
1055
1321
  # The following options can be provided:
@@ -1057,6 +1323,17 @@ module Google
1057
1323
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1058
1324
  # then statistics related to the transaction will be included in
1059
1325
  # {CommitResponse}. Default value is `false`
1326
+ # @param [Hash] request_options Common request options.
1327
+ #
1328
+ # * `:priority` (String) The relative priority for requests.
1329
+ # The priority acts as a hint to the Cloud Spanner scheduler
1330
+ # and does not guarantee priority or order of execution.
1331
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1332
+ # `:PRIORITY_HIGH`. If priority not set then default is
1333
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1334
+ # * `:tag` (String) A tag used for statistics collection
1335
+ # about transaction. A tag must be a valid identifier of the
1336
+ # format: `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`.
1060
1337
  #
1061
1338
  # @return [Time, CommitResponse] The timestamp at which the operation
1062
1339
  # committed. If commit options are set it returns {CommitResponse}.
@@ -1086,9 +1363,33 @@ module Google
1086
1363
  # puts commit_resp.timestamp
1087
1364
  # puts commit_resp.stats.mutation_count
1088
1365
  #
1089
- def replace table, rows, commit_options: nil
1366
+ # @example Using request options.
1367
+ # require "google/cloud/spanner"
1368
+ #
1369
+ # spanner = Google::Cloud::Spanner.new
1370
+ #
1371
+ # db = spanner.client "my-instance", "my-database"
1372
+ #
1373
+ # request_options = { priority: :PRIORITY_MEDIUM }
1374
+ # db.replace "users", [{ id: 1, name: "Charlie", active: false }],
1375
+ # request_options: request_options
1376
+ #
1377
+ # @example Replace using tag for transaction statistics collection.
1378
+ # require "google/cloud/spanner"
1379
+ #
1380
+ # spanner = Google::Cloud::Spanner.new
1381
+ #
1382
+ # db = spanner.client "my-instance", "my-database"
1383
+ #
1384
+ # request_options = { tag: "BulkReplace-Users" }
1385
+ # db.replace "users", [{ id: 1, name: "Charlie", active: false },
1386
+ # { id: 2, name: "Harvey", active: true }],
1387
+ # request_options: request_options
1388
+ #
1389
+ def replace table, rows, commit_options: nil, request_options: nil
1090
1390
  @pool.with_session do |session|
1091
- session.replace table, rows, commit_options: commit_options
1391
+ session.replace table, rows, commit_options: commit_options,
1392
+ request_options: request_options
1092
1393
  end
1093
1394
  end
1094
1395
 
@@ -1119,7 +1420,17 @@ module Google
1119
1420
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1120
1421
  # then statistics related to the transaction will be included in
1121
1422
  # {CommitResponse}. Default value is `false`
1122
- #
1423
+ # @param [Hash] request_options Common request options.
1424
+ #
1425
+ # * `:priority` (String) The relative priority for requests.
1426
+ # The priority acts as a hint to the Cloud Spanner scheduler
1427
+ # and does not guarantee priority or order of execution.
1428
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1429
+ # `:PRIORITY_HIGH`. If priority not set then default is
1430
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1431
+ # * `:tag` (String) A tag used for statistics collection
1432
+ # about transaction. A tag must be a valid identifier of the
1433
+ # format: `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`.
1123
1434
  # @param [Hash] call_options A hash of values to specify the custom
1124
1435
  # call options, e.g., timeout, retries, etc. Call options are
1125
1436
  # optional. The following settings can be provided:
@@ -1159,9 +1470,34 @@ module Google
1159
1470
  # puts commit_resp.timestamp
1160
1471
  # puts commit_resp.stats.mutation_count
1161
1472
  #
1162
- def delete table, keys = [], commit_options: nil, call_options: nil
1473
+ # @example With request optinos
1474
+ # require "google/cloud/spanner"
1475
+ #
1476
+ # spanner = Google::Cloud::Spanner.new
1477
+ #
1478
+ # db = spanner.client "my-instance", "my-database"
1479
+ #
1480
+ # request_options = { priority: :PRIORITY_MEDIUM }
1481
+ # db.delete "users", [1, 2, 3], request_options: request_options
1482
+ #
1483
+ # @example Delete using tag for transaction statistics collection.
1484
+ # require "google/cloud/spanner"
1485
+ #
1486
+ # spanner = Google::Cloud::Spanner.new
1487
+ #
1488
+ # db = spanner.client "my-instance", "my-database"
1489
+ #
1490
+ # request_options = { tag: "BulkDelete-Users" }
1491
+ # db.delete "users", [1, 2, 3], request_options: request_options
1492
+ #
1493
+ def delete table, keys = [], commit_options: nil, request_options: nil,
1494
+ call_options: nil
1495
+ request_options = Convert.to_request_options \
1496
+ request_options, tag_type: :transaction_tag
1497
+
1163
1498
  @pool.with_session do |session|
1164
1499
  session.delete table, keys, commit_options: commit_options,
1500
+ request_options: request_options,
1165
1501
  call_options: call_options
1166
1502
  end
1167
1503
  end
@@ -1188,7 +1524,17 @@ module Google
1188
1524
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1189
1525
  # then statistics related to the transaction will be included in
1190
1526
  # {CommitResponse}. Default value is `false`
1191
- #
1527
+ # @param [Hash] request_options Common request options.
1528
+ #
1529
+ # * `:priority` (String) The relative priority for requests.
1530
+ # The priority acts as a hint to the Cloud Spanner scheduler
1531
+ # and does not guarantee priority or order of execution.
1532
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1533
+ # `:PRIORITY_HIGH`. If priority not set then default is
1534
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1535
+ # * `:tag` (String) A tag used for statistics collection
1536
+ # about transaction. A tag must be a valid identifier of the
1537
+ # format: `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`.
1192
1538
  # @param [Hash] call_options A hash of values to specify the custom
1193
1539
  # call options, e.g., timeout, retries, etc. Call options are
1194
1540
  # optional. The following settings can be provided:
@@ -1237,18 +1583,49 @@ module Google
1237
1583
  # puts commit_resp.timestamp
1238
1584
  # puts commit_resp.stats.mutation_count
1239
1585
  #
1240
- def commit commit_options: nil, call_options: nil, &block
1586
+ # @example With request options
1587
+ # require "google/cloud/spanner"
1588
+ #
1589
+ # spanner = Google::Cloud::Spanner.new
1590
+ #
1591
+ # db = spanner.client "my-instance", "my-database"
1592
+ #
1593
+ # db.commit request_options: { priority: :PRIORITY_MEDIUM } do |c|
1594
+ # c.update "users", [{ id: 1, name: "Charlie", active: false }]
1595
+ # c.insert "users", [{ id: 2, name: "Harvey", active: true }]
1596
+ # end
1597
+ #
1598
+ # @example Commit using tag for transaction statistics collection.
1599
+ # require "google/cloud/spanner"
1600
+ #
1601
+ # spanner = Google::Cloud::Spanner.new
1602
+ #
1603
+ # db = spanner.client "my-instance", "my-database"
1604
+ #
1605
+ # request_options = { tag: "BulkManipulate-Users" }
1606
+ # db.commit request_options: request_options do |c|
1607
+ # c.update "users", [{ id: 1, name: "Charlie", active: false }]
1608
+ # c.insert "users", [{ id: 2, name: "Harvey", active: true }]
1609
+ # end
1610
+ #
1611
+ def commit commit_options: nil, request_options: nil,
1612
+ call_options: nil, &block
1241
1613
  raise ArgumentError, "Must provide a block" unless block_given?
1242
1614
 
1615
+ request_options = Convert.to_request_options \
1616
+ request_options, tag_type: :transaction_tag
1617
+
1243
1618
  @pool.with_session do |session|
1244
1619
  session.commit(
1245
- commit_options: commit_options, call_options: call_options, &block
1620
+ commit_options: commit_options, request_options: request_options,
1621
+ call_options: call_options, &block
1246
1622
  )
1247
1623
  end
1248
1624
  end
1249
1625
 
1250
1626
  # rubocop:disable Metrics/AbcSize
1251
1627
  # rubocop:disable Metrics/MethodLength
1628
+ # rubocop:disable Metrics/BlockLength
1252
1629
 
1253
1630
  ##
1254
1631
  # Creates a transaction for reads and writes that execute atomically at
@@ -1273,6 +1650,18 @@ module Google
1273
1650
  # * `:return_commit_stats` (Boolean) A boolean value. If `true`,
1274
1651
  # then statistics related to the transaction will be included in
1275
1652
  # {CommitResponse}. Default value is `false`
1653
+ # @param [Hash] request_options Common request options.
1654
+ #
1655
+ # * `:priority` (String) The relative priority for requests.
1656
+ # The priority acts as a hint to the Cloud Spanner scheduler
1657
+ # and does not guarantee priority or order of execution.
1658
+ # Valid values are `:PRIORITY_LOW`, `:PRIORITY_MEDIUM`,
1659
+ # `:PRIORITY_HIGH`. If priority not set then default is
1660
+ # `PRIORITY_UNSPECIFIED` is equivalent to `:PRIORITY_HIGH`.
1661
+ # * `:tag` (String)A tag used for statistics collection
1662
+ # about transaction. The value of a transaction tag should be the
1663
+ # same for all requests belonging to the same transaction. A tag must
1664
+ # be a valid identifier of the format: `[a-zA-Z][a-zA-Z0-9_\-]{0,49}`
1276
1665
  #
1277
1666
  # @param [Hash] call_options A hash of values to specify the custom
1278
1667
  # call options, e.g., timeout, retries, etc. Call options are
@@ -1350,7 +1739,47 @@ module Google
1350
1739
  # puts commit_resp.timestamp
1351
1740
  # puts commit_resp.stats.mutation_count
1352
1741
  #
1353
- def transaction deadline: 120, commit_options: nil, call_options: nil
1742
+ # @example Using request options.
1743
+ # require "google/cloud/spanner"
1744
+ #
1745
+ # spanner = Google::Cloud::Spanner.new
1746
+ # db = spanner.client "my-instance", "my-database"
1747
+ #
1748
+ # db.transaction request_options: { priority: :PRIORITY_MEDIUM } do |tx|
1749
+ # tx.update "users", [{ id: 1, name: "Charlie", active: false }]
1750
+ # tx.insert "users", [{ id: 2, name: "Harvey", active: true }]
1751
+ #
1752
+ # request_options = { priority: :PRIORITY_LOW }
1753
+ # results = tx.execute_query "SELECT * FROM users",
1754
+ # request_options: request_options
1755
+ # end
1756
+ #
1757
+ # @example Tags for request and transaction statistics collection.
1758
+ #
1759
+ # require "google/cloud/spanner"
1760
+ #
1761
+ # spanner = Google::Cloud::Spanner.new
1762
+ # db = spanner.client "my-instance", "my-database"
1763
+ #
1764
+ # # Transaction tag will be set to "Users-Txn"
1765
+ # db.transaction request_options: { tag: "Users-Txn" } do |tx|
1766
+ # # The transaction tag set as "Users-Txn"
1767
+ # # The request tag set as "Users-Txn-1"
1768
+ # request_options = { tag: "Users-Txn-1" }
1769
+ # results = tx.execute_query "SELECT * FROM users",
1770
+ # request_options: request_options
1771
+ #
1772
+ # results.rows.each do |row|
1773
+ # puts "User #{row[:id]} is #{row[:name]}"
1774
+ # end
1775
+ #
1776
+ # # The transaction tag set as "Users-Txn"
1777
+ # tx.update "users", [{ id: 1, name: "Charlie", active: false }]
1778
+ # tx.insert "users", [{ id: 2, name: "Harvey", active: true }]
1779
+ # end
1780
+ #
1781
+ def transaction deadline: 120, commit_options: nil,
1782
+ request_options: nil, call_options: nil
1354
1783
  ensure_service!
1355
1784
  unless Thread.current[:transaction_id].nil?
1356
1785
  raise "Nested transactions are not allowed"
@@ -1360,43 +1789,54 @@ module Google
1360
1789
  backoff = 1.0
1361
1790
  start_time = current_time
1362
1791
 
1792
+ request_options = Convert.to_request_options \
1793
+ request_options, tag_type: :transaction_tag
1794
+
1363
1795
  @pool.with_transaction do |tx|
1364
- Thread.current[:transaction_id] = tx.transaction_id
1365
- yield tx
1366
- commit_resp = @project.service.commit \
1367
- tx.session.path, tx.mutations,
1368
- transaction_id: tx.transaction_id,
1369
- commit_options: commit_options,
1370
- call_options: call_options
1371
- resp = CommitResponse.from_grpc commit_resp
1372
- commit_options ? resp : resp.timestamp
1373
- rescue GRPC::Aborted, Google::Cloud::AbortedError => e
1374
- # Re-raise if deadline has passed
1375
- if current_time - start_time > deadline
1376
- if e.is_a? GRPC::BadStatus
1377
- e = Google::Cloud::Error.from_error e
1796
+ if request_options
1797
+ tx.transaction_tag = request_options[:transaction_tag]
1798
+ end
1799
+
1800
+ begin
1801
+ Thread.current[:transaction_id] = tx.transaction_id
1802
+ yield tx
1803
+ commit_resp = @project.service.commit \
1804
+ tx.session.path, tx.mutations,
1805
+ transaction_id: tx.transaction_id,
1806
+ commit_options: commit_options,
1807
+ request_options: request_options,
1808
+ call_options: call_options
1809
+ resp = CommitResponse.from_grpc commit_resp
1810
+ commit_options ? resp : resp.timestamp
1811
+ rescue GRPC::Aborted, Google::Cloud::AbortedError => e
1812
+ # Re-raise if deadline has passed
1813
+ if current_time - start_time > deadline
1814
+ if e.is_a? GRPC::BadStatus
1815
+ e = Google::Cloud::Error.from_error e
1816
+ end
1817
+ raise e
1378
1818
  end
1819
+ # Sleep the amount from RetryDelay, or incremental backoff
1820
+ sleep(delay_from_aborted(e) || backoff *= 1.3)
1821
+ # Create new transaction on the session and retry the block
1822
+ tx = tx.session.create_transaction
1823
+ retry
1824
+ rescue StandardError => e
1825
+ # Rollback transaction when handling unexpected error
1826
+ tx.session.rollback tx.transaction_id
1827
+ # Return nil if raised with rollback.
1828
+ return nil if e.is_a? Rollback
1829
+ # Re-raise error.
1379
1830
  raise e
1831
+ ensure
1832
+ Thread.current[:transaction_id] = nil
1380
1833
  end
1381
- # Sleep the amount from RetryDelay, or incremental backoff
1382
- sleep(delay_from_aborted(e) || backoff *= 1.3)
1383
- # Create new transaction on the session and retry the block
1384
- tx = tx.session.create_transaction
1385
- retry
1386
- rescue StandardError => e
1387
- # Rollback transaction when handling unexpected error
1388
- tx.session.rollback tx.transaction_id
1389
- # Return nil if raised with rollback.
1390
- return nil if e.is_a? Rollback
1391
- # Re-raise error.
1392
- raise e
1393
- ensure
1394
- Thread.current[:transaction_id] = nil
1395
1834
  end
1396
1835
  end
1397
1836
 
1398
1837
  # rubocop:enable Metrics/AbcSize
1399
1838
  # rubocop:enable Metrics/MethodLength
1839
+ # rubocop:enable Metrics/BlockLength
1400
1840
 
1401
1841
  ##
1402
1842
  # Creates a snapshot read-only transaction for reads that execute
@@ -1508,12 +1948,13 @@ module Google
1508
1948
  # Hash values must contain the type value. If a Hash is used the
1509
1949
  # fields will be created using the same order as the Hash keys.
1510
1950
  #
1511
- # Supported type values incude:
1951
+ # Supported type values include:
1512
1952
  #
1513
1953
  # * `:BOOL`
1514
1954
  # * `:BYTES`
1515
1955
  # * `:DATE`
1516
1956
  # * `:FLOAT64`
1957
+ # * `:NUMERIC`
1517
1958
  # * `:INT64`
1518
1959
  # * `:STRING`
1519
1960
  # * `:TIMESTAMP`
@@ -1804,11 +2245,10 @@ module Google
1804
2245
  # GRPC::Aborted
1805
2246
  def delay_from_aborted err
1806
2247
  return nil if err.nil?
1807
- if err.respond_to?(:metadata) && err.metadata["retryDelay"]
1808
- # a correct metadata will look like this:
1809
- # "{\"retryDelay\":{\"seconds\":60}}"
1810
- seconds = err.metadata["retryDelay"]["seconds"].to_i
1811
- nanos = err.metadata["retryDelay"]["nanos"].to_i
2248
+ if err.respond_to?(:metadata) && err.metadata["google.rpc.retryinfo-bin"]
2249
+ retry_info = Google::Rpc::RetryInfo.decode err.metadata["google.rpc.retryinfo-bin"]
2250
+ seconds = retry_info["retry_delay"].seconds
2251
+ nanos = retry_info["retry_delay"].nanos
1812
2252
  return seconds if nanos.zero?
1813
2253
  return seconds + (nanos / 1_000_000_000.0)
1814
2254
  end