google-cloud-datastore 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/google/cloud/datastore/dataset/lookup_results.rb +14 -3
- data/lib/google/cloud/datastore/dataset/query_results.rb +23 -3
- data/lib/google/cloud/datastore/dataset.rb +23 -12
- data/lib/google/cloud/datastore/read_only_transaction.rb +11 -3
- data/lib/google/cloud/datastore/service.rb +28 -10
- data/lib/google/cloud/datastore/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1471082bad6f76859fd0172a40bac47c81c31d3bc7f42e0f5135547f280307a6
|
4
|
+
data.tar.gz: a182edc1deadbfe697c45fad2bcde90379c58d07985833fd3f4bca64584bfaf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41ae448187ef6bbd842bcafcb2c6cbd107b81e4dfb55b72bbfb62857af387a82b4361cc3b86cdf00ab2657a5b98bcf6f51c1caf2090b2c922f8f3db03016e19a
|
7
|
+
data.tar.gz: 25725fc96567a06df8c6b75c4b29f9ff8077e77b59a7bb1c31d0c384a9a0d880d9e0d807653f75986c56d428dbcf7aaf09fa4074f7335eef76dcc520e21c9304
|
data/CHANGELOG.md
CHANGED
@@ -53,6 +53,15 @@ module Google
|
|
53
53
|
# descriptions.missing #=> raise NoMethodError
|
54
54
|
#
|
55
55
|
class LookupResults < DelegateClass(::Array)
|
56
|
+
##
|
57
|
+
# The time at which these entities were read or found missing.
|
58
|
+
attr_reader :response_read_time
|
59
|
+
|
60
|
+
##
|
61
|
+
# Time at which the entities are being read. This would not be
|
62
|
+
# older than 270 seconds.
|
63
|
+
attr_reader :read_time
|
64
|
+
|
56
65
|
##
|
57
66
|
# Keys that were not looked up due to resource constraints.
|
58
67
|
attr_accessor :deferred
|
@@ -110,9 +119,9 @@ module Google
|
|
110
119
|
ensure_service!
|
111
120
|
lookup_res = @service.lookup(
|
112
121
|
*Array(@deferred).flatten.map(&:to_grpc),
|
113
|
-
consistency: @consistency, transaction: @transaction
|
122
|
+
consistency: @consistency, transaction: @transaction, read_time: @read_time
|
114
123
|
)
|
115
|
-
self.class.from_grpc lookup_res, @service, @consistency
|
124
|
+
self.class.from_grpc lookup_res, @service, @consistency, nil, @read_time
|
116
125
|
end
|
117
126
|
|
118
127
|
##
|
@@ -187,7 +196,7 @@ module Google
|
|
187
196
|
##
|
188
197
|
# @private New Dataset::LookupResults from a
|
189
198
|
# Google::Dataset::V1::LookupResponse object.
|
190
|
-
def self.from_grpc lookup_res, service, consistency = nil, transaction = nil
|
199
|
+
def self.from_grpc lookup_res, service, consistency = nil, transaction = nil, read_time = nil
|
191
200
|
entities = to_gcloud_entities lookup_res.found
|
192
201
|
deferred = to_gcloud_keys lookup_res.deferred
|
193
202
|
missing = to_gcloud_entities lookup_res.missing
|
@@ -195,6 +204,8 @@ module Google
|
|
195
204
|
lr.instance_variable_set :@service, service
|
196
205
|
lr.instance_variable_set :@consistency, consistency
|
197
206
|
lr.instance_variable_set :@transaction, transaction
|
207
|
+
lr.instance_variable_set :@read_time, read_time
|
208
|
+
lr.instance_variable_set :@response_read_time, lookup_res.read_time
|
198
209
|
lr.instance_variable_set :@deferred, deferred
|
199
210
|
lr.instance_variable_set :@missing, missing
|
200
211
|
end
|
@@ -72,6 +72,24 @@ module Google
|
|
72
72
|
# * `:NO_MORE_RESULTS`
|
73
73
|
attr_reader :more_results
|
74
74
|
|
75
|
+
##
|
76
|
+
# Read timestamp this batch was returned from.
|
77
|
+
# This applies to the range of results from the query's `start_cursor` (or
|
78
|
+
# the beginning of the query if no cursor was given) to this batch's
|
79
|
+
# `end_cursor` (not the query's `end_cursor`).
|
80
|
+
#
|
81
|
+
# In a single transaction, subsequent query result batches for the same query
|
82
|
+
# can have a greater timestamp. Each batch's read timestamp
|
83
|
+
# is valid for all preceding batches.
|
84
|
+
# This value will not be set for eventually consistent queries in Cloud
|
85
|
+
# Datastore.
|
86
|
+
attr_reader :batch_read_time
|
87
|
+
|
88
|
+
##
|
89
|
+
# Time at which the entities are being read. This would not be
|
90
|
+
# older than 270 seconds.
|
91
|
+
attr_reader :read_time
|
92
|
+
|
75
93
|
##
|
76
94
|
# @private
|
77
95
|
attr_accessor :service, :namespace, :cursors, :query
|
@@ -162,8 +180,8 @@ module Google
|
|
162
180
|
# Reduce the limit by the number of entities returned in the current batch
|
163
181
|
query.limit.value -= count
|
164
182
|
end
|
165
|
-
query_res = service.run_query query, namespace
|
166
|
-
self.class.from_grpc query_res, service, namespace, query
|
183
|
+
query_res = service.run_query query, namespace, read_time: read_time
|
184
|
+
self.class.from_grpc query_res, service, namespace, query, read_time
|
167
185
|
end
|
168
186
|
|
169
187
|
##
|
@@ -360,7 +378,7 @@ module Google
|
|
360
378
|
##
|
361
379
|
# @private New Dataset::QueryResults from a
|
362
380
|
# Google::Dataset::V1::RunQueryResponse object.
|
363
|
-
def self.from_grpc query_res, service, namespace, query
|
381
|
+
def self.from_grpc query_res, service, namespace, query, read_time = nil
|
364
382
|
r, c = Array(query_res.batch.entity_results).map do |result|
|
365
383
|
[Entity.from_grpc(result.entity), Cursor.from_grpc(result.cursor)]
|
366
384
|
end.transpose
|
@@ -373,6 +391,8 @@ module Google
|
|
373
391
|
qr.service = service
|
374
392
|
qr.namespace = namespace
|
375
393
|
qr.query = query_res.query || query
|
394
|
+
qr.instance_variable_set :@read_time, read_time
|
395
|
+
qr.instance_variable_set :@batch_read_time, query_res.batch.read_time
|
376
396
|
end
|
377
397
|
end
|
378
398
|
|
@@ -337,6 +337,8 @@ module Google
|
|
337
337
|
# [Eventual Consistency in Google Cloud
|
338
338
|
# Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
|
339
339
|
# for more information.
|
340
|
+
# @param [Time] read_time Reads entities as they were at the given time.
|
341
|
+
# This may not be older than 270 seconds. Optional
|
340
342
|
#
|
341
343
|
# @return [Google::Cloud::Datastore::Entity, nil]
|
342
344
|
#
|
@@ -355,12 +357,12 @@ module Google
|
|
355
357
|
#
|
356
358
|
# task = datastore.find "Task", "sampleTask"
|
357
359
|
#
|
358
|
-
def find key_or_kind, id_or_name = nil, consistency: nil
|
360
|
+
def find key_or_kind, id_or_name = nil, consistency: nil, read_time: nil
|
359
361
|
key = key_or_kind
|
360
362
|
unless key.is_a? Google::Cloud::Datastore::Key
|
361
363
|
key = Key.new key_or_kind, id_or_name
|
362
364
|
end
|
363
|
-
find_all(key, consistency: consistency).first
|
365
|
+
find_all(key, consistency: consistency, read_time: read_time).first
|
364
366
|
end
|
365
367
|
alias get find
|
366
368
|
|
@@ -377,6 +379,8 @@ module Google
|
|
377
379
|
# [Eventual Consistency in Google Cloud
|
378
380
|
# Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
|
379
381
|
# for more information.
|
382
|
+
# @param [Time] read_time Reads entities as they were at the given time.
|
383
|
+
# This may not be older than 270 seconds. Optional
|
380
384
|
#
|
381
385
|
# @return [Google::Cloud::Datastore::Dataset::LookupResults]
|
382
386
|
#
|
@@ -389,12 +393,12 @@ module Google
|
|
389
393
|
# task_key2 = datastore.key "Task", "sampleTask2"
|
390
394
|
# tasks = datastore.find_all task_key1, task_key2
|
391
395
|
#
|
392
|
-
def find_all *keys, consistency: nil
|
396
|
+
def find_all *keys, consistency: nil, read_time: nil
|
393
397
|
ensure_service!
|
394
398
|
check_consistency! consistency
|
395
399
|
lookup_res = service.lookup(*Array(keys).flatten.map(&:to_grpc),
|
396
|
-
consistency: consistency)
|
397
|
-
LookupResults.from_grpc lookup_res, service, consistency
|
400
|
+
consistency: consistency, read_time: read_time)
|
401
|
+
LookupResults.from_grpc lookup_res, service, consistency, nil, read_time
|
398
402
|
end
|
399
403
|
alias lookup find_all
|
400
404
|
|
@@ -411,6 +415,8 @@ module Google
|
|
411
415
|
# [Eventual Consistency in Google Cloud
|
412
416
|
# Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
|
413
417
|
# for more information.
|
418
|
+
# @param [Time] read_time Reads entities as they were at the given time.
|
419
|
+
# This may not be older than 270 seconds. Optional
|
414
420
|
#
|
415
421
|
# @return [Google::Cloud::Datastore::Dataset::QueryResults]
|
416
422
|
#
|
@@ -461,16 +467,16 @@ module Google
|
|
461
467
|
# done: false
|
462
468
|
# tasks = datastore.run gql_query, namespace: "example-ns"
|
463
469
|
#
|
464
|
-
def run query, namespace: nil, consistency: nil
|
470
|
+
def run query, namespace: nil, consistency: nil, read_time: nil
|
465
471
|
ensure_service!
|
466
472
|
unless query.is_a?(Query) || query.is_a?(GqlQuery)
|
467
473
|
raise ArgumentError, "Cannot run a #{query.class} object."
|
468
474
|
end
|
469
475
|
check_consistency! consistency
|
470
476
|
query_res = service.run_query query.to_grpc, namespace,
|
471
|
-
consistency: consistency
|
477
|
+
consistency: consistency, read_time: read_time
|
472
478
|
QueryResults.from_grpc query_res, service, namespace,
|
473
|
-
query.to_grpc.dup
|
479
|
+
query.to_grpc.dup, read_time
|
474
480
|
end
|
475
481
|
alias run_query run
|
476
482
|
|
@@ -482,6 +488,8 @@ module Google
|
|
482
488
|
# @param [Symbol] consistency The non-transactional read consistency to
|
483
489
|
# use. Cannot be set to `:strong` for global queries. Accepted values
|
484
490
|
# are `:eventual` and `:strong`.
|
491
|
+
# @param [Time] read_time Reads entities as they were at the given time.
|
492
|
+
# This may not be older than 270 seconds. Optional
|
485
493
|
#
|
486
494
|
# The default consistency depends on the type of query used. See
|
487
495
|
# [Eventual Consistency in Google Cloud
|
@@ -545,14 +553,14 @@ module Google
|
|
545
553
|
# done: false
|
546
554
|
# res = datastore.run_aggregation gql_query, namespace: "example-ns"
|
547
555
|
#
|
548
|
-
def run_aggregation aggregate_query, namespace: nil, consistency: nil
|
556
|
+
def run_aggregation aggregate_query, namespace: nil, consistency: nil, read_time: nil
|
549
557
|
ensure_service!
|
550
558
|
unless aggregate_query.is_a?(AggregateQuery) || aggregate_query.is_a?(GqlQuery)
|
551
559
|
raise ArgumentError, "Cannot run a #{aggregate_query.class} object."
|
552
560
|
end
|
553
561
|
check_consistency! consistency
|
554
562
|
aggregate_query_res = service.run_aggregation_query aggregate_query.to_grpc, namespace,
|
555
|
-
consistency: consistency
|
563
|
+
consistency: consistency, read_time: read_time
|
556
564
|
AggregateQueryResults.from_grpc aggregate_query_res
|
557
565
|
end
|
558
566
|
|
@@ -677,6 +685,9 @@ module Google
|
|
677
685
|
# @see https://cloud.google.com/datastore/docs/concepts/transactions
|
678
686
|
# Transactions
|
679
687
|
#
|
688
|
+
# @param [Time] read_time Reads entities at the given time.
|
689
|
+
# This may not be older than 60 seconds. Optional
|
690
|
+
#
|
680
691
|
# @yield [tx] a block yielding a new transaction
|
681
692
|
# @yieldparam [ReadOnlyTransaction] tx the transaction object
|
682
693
|
#
|
@@ -698,8 +709,8 @@ module Google
|
|
698
709
|
# end
|
699
710
|
# end
|
700
711
|
#
|
701
|
-
def read_only_transaction
|
702
|
-
tx = ReadOnlyTransaction.new service
|
712
|
+
def read_only_transaction read_time: nil
|
713
|
+
tx = ReadOnlyTransaction.new service, read_time: read_time
|
703
714
|
return tx unless block_given?
|
704
715
|
|
705
716
|
begin
|
@@ -59,13 +59,22 @@ module Google
|
|
59
59
|
# @private The Service object.
|
60
60
|
attr_accessor :service
|
61
61
|
|
62
|
+
##
|
63
|
+
# Reads entities at the given time.
|
64
|
+
# This may not be older than 60 seconds.
|
65
|
+
attr_reader :read_time
|
66
|
+
|
62
67
|
##
|
63
68
|
# @private Creates a new ReadOnlyTransaction instance.
|
64
69
|
# Takes a Service instead of project and Credentials.
|
65
70
|
#
|
66
|
-
|
71
|
+
# @param [Time] read_time Reads documents as they were at the given time.
|
72
|
+
# This may not be older than 270 seconds. Optional
|
73
|
+
#
|
74
|
+
def initialize service, read_time: nil
|
67
75
|
@service = service
|
68
76
|
reset!
|
77
|
+
@read_time = read_time
|
69
78
|
start
|
70
79
|
end
|
71
80
|
|
@@ -194,9 +203,8 @@ module Google
|
|
194
203
|
#
|
195
204
|
def start
|
196
205
|
raise TransactionError, "Transaction already opened." unless @id.nil?
|
197
|
-
|
198
206
|
ensure_service!
|
199
|
-
tx_res = service.begin_transaction read_only: true
|
207
|
+
tx_res = service.begin_transaction read_only: true, read_time: @read_time
|
200
208
|
@id = tx_res.transaction
|
201
209
|
end
|
202
210
|
alias begin_transaction start
|
@@ -52,6 +52,7 @@ module Google
|
|
52
52
|
config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}/databases/#{database}" }
|
53
53
|
end
|
54
54
|
end
|
55
|
+
|
55
56
|
attr_accessor :mocked_service
|
56
57
|
|
57
58
|
##
|
@@ -63,20 +64,19 @@ module Google
|
|
63
64
|
|
64
65
|
##
|
65
66
|
# Look up entities by keys.
|
66
|
-
def lookup *keys, consistency: nil, transaction: nil
|
67
|
-
read_options = generate_read_options consistency, transaction
|
68
|
-
|
67
|
+
def lookup *keys, consistency: nil, transaction: nil, read_time: nil
|
68
|
+
read_options = generate_read_options consistency, transaction, read_time
|
69
69
|
service.lookup project_id: project, database_id: database, keys: keys, read_options: read_options
|
70
70
|
end
|
71
71
|
|
72
72
|
# Query for entities.
|
73
|
-
def run_query query, namespace = nil, consistency: nil, transaction: nil
|
73
|
+
def run_query query, namespace = nil, consistency: nil, transaction: nil, read_time: nil
|
74
74
|
gql_query = nil
|
75
75
|
if query.is_a? Google::Cloud::Datastore::V1::GqlQuery
|
76
76
|
gql_query = query
|
77
77
|
query = nil
|
78
78
|
end
|
79
|
-
read_options = generate_read_options consistency, transaction
|
79
|
+
read_options = generate_read_options consistency, transaction, read_time
|
80
80
|
if namespace
|
81
81
|
partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
|
82
82
|
namespace_id: namespace
|
@@ -92,13 +92,13 @@ module Google
|
|
92
92
|
end
|
93
93
|
|
94
94
|
## Query for aggregates
|
95
|
-
def run_aggregation_query query, namespace = nil, consistency: nil, transaction: nil
|
95
|
+
def run_aggregation_query query, namespace = nil, consistency: nil, transaction: nil, read_time: nil
|
96
96
|
gql_query = nil
|
97
97
|
if query.is_a? Google::Cloud::Datastore::V1::GqlQuery
|
98
98
|
gql_query = query
|
99
99
|
query = nil
|
100
100
|
end
|
101
|
-
read_options = generate_read_options consistency, transaction
|
101
|
+
read_options = generate_read_options consistency, transaction, read_time
|
102
102
|
if namespace
|
103
103
|
partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
|
104
104
|
namespace_id: namespace
|
@@ -114,11 +114,13 @@ module Google
|
|
114
114
|
|
115
115
|
##
|
116
116
|
# Begin a new transaction.
|
117
|
-
def begin_transaction read_only: nil, previous_transaction: nil
|
117
|
+
def begin_transaction read_only: nil, previous_transaction: nil, read_time: nil
|
118
118
|
if read_only
|
119
119
|
transaction_options = Google::Cloud::Datastore::V1::TransactionOptions.new
|
120
120
|
transaction_options.read_only = \
|
121
|
-
Google::Cloud::Datastore::V1::TransactionOptions::ReadOnly.new
|
121
|
+
Google::Cloud::Datastore::V1::TransactionOptions::ReadOnly.new \
|
122
|
+
read_time: read_time_to_timestamp(read_time)
|
123
|
+
|
122
124
|
end
|
123
125
|
if previous_transaction
|
124
126
|
transaction_options ||= \
|
@@ -152,7 +154,7 @@ module Google
|
|
152
154
|
|
153
155
|
protected
|
154
156
|
|
155
|
-
def generate_read_options consistency, transaction
|
157
|
+
def generate_read_options consistency, transaction, read_time
|
156
158
|
if consistency == :eventual
|
157
159
|
return Google::Cloud::Datastore::V1::ReadOptions.new(
|
158
160
|
read_consistency: :EVENTUAL
|
@@ -165,9 +167,25 @@ module Google
|
|
165
167
|
return Google::Cloud::Datastore::V1::ReadOptions.new(
|
166
168
|
transaction: transaction
|
167
169
|
)
|
170
|
+
elsif read_time
|
171
|
+
return Google::Cloud::Datastore::V1::ReadOptions.new(
|
172
|
+
read_time: read_time_to_timestamp(read_time)
|
173
|
+
)
|
168
174
|
end
|
169
175
|
nil
|
170
176
|
end
|
177
|
+
|
178
|
+
def read_time_to_timestamp time
|
179
|
+
return nil if time.nil?
|
180
|
+
|
181
|
+
# Force the object to be a Time object.
|
182
|
+
time = time.to_time.utc
|
183
|
+
|
184
|
+
Google::Protobuf::Timestamp.new(
|
185
|
+
seconds: time.to_i,
|
186
|
+
nanos: time.usec * 1000
|
187
|
+
)
|
188
|
+
end
|
171
189
|
end
|
172
190
|
end
|
173
191
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-datastore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-02-
|
12
|
+
date: 2023-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|