google-cloud-datastore 2.3.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c300ee184929b5e46058e32af1e18a2e0e786e3eb17b32d24a265713e442b75d
4
- data.tar.gz: 06752add810608b745cc157a60fcfc23aa77ab54a7395f54e8f8b2d3867fc882
3
+ metadata.gz: ded45a15f44ec5a2e095ef0369db26c2a4a65e59c2af1e08bb8f6028736062ea
4
+ data.tar.gz: 8d7321547294a1c1ab492df132e19300a0466f252e74f9c7122fb7941bbaeac7
5
5
  SHA512:
6
- metadata.gz: aa87df55a375dba1110cd28463a59f0c81e81cfa4aa513edeb380302f63e6e4610a1e5064a47af57753aa4e31c21c092276cbbf92325a6a55b9e3cffb7cbbf35
7
- data.tar.gz: f39b9d73f4c149cf633b376d10aa811b7f3e8a607e294753e0b796319312082771a112d049c90d548fd80c8024b7b4b18fa11940a88fe07a62ee8e16b7b61d3f
6
+ metadata.gz: 8a4039bbc1c34698507c3b7a1e2c22b011f4df3ea66a57927c7dd147c4468d97c85f15b49efa6c06dcb124815ad5fc4098eeaa8e6f54d23570489e6da0d8dbf3
7
+ data.tar.gz: af0981ba4ea2bd054ba35ddd372399addbbb5e0d0c8e4032f518b48ab03065771af8a6185dea29483a9948ae42147011c0f6a100c747dd08100736780a5cb286
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Release History
2
2
 
3
+ ### 2.5.0 (2023-02-09)
4
+
5
+ #### Features
6
+
7
+ * Added support for multiple database ([#20038](https://github.com/googleapis/google-cloud-ruby/issues/20038))
8
+
9
+ ### 2.4.0 (2023-02-02)
10
+
11
+ #### Features
12
+
13
+ * Support query count for Datastore ([#20039](https://github.com/googleapis/google-cloud-ruby/issues/20039))
14
+
3
15
  ### 2.3.1 (2022-12-14)
4
16
 
5
17
  #### Bug Fixes
@@ -0,0 +1,139 @@
1
+ # Copyright 2023 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
+ require "google/cloud/datastore/v1"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Datastore
21
+ ##
22
+ # # AggregateQuery
23
+ #
24
+ # An aggregate query can be used to fetch aggregate values (ex: count) for a query
25
+ #
26
+ # @example
27
+ # require "google/cloud/datastore"
28
+ #
29
+ # datastore = Google::Cloud::Datastore.new
30
+ #
31
+ # query = Google::Cloud::Datastore::Query.new
32
+ # query.kind("Task")
33
+ # .where("done", "=", false)
34
+ #
35
+ # Create an aggregate query
36
+ # aggregate_query = query.aggregate_query
37
+ # .add_count
38
+ #
39
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
40
+ # puts aggregate_query_results.get
41
+ #
42
+ # @example Alias an aggregate query
43
+ # require "google/cloud/datastore"
44
+ #
45
+ # datastore = Google::Cloud::Datastore.new
46
+ #
47
+ # query = Google::Cloud::Datastore::Query.new
48
+ # query.kind("Task")
49
+ # .where("done", "=", false)
50
+ #
51
+ # Create an aggregate query
52
+ # aggregate_query = query.aggregate_query
53
+ # .add_count aggregate_alias: 'total'
54
+ #
55
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
56
+ # puts aggregate_query_results.get('total')
57
+ #
58
+ class AggregateQuery
59
+ ##
60
+ # @private The Google::Cloud::Datastore::V1::Query object.
61
+ attr_reader :query
62
+
63
+ ##
64
+ # @private Array of Google::Cloud::Datastore::V1::AggregationQuery::Aggregation objects
65
+ attr_reader :aggregates
66
+
67
+ ##
68
+ # @private Creates a new AggregateQuery
69
+ def initialize query
70
+ @query = query
71
+ @aggregates = []
72
+ end
73
+
74
+ ##
75
+ # Adds a count aggregate.
76
+ #
77
+ # @param aggregate_alias [String] Alias to refer to the aggregate. Optional
78
+ #
79
+ # @return [AggregateQuery] The modified aggregate query object with the added count aggregate.
80
+ #
81
+ # @example
82
+ # require "google/cloud/datastore"
83
+ #
84
+ # datastore = Google::Cloud::Datastore.new
85
+ #
86
+ # query = Google::Cloud::Datastore::Query.new
87
+ # query.kind("Task")
88
+ # .where("done", "=", false)
89
+ #
90
+ # Create an aggregate query
91
+ # aggregate_query = query.aggregate_query
92
+ # .add_count
93
+ #
94
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
95
+ # puts aggregate_query_results.get
96
+ #
97
+ # @example Alias an aggregate query
98
+ # require "google/cloud/datastore"
99
+ #
100
+ # datastore = Google::Cloud::Datastore.new
101
+ #
102
+ # query = Google::Cloud::Datastore::Query.new
103
+ # query.kind("Task")
104
+ # .where("done", "=", false)
105
+ #
106
+ # Create an aggregate query
107
+ # aggregate_query = query.aggregate_query
108
+ # .add_count aggregate_alias: 'total'
109
+ #
110
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
111
+ # puts aggregate_query_results.get('total')
112
+ #
113
+ def add_count aggregate_alias: nil
114
+ aggregate_alias ||= ALIASES[:count]
115
+ aggregates << Google::Cloud::Datastore::V1::AggregationQuery::Aggregation.new(
116
+ count: Google::Cloud::Datastore::V1::AggregationQuery::Aggregation::Count.new,
117
+ alias: aggregate_alias
118
+ )
119
+
120
+ self
121
+ end
122
+
123
+ # @private
124
+ def to_grpc
125
+ Google::Cloud::Datastore::V1::AggregationQuery.new(
126
+ nested_query: query,
127
+ aggregations: aggregates
128
+ )
129
+ end
130
+
131
+ ##
132
+ # @private
133
+ ALIASES = {
134
+ count: "count"
135
+ }.freeze
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,115 @@
1
+ # Copyright 2023 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
+ module Google
16
+ module Cloud
17
+ module Datastore
18
+ class Dataset
19
+ ##
20
+ # # AggregateQueryResults
21
+ #
22
+ # An AggregateQueryResult object is a representation for
23
+ # a result of an AggregateQuery or a GqlQuery.
24
+ #
25
+ # @example
26
+ # require "google/cloud/datastore"
27
+ #
28
+ # datastore = Google::Cloud::Datastore.new
29
+ #
30
+ # query = Google::Cloud::Datastore::Query.new
31
+ # query.kind("Task")
32
+ # .where("done", "=", false)
33
+ #
34
+ # Create an aggregate query
35
+ # aggregate_query = query.aggregate_query
36
+ # .add_count
37
+ #
38
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
39
+ # puts aggregate_query_results.get
40
+ #
41
+ class AggregateQueryResults
42
+ ##
43
+ # Read timestamp the query was done on the database at.
44
+ #
45
+ # @return Google::Protobuf::Timestamp
46
+ attr_reader :read_time
47
+
48
+ ##
49
+ # Retrieves the aggregate data.
50
+ #
51
+ # @param aggregate_alias [String] The alias used to access
52
+ # the aggregate value. For an AggregateQuery with a
53
+ # single aggregate field, this parameter can be omitted.
54
+ #
55
+ # @return [Integer] The aggregate value.
56
+ #
57
+ # @example
58
+ # require "google/cloud/datastore"
59
+ #
60
+ # datastore = Google::Cloud::Datastore.new
61
+ #
62
+ # query = Google::Cloud::Datastore::Query.new
63
+ # query.kind("Task")
64
+ # .where("done", "=", false)
65
+ #
66
+ # Create an aggregate query
67
+ # aggregate_query = query.aggregate_query
68
+ # .add_count
69
+ #
70
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
71
+ # puts aggregate_query_results.get
72
+ #
73
+ # @example Alias an aggregate query
74
+ # require "google/cloud/datastore"
75
+ #
76
+ # datastore = Google::Cloud::Datastore.new
77
+ #
78
+ # query = Google::Cloud::Datastore::Query.new
79
+ # query.kind("Task")
80
+ # .where("done", "=", false)
81
+ #
82
+ # Create an aggregate query
83
+ # aggregate_query = query.aggregate_query
84
+ # .add_count aggregate_alias: 'total'
85
+ #
86
+ # aggregate_query_results = dataset.run_aggregation aggregate_query
87
+ # puts aggregate_query_results.get('total')
88
+ def get aggregate_alias = nil
89
+ if @aggregate_fields.count > 1 && aggregate_alias.nil?
90
+ raise ArgumentError, "Required param aggregate_alias for AggregateQuery with multiple aggregate fields"
91
+ end
92
+ aggregate_alias ||= @aggregate_fields.keys.first
93
+ @aggregate_fields[aggregate_alias]
94
+ end
95
+
96
+ ##
97
+ # @private New AggregateQueryResults from a
98
+ # Google::Cloud::Datastore::V1::RunAggregationQueryResponse object.
99
+ def self.from_grpc aggregate_query_response
100
+ aggregate_fields = aggregate_query_response
101
+ .batch
102
+ .aggregation_results[0]
103
+ .aggregate_properties
104
+ .to_h
105
+ .transform_values { |v| v[:integer_value] }
106
+ new.tap do |s|
107
+ s.instance_variable_set :@aggregate_fields, aggregate_fields
108
+ s.instance_variable_set :@read_time, aggregate_query_response.batch.read_time
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -24,6 +24,7 @@ require "google/cloud/datastore/gql_query"
24
24
  require "google/cloud/datastore/cursor"
25
25
  require "google/cloud/datastore/dataset/lookup_results"
26
26
  require "google/cloud/datastore/dataset/query_results"
27
+ require "google/cloud/datastore/dataset/aggregate_query_results"
27
28
  require "google/cloud/datastore/transaction"
28
29
  require "google/cloud/datastore/read_only_transaction"
29
30
 
@@ -83,6 +84,26 @@ module Google
83
84
  end
84
85
  alias project project_id
85
86
 
87
+ ##
88
+ # The Datastore database connected to.
89
+ #
90
+ # @return [String] ID of the database
91
+ #
92
+ # @example
93
+ # require "google/cloud/datastore"
94
+ #
95
+ # datastore = Google::Cloud::Datastore.new(
96
+ # project_id: "my-todo-project",
97
+ # credentials: "/path/to/keyfile.json",
98
+ # database_id: "my-database"
99
+ # )
100
+ #
101
+ # datastore.database_id #=> "my-database"
102
+ #
103
+ def database_id
104
+ service.database
105
+ end
106
+
86
107
  ##
87
108
  # Generate IDs for a Key before creating an entity.
88
109
  #
@@ -453,6 +474,88 @@ module Google
453
474
  end
454
475
  alias run_query run
455
476
 
477
+ ##
478
+ # Retrieve aggregate results specified by an AggregateQuery.
479
+ #
480
+ # @param [AggregateQuery, GqlQuery] query The object with the aggregate criteria.
481
+ # @param [String] namespace The namespace the query is to run within.
482
+ # @param [Symbol] consistency The non-transactional read consistency to
483
+ # use. Cannot be set to `:strong` for global queries. Accepted values
484
+ # are `:eventual` and `:strong`.
485
+ #
486
+ # The default consistency depends on the type of query used. See
487
+ # [Eventual Consistency in Google Cloud
488
+ # Datastore](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.tf76fya5nqk8)
489
+ # for more information.
490
+ #
491
+ # @return [Google::Cloud::Datastore::Dataset::AggregateQueryResults]
492
+ #
493
+ # @example
494
+ # require "google/cloud/datastore"
495
+ #
496
+ # datastore = Google::Cloud::Datastore.new
497
+ #
498
+ # query = datastore.query("Task")
499
+ # .where("done", "=", false)
500
+ #
501
+ # aggregate_query = query.aggregate_query
502
+ #
503
+ # res = datastore.run_aggregation aggregate_query
504
+ #
505
+ # @example Run an aggregate ancestor query with eventual consistency:
506
+ # require "google/cloud/datastore"
507
+ #
508
+ # datastore = Google::Cloud::Datastore.new
509
+ #
510
+ # task_list_key = datastore.key "TaskList", "default"
511
+ # query = datastore.query.kind("Task")
512
+ # .ancestor(task_list_key)
513
+ #
514
+ # aggregate_query = query.aggregate_query
515
+ #
516
+ # res = datastore.run_aggregation aggregate_query, consistency: :eventual
517
+ #
518
+ # @example Run the aggregate query within a namespace with the `namespace` option:
519
+ # require "google/cloud/datastore"
520
+ #
521
+ # datastore = Google::Cloud::Datastore.new
522
+ #
523
+ # query = datastore.query("Task")
524
+ # .where("done", "=", false)
525
+ #
526
+ # aggregate_query = query.aggregate_query
527
+ #
528
+ # res = datastore.run_aggregation aggregate_query, namespace: "example-ns"
529
+ #
530
+ # @example Run the aggregate query with a GQL string.
531
+ # require "google/cloud/datastore"
532
+ #
533
+ # datastore = Google::Cloud::Datastore.new
534
+ #
535
+ # gql_query = datastore.gql "SELECT COUNT(*) FROM Task WHERE done = @done",
536
+ # done: false
537
+ # res = datastore.run_aggregation gql_query
538
+ #
539
+ # @example Run the aggregate GQL query within a namespace with `namespace` option:
540
+ # require "google/cloud/datastore"
541
+ #
542
+ # datastore = Google::Cloud::Datastore.new
543
+ #
544
+ # gql_query = datastore.gql "SELECT COUNT(*) FROM Task WHERE done = @done",
545
+ # done: false
546
+ # res = datastore.run_aggregation gql_query, namespace: "example-ns"
547
+ #
548
+ def run_aggregation aggregate_query, namespace: nil, consistency: nil
549
+ ensure_service!
550
+ unless aggregate_query.is_a?(AggregateQuery) || aggregate_query.is_a?(GqlQuery)
551
+ raise ArgumentError, "Cannot run a #{aggregate_query.class} object."
552
+ end
553
+ check_consistency! consistency
554
+ aggregate_query_res = service.run_aggregation_query aggregate_query.to_grpc, namespace,
555
+ consistency: consistency
556
+ AggregateQueryResults.from_grpc aggregate_query_res
557
+ end
558
+
456
559
  ##
457
560
  # Creates a Datastore Transaction.
458
561
  #
@@ -69,6 +69,27 @@ module Google
69
69
  alias dataset_id project
70
70
  alias dataset_id= project=
71
71
 
72
+ ##
73
+ # The database of the Key.
74
+ #
75
+ # @return [String]
76
+ #
77
+ # @example
78
+ # require "google/cloud/datastore"
79
+ #
80
+ # datastore = Google::Cloud::Datastore.new(
81
+ # project: "my-todo-project",
82
+ # database: "my-todo-database",
83
+ # keyfile: "/path/to/keyfile.json"
84
+ # )
85
+ #
86
+ # task = datastore.find "Task", "sampleTask"
87
+ # task.key.database #=> "my-todo-database"
88
+ #
89
+ attr_accessor :database
90
+ alias database_id database
91
+ alias database_id= database=
92
+
72
93
  ##
73
94
  # The namespace of the Key.
74
95
  #
@@ -281,9 +302,9 @@ module Google
281
302
  Google::Cloud::Datastore::V1::Key::PathElement.new path_args
282
303
  end
283
304
  grpc = Google::Cloud::Datastore::V1::Key.new path: grpc_path
284
- if project || namespace
305
+ if project || database || namespace
285
306
  grpc.partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
286
- project_id: project.to_s, namespace_id: namespace.to_s
307
+ project_id: project.to_s, database_id: database.to_s, namespace_id: namespace.to_s
287
308
  )
288
309
  end
289
310
  grpc
@@ -304,6 +325,7 @@ module Google
304
325
  end
305
326
  if key_grpc.partition_id
306
327
  key.project = key_grpc.partition_id.project_id
328
+ key.database = key_grpc.partition_id.database_id
307
329
  key.namespace = key_grpc.partition_id.namespace_id
308
330
  end
309
331
  key.parent = Key.from_grpc key_grpc if key_grpc.path.count.positive?
@@ -15,6 +15,7 @@
15
15
 
16
16
  require "google/cloud/datastore/entity"
17
17
  require "google/cloud/datastore/key"
18
+ require "google/cloud/datastore/aggregate_query"
18
19
 
19
20
  module Google
20
21
  module Cloud
@@ -425,6 +426,27 @@ module Google
425
426
  end
426
427
  alias distinct_on group_by
427
428
 
429
+ ##
430
+ # Creates an AggregateQuery object for the query.
431
+ #
432
+ # @return [AggregateQuery] New empty aggregate query.
433
+ #
434
+ # @example
435
+ # require "google/cloud/datastore"
436
+ #
437
+ # datastore = Google::Cloud::Datastore.new
438
+ #
439
+ # query = Google::Cloud::Datastore::Query.new
440
+ # query.kind("Task")
441
+ # .where("done", "=", false)
442
+ #
443
+ # Create an aggregate query
444
+ # aggregate_query = query.aggregate_query
445
+ #
446
+ def aggregate_query
447
+ AggregateQuery.new @grpc
448
+ end
449
+
428
450
  # @private
429
451
  def to_grpc
430
452
  @grpc
@@ -157,6 +157,37 @@ module Google
157
157
  end
158
158
  alias run_query run
159
159
 
160
+ ##
161
+ # Retrieve aggregate query results specified by an AggregateQuery. The query is run within the
162
+ # transaction.
163
+ #
164
+ # @param [AggregateQuery, GqlQuery] query The Query object with the search criteria.
165
+ # @param [String] namespace The namespace the query is to run within.
166
+ #
167
+ # @return [Google::Cloud::Datastore::Dataset::AggregateQueryResults]
168
+ #
169
+ # @example
170
+ # require "google/cloud/datastore"
171
+ #
172
+ # datastore = Google::Cloud::Datastore.new
173
+ #
174
+ # datastore.read_only_transaction do |tx|
175
+ # query = tx.query("Task")
176
+ # .where("done", "=", false)
177
+ # aggregate_query = query.aggregate_query
178
+ # .add_count
179
+ # res = tx.run_aggregation aggregate_query
180
+ # end
181
+ #
182
+ def run_aggregation aggregate_query, namespace: nil
183
+ ensure_service!
184
+ unless aggregate_query.is_a?(AggregateQuery) || aggregate_query.is_a?(GqlQuery)
185
+ raise ArgumentError, "Cannot run a #{aggregate_query.class} object."
186
+ end
187
+ aggregate_query_results = service.run_aggregation_query aggregate_query.to_grpc, namespace, transaction: @id
188
+ Dataset::AggregateQueryResults.from_grpc aggregate_query_results
189
+ end
190
+
160
191
  ##
161
192
  # Begins a transaction.
162
193
  # This method is run when a new ReadOnlyTransaction is created.
@@ -29,14 +29,16 @@ module Google
29
29
  attr_accessor :credentials
30
30
  attr_accessor :host
31
31
  attr_accessor :timeout
32
+ attr_accessor :database
32
33
 
33
34
  ##
34
35
  # Creates a new Service instance.
35
- def initialize project, credentials, host: nil, timeout: nil
36
+ def initialize project, credentials, database, host: nil, timeout: nil
36
37
  @project = project
37
38
  @credentials = credentials
38
39
  @host = host
39
40
  @timeout = timeout
41
+ @database = database
40
42
  end
41
43
 
42
44
  def service
@@ -47,7 +49,7 @@ module Google
47
49
  config.endpoint = host if host
48
50
  config.lib_name = "gccl"
49
51
  config.lib_version = Google::Cloud::Datastore::VERSION
50
- config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}" }
52
+ config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}/databases/#{database}" }
51
53
  end
52
54
  end
53
55
  attr_accessor :mocked_service
@@ -56,7 +58,7 @@ module Google
56
58
  # Allocate IDs for incomplete keys.
57
59
  # (This is useful for referencing an entity before it is inserted.)
58
60
  def allocate_ids *incomplete_keys
59
- service.allocate_ids project_id: project, keys: incomplete_keys
61
+ service.allocate_ids project_id: project, database_id: database, keys: incomplete_keys
60
62
  end
61
63
 
62
64
  ##
@@ -64,7 +66,7 @@ module Google
64
66
  def lookup *keys, consistency: nil, transaction: nil
65
67
  read_options = generate_read_options consistency, transaction
66
68
 
67
- service.lookup project_id: project, keys: keys, read_options: read_options
69
+ service.lookup project_id: project, database_id: database, keys: keys, read_options: read_options
68
70
  end
69
71
 
70
72
  # Query for entities.
@@ -82,12 +84,34 @@ module Google
82
84
  end
83
85
 
84
86
  service.run_query project_id: project,
87
+ database_id: database,
85
88
  partition_id: partition_id,
86
89
  read_options: read_options,
87
90
  query: query,
88
91
  gql_query: gql_query
89
92
  end
90
93
 
94
+ ## Query for aggregates
95
+ def run_aggregation_query query, namespace = nil, consistency: nil, transaction: nil
96
+ gql_query = nil
97
+ if query.is_a? Google::Cloud::Datastore::V1::GqlQuery
98
+ gql_query = query
99
+ query = nil
100
+ end
101
+ read_options = generate_read_options consistency, transaction
102
+ if namespace
103
+ partition_id = Google::Cloud::Datastore::V1::PartitionId.new(
104
+ namespace_id: namespace
105
+ )
106
+ end
107
+
108
+ service.run_aggregation_query project_id: project,
109
+ partition_id: partition_id,
110
+ read_options: read_options,
111
+ aggregation_query: query,
112
+ gql_query: gql_query
113
+ end
114
+
91
115
  ##
92
116
  # Begin a new transaction.
93
117
  def begin_transaction read_only: nil, previous_transaction: nil
@@ -104,7 +128,7 @@ module Google
104
128
  )
105
129
  transaction_options.read_write = rw
106
130
  end
107
- service.begin_transaction project_id: project, transaction_options: transaction_options
131
+ service.begin_transaction project_id: project, database_id: database, transaction_options: transaction_options
108
132
  end
109
133
 
110
134
  ##
@@ -112,17 +136,18 @@ module Google
112
136
  # some entities.
113
137
  def commit mutations, transaction: nil
114
138
  mode = transaction.nil? ? :NON_TRANSACTIONAL : :TRANSACTIONAL
115
- service.commit project_id: project, mode: mode, mutations: mutations, transaction: transaction
139
+ service.commit project_id: project, database_id: database, mode: mode,
140
+ mutations: mutations, transaction: transaction
116
141
  end
117
142
 
118
143
  ##
119
144
  # Roll back a transaction.
120
145
  def rollback transaction
121
- service.rollback project_id: project, transaction: transaction
146
+ service.rollback project_id: project, database_id: database, transaction: transaction
122
147
  end
123
148
 
124
149
  def inspect
125
- "#{self.class}(#{@project})"
150
+ "#{self.class}(#{@project})(#{database})"
126
151
  end
127
152
 
128
153
  protected
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Datastore
19
- VERSION = "2.3.1".freeze
19
+ VERSION = "2.5.0".freeze
20
20
  end
21
21
  end
22
22
  end
@@ -74,6 +74,8 @@ module Google
74
74
  # If the param is nil, uses the default endpoint.
75
75
  # @param [String] emulator_host Datastore emulator host. Optional.
76
76
  # If the param is nil, uses the value of the `emulator_host` config.
77
+ # @param [String] database_id Identifier for a Datastore database in the project. If not
78
+ # present, the default database of the project will be used.
77
79
  # @param [String] project Alias for the `project_id` argument. Deprecated.
78
80
  # @param [String] keyfile Alias for the `credentials` argument.
79
81
  # Deprecated.
@@ -103,13 +105,15 @@ module Google
103
105
  timeout: nil,
104
106
  endpoint: nil,
105
107
  emulator_host: nil,
108
+ database_id: nil,
106
109
  project: nil,
107
110
  keyfile: nil
108
- project_id ||= (project || default_project_id)
109
- scope ||= configure.scope
110
- timeout ||= configure.timeout
111
- endpoint ||= configure.endpoint
111
+ project_id = get_project_id project_id, project
112
+ scope ||= configure.scope
113
+ timeout ||= configure.timeout
114
+ endpoint ||= configure.endpoint
112
115
  emulator_host ||= configure.emulator_host
116
+ database_id ||= configure.database_id
113
117
 
114
118
  if emulator_host
115
119
  project_id = project_id.to_s # Always cast to a string
@@ -117,7 +121,7 @@ module Google
117
121
 
118
122
  return Datastore::Dataset.new(
119
123
  Datastore::Service.new(
120
- project_id, :this_channel_is_insecure,
124
+ project_id, :this_channel_is_insecure, database_id,
121
125
  host: emulator_host, timeout: timeout
122
126
  )
123
127
  )
@@ -136,7 +140,7 @@ module Google
136
140
 
137
141
  Datastore::Dataset.new(
138
142
  Datastore::Service.new(
139
- project_id, credentials,
143
+ project_id, credentials, database_id,
140
144
  host: endpoint, timeout: timeout
141
145
  )
142
146
  )
@@ -175,6 +179,14 @@ module Google
175
179
  Google::Cloud.configure.datastore
176
180
  end
177
181
 
182
+ ##
183
+ # @private Default project.
184
+ def self.get_project_id project_id, project
185
+ project_id || project || Google::Cloud.configure.datastore.project_id ||
186
+ Google::Cloud.configure.project_id ||
187
+ Google::Cloud.env.project_id
188
+ end
189
+
178
190
  ##
179
191
  # @private Default project.
180
192
  def self.default_project_id
@@ -67,9 +67,10 @@ module Google
67
67
  # platform_scope = "https://www.googleapis.com/auth/cloud-platform"
68
68
  # datastore = gcloud.datastore scope: platform_scope
69
69
  #
70
- def datastore scope: nil, timeout: nil
70
+ def datastore scope: nil, timeout: nil, database_id: nil
71
71
  Google::Cloud.datastore @project, @keyfile,
72
- scope: scope, timeout: (timeout || @timeout)
72
+ scope: scope, timeout: (timeout || @timeout),
73
+ database_id: database_id
73
74
  end
74
75
 
75
76
  ##
@@ -112,11 +113,12 @@ module Google
112
113
  # datastore.save task
113
114
  #
114
115
  def self.datastore project_id = nil, credentials = nil, scope: nil,
115
- timeout: nil
116
+ timeout: nil, database_id: nil
116
117
  require "google/cloud/datastore"
117
118
  Google::Cloud::Datastore.new project_id: project_id,
118
119
  credentials: credentials,
119
- scope: scope, timeout: timeout
120
+ scope: scope, timeout: timeout,
121
+ database_id: database_id
120
122
  end
121
123
  end
122
124
  end
@@ -136,8 +138,7 @@ Google::Cloud.configure.add_config! :datastore do |config|
136
138
  ENV["DATASTORE_EMULATOR_HOST"]
137
139
  end
138
140
  default_scopes = [
139
- "https://www.googleapis.com/auth/cloud-platform",
140
- "https://www.googleapis.com/auth/datastore"
141
+ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/datastore"
141
142
  ]
142
143
 
143
144
  config.add_field! :project_id, default_project, match: String, allow_nil: true
@@ -149,4 +150,5 @@ Google::Cloud.configure.add_config! :datastore do |config|
149
150
  config.add_field! :timeout, nil, match: Integer
150
151
  config.add_field! :emulator_host, default_emulator, match: String, allow_nil: true
151
152
  config.add_field! :endpoint, "datastore.googleapis.com", match: String
153
+ config.add_field! :database_id, "", match: String
152
154
  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.3.1
4
+ version: 2.5.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: 2022-12-14 00:00:00.000000000 Z
12
+ date: 2023-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core
@@ -199,11 +199,13 @@ files:
199
199
  - TROUBLESHOOTING.md
200
200
  - lib/google-cloud-datastore.rb
201
201
  - lib/google/cloud/datastore.rb
202
+ - lib/google/cloud/datastore/aggregate_query.rb
202
203
  - lib/google/cloud/datastore/commit.rb
203
204
  - lib/google/cloud/datastore/convert.rb
204
205
  - lib/google/cloud/datastore/credentials.rb
205
206
  - lib/google/cloud/datastore/cursor.rb
206
207
  - lib/google/cloud/datastore/dataset.rb
208
+ - lib/google/cloud/datastore/dataset/aggregate_query_results.rb
207
209
  - lib/google/cloud/datastore/dataset/lookup_results.rb
208
210
  - lib/google/cloud/datastore/dataset/query_results.rb
209
211
  - lib/google/cloud/datastore/entity.rb
@@ -235,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
237
  - !ruby/object:Gem::Version
236
238
  version: '0'
237
239
  requirements: []
238
- rubygems_version: 3.3.14
240
+ rubygems_version: 3.4.2
239
241
  signing_key:
240
242
  specification_version: 4
241
243
  summary: API Client library for Google Cloud Datastore