google-cloud-firestore 0.25.1 → 0.26.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 +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/google/cloud/firestore/client.rb +61 -4
- data/lib/google/cloud/firestore/collection_reference.rb +34 -1
- data/lib/google/cloud/firestore/document_reference/list.rb +191 -0
- data/lib/google/cloud/firestore/document_reference.rb +1 -0
- data/lib/google/cloud/firestore/query.rb +1 -1
- data/lib/google/cloud/firestore/service.rb +25 -1
- data/lib/google/cloud/firestore/transaction.rb +1 -0
- data/lib/google/cloud/firestore/v1/firestore_client.rb +2 -1
- data/lib/google/cloud/firestore/v1beta1/firestore_client.rb +2 -1
- data/lib/google/cloud/firestore/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec9d1913fdc1c6817571acb97d791e1f452b7a774b8958d0affe0d80d61a3aa7
|
4
|
+
data.tar.gz: 139129578cb7616d7f3f1b4e8ffc0991913f57982c3c9e66e8b190b5166a0d02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28805388905373117c1ddb97e176d4e98bb45312ab6e5d2097ffe6dd96af9d6cef799496f3dedf5322f6b712c53091c51fd2e0365120d3c97ccfe2e01fdbe974
|
7
|
+
data.tar.gz: fe2f0cb02869d789fe5ee18336c3486f099662452ad4ad78676cbe3d7488feb46ef84b162c02508b07352dd785b2c6f0e5672af603dfcd060b62eb4f424b8f9f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.26.0 / 2019-06-13
|
4
|
+
|
5
|
+
BREAKING CHANGE: The default return value of Client#transaction has been
|
6
|
+
changed to the return value of the yielded block. Pass commit_response: true
|
7
|
+
for the previous default behavior of returning the CommitResponse.
|
8
|
+
|
9
|
+
* Add commit_response to Client#transaction
|
10
|
+
* Add Collection Group queries
|
11
|
+
* Add CollectionReference#list_documents
|
12
|
+
* Enable grpc.service_config_disable_resolution
|
13
|
+
* Use VERSION constant in GAPIC client
|
14
|
+
|
3
15
|
### 0.25.1 / 2019-04-29
|
4
16
|
|
5
17
|
* Add AUTHENTICATION.md guide.
|
@@ -139,6 +139,46 @@ module Google
|
|
139
139
|
end
|
140
140
|
alias collection col
|
141
141
|
|
142
|
+
##
|
143
|
+
# Creates and returns a new Query that includes all documents in the
|
144
|
+
# database that are contained in a collection or subcollection with the
|
145
|
+
# given collection_id.
|
146
|
+
#
|
147
|
+
# @param [String] collection_id Identifies the collections to query
|
148
|
+
# over. Every collection or subcollection with this ID as the last
|
149
|
+
# segment of its path will be included. Cannot contain a slash (`/`).
|
150
|
+
#
|
151
|
+
# @return [Query] The created Query.
|
152
|
+
#
|
153
|
+
# @example
|
154
|
+
# require "google/cloud/firestore"
|
155
|
+
#
|
156
|
+
# firestore = Google::Cloud::Firestore.new
|
157
|
+
#
|
158
|
+
# # Get the cities collection group query
|
159
|
+
# query = firestore.col_group "cities"
|
160
|
+
#
|
161
|
+
# query.get do |city|
|
162
|
+
# puts "#{city.document_id} has #{city[:population]} residents."
|
163
|
+
# end
|
164
|
+
#
|
165
|
+
def col_group collection_id
|
166
|
+
if collection_id.include? "/"
|
167
|
+
raise ArgumentError, "Invalid collection_id: '#{collection_id}', " \
|
168
|
+
"must not contain '/'."
|
169
|
+
end
|
170
|
+
query = Google::Firestore::V1::StructuredQuery.new(
|
171
|
+
from: [
|
172
|
+
Google::Firestore::V1::StructuredQuery::CollectionSelector.new(
|
173
|
+
collection_id: collection_id, all_descendants: true
|
174
|
+
)
|
175
|
+
]
|
176
|
+
)
|
177
|
+
|
178
|
+
Query.start query, service.documents_path, self
|
179
|
+
end
|
180
|
+
alias collection_group col_group
|
181
|
+
|
142
182
|
##
|
143
183
|
# Retrieves a document reference.
|
144
184
|
#
|
@@ -555,12 +595,19 @@ module Google
|
|
555
595
|
#
|
556
596
|
# @param [Integer] max_retries The maximum number of retries for
|
557
597
|
# transactions failed due to errors. Default is 5. Optional.
|
598
|
+
# @param [Boolean] commit_response When `true`, the return value from
|
599
|
+
# this method will be a `Google::Cloud::Firestore::CommitResponse`
|
600
|
+
# object with a `commit_time` attribute. Otherwise, the return
|
601
|
+
# value from this method will be the return value of the provided
|
602
|
+
# yield block. Default is `false`. Optional.
|
558
603
|
#
|
559
604
|
# @yield [transaction] The block for reading data and making changes.
|
560
605
|
# @yieldparam [Transaction] transaction The transaction object for
|
561
606
|
# making changes.
|
562
607
|
#
|
563
|
-
# @return [CommitResponse] The
|
608
|
+
# @return [Object, CommitResponse] The return value of the provided
|
609
|
+
# yield block, or if `commit_response` is provided and true, the
|
610
|
+
# `CommitResponse` object from the commit operation.
|
564
611
|
#
|
565
612
|
# @example
|
566
613
|
# require "google/cloud/firestore"
|
@@ -578,14 +625,16 @@ module Google
|
|
578
625
|
# tx.delete("cities/LA")
|
579
626
|
# end
|
580
627
|
#
|
581
|
-
def transaction max_retries: nil
|
628
|
+
def transaction max_retries: nil, commit_response: nil
|
582
629
|
max_retries = 5 unless max_retries.is_a? Integer
|
583
630
|
backoff = { current: 0, delay: 1.0, max: max_retries, mod: 1.3 }
|
584
631
|
|
585
632
|
transaction = Transaction.from_client self
|
586
633
|
begin
|
587
|
-
yield transaction
|
588
|
-
transaction.commit
|
634
|
+
transaction_return = yield transaction
|
635
|
+
commit_return = transaction.commit
|
636
|
+
# Conditional return value, depending on truthy commit_response
|
637
|
+
commit_response ? commit_return : transaction_return
|
589
638
|
rescue Google::Cloud::UnavailableError => err
|
590
639
|
# Re-raise if retried more than the max
|
591
640
|
raise err if backoff[:current] > backoff[:max]
|
@@ -618,6 +667,14 @@ module Google
|
|
618
667
|
|
619
668
|
# @!endgroup
|
620
669
|
|
670
|
+
# @private
|
671
|
+
def list_documents parent, collection_id, token: nil, max: nil
|
672
|
+
ensure_service!
|
673
|
+
grpc = service.list_documents \
|
674
|
+
parent, collection_id, token: token, max: max
|
675
|
+
DocumentReference::List.from_grpc grpc, service, parent, collection_id
|
676
|
+
end
|
677
|
+
|
621
678
|
protected
|
622
679
|
|
623
680
|
##
|
@@ -25,7 +25,7 @@ module Google
|
|
25
25
|
##
|
26
26
|
# # CollectionReference
|
27
27
|
#
|
28
|
-
# A collection reference object
|
28
|
+
# A collection reference object is used for adding documents, getting
|
29
29
|
# document references, and querying for documents (See {Query}).
|
30
30
|
#
|
31
31
|
# @example
|
@@ -126,6 +126,39 @@ module Google
|
|
126
126
|
end
|
127
127
|
alias document doc
|
128
128
|
|
129
|
+
##
|
130
|
+
# Retrieves a list of document references for the documents in this
|
131
|
+
# collection.
|
132
|
+
#
|
133
|
+
# The document references returned may include references to "missing
|
134
|
+
# documents", i.e. document locations that have no document present but
|
135
|
+
# which contain subcollections with documents. Attempting to read such a
|
136
|
+
# document reference (e.g. via {DocumentReference#get}) will return
|
137
|
+
# a {DocumentSnapshot} whose `exists?` method returns false.
|
138
|
+
#
|
139
|
+
# @param [String] token A previously-returned page token representing
|
140
|
+
# part of the larger set of results to view.
|
141
|
+
# @param [Integer] max Maximum number of results to return.
|
142
|
+
#
|
143
|
+
# @return [Array<DocumentReference>] An array of document references.
|
144
|
+
#
|
145
|
+
# @example
|
146
|
+
# require "google/cloud/firestore"
|
147
|
+
#
|
148
|
+
# firestore = Google::Cloud::Firestore.new
|
149
|
+
#
|
150
|
+
# col = firestore.col "cities"
|
151
|
+
#
|
152
|
+
# col.list_documents.each do |doc_ref|
|
153
|
+
# puts doc_ref.document_id
|
154
|
+
# end
|
155
|
+
#
|
156
|
+
def list_documents token: nil, max: nil
|
157
|
+
ensure_client!
|
158
|
+
client.list_documents \
|
159
|
+
parent_path, collection_id, token: token, max: max
|
160
|
+
end
|
161
|
+
|
129
162
|
##
|
130
163
|
# The document reference or database the collection reference belongs
|
131
164
|
# to. If the collection is a root collection, it will return the client
|
@@ -0,0 +1,191 @@
|
|
1
|
+
# Copyright 2019 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "delegate"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Firestore
|
21
|
+
class DocumentReference
|
22
|
+
##
|
23
|
+
# DocumentReference::List is a special case Array with additional
|
24
|
+
# values.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# require "google/cloud/firestore"
|
28
|
+
#
|
29
|
+
# firestore = Google::Cloud::Firestore.new
|
30
|
+
#
|
31
|
+
# col = firestore.col "cities"
|
32
|
+
#
|
33
|
+
# doc_refs = col.list_documents
|
34
|
+
#
|
35
|
+
# doc_refs.each do |doc_ref|
|
36
|
+
# puts doc_ref.document_id
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
class List < DelegateClass(::Array)
|
40
|
+
##
|
41
|
+
# If not empty, indicates that there are more records that match
|
42
|
+
# the request and this value should be passed to continue.
|
43
|
+
attr_accessor :token
|
44
|
+
|
45
|
+
##
|
46
|
+
# @private Create a new DocumentReference::List with an array of
|
47
|
+
# DocumentReference instances.
|
48
|
+
def initialize arr = []
|
49
|
+
super arr
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Whether there is a next page of document references.
|
54
|
+
#
|
55
|
+
# @return [Boolean]
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# require "google/cloud/firestore"
|
59
|
+
#
|
60
|
+
# firestore = Google::Cloud::Firestore.new
|
61
|
+
# col = firestore.col "cities"
|
62
|
+
#
|
63
|
+
# doc_refs = col.list_documents
|
64
|
+
# if doc_refs.next?
|
65
|
+
# next_documents = doc_refs.next
|
66
|
+
# end
|
67
|
+
def next?
|
68
|
+
!token.nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Retrieve the next page of document references.
|
73
|
+
#
|
74
|
+
# @return [DocumentReference::List]
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# require "google/cloud/firestore"
|
78
|
+
#
|
79
|
+
# firestore = Google::Cloud::Firestore.new
|
80
|
+
# col = firestore.col "cities"
|
81
|
+
#
|
82
|
+
# doc_refs = col.list_documents
|
83
|
+
# if doc_refs.next?
|
84
|
+
# next_documents = doc_refs.next
|
85
|
+
# end
|
86
|
+
def next
|
87
|
+
return nil unless next?
|
88
|
+
ensure_service!
|
89
|
+
options = { token: token, max: @max }
|
90
|
+
grpc = @service.list_documents @parent, @collection_id, options
|
91
|
+
self.class.from_grpc grpc, @service, @parent, @collection_id, @max
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Retrieves remaining results by repeatedly invoking {#next} until
|
96
|
+
# {#next?} returns `false`. Calls the given block once for each
|
97
|
+
# result, which is passed as the argument to the block.
|
98
|
+
#
|
99
|
+
# An Enumerator is returned if no block is given.
|
100
|
+
#
|
101
|
+
# This method will make repeated API calls until all remaining results
|
102
|
+
# are retrieved. (Unlike `#each`, for example, which merely iterates
|
103
|
+
# over the results returned by a single API call.) Use with caution.
|
104
|
+
#
|
105
|
+
# @param [Integer] request_limit The upper limit of API requests to
|
106
|
+
# make to load all document references. Default is no limit.
|
107
|
+
# @yield [document] The block for accessing each document.
|
108
|
+
# @yieldparam [DocumentReference] document The document reference
|
109
|
+
# object.
|
110
|
+
#
|
111
|
+
# @return [Enumerator]
|
112
|
+
#
|
113
|
+
# @example Iterating each document reference by passing a block:
|
114
|
+
# require "google/cloud/firestore"
|
115
|
+
#
|
116
|
+
# firestore = Google::Cloud::Firestore.new
|
117
|
+
# col = firestore.col "cities"
|
118
|
+
#
|
119
|
+
# doc_refs = col.list_documents
|
120
|
+
# doc_refs.all do |doc_ref|
|
121
|
+
# puts doc_ref.document_id
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# @example Using the enumerator by not passing a block:
|
125
|
+
# require "google/cloud/firestore"
|
126
|
+
#
|
127
|
+
# firestore = Google::Cloud::Firestore.new
|
128
|
+
# col = firestore.col "cities"
|
129
|
+
#
|
130
|
+
# doc_refs = col.list_documents
|
131
|
+
# all_document_ids = doc_refs.all.map do |doc_ref|
|
132
|
+
# doc_ref.document_id
|
133
|
+
# end
|
134
|
+
#
|
135
|
+
# @example Limit the number of API calls made:
|
136
|
+
# require "google/cloud/firestore"
|
137
|
+
#
|
138
|
+
# firestore = Google::Cloud::Firestore.new
|
139
|
+
# col = firestore.col "cities"
|
140
|
+
#
|
141
|
+
# doc_refs = col.list_documents
|
142
|
+
# doc_refs.all(request_limit: 10) do |doc_ref|
|
143
|
+
# puts doc_ref.document_id
|
144
|
+
# end
|
145
|
+
#
|
146
|
+
def all request_limit: nil
|
147
|
+
request_limit = request_limit.to_i if request_limit
|
148
|
+
unless block_given?
|
149
|
+
return enum_for :all, request_limit: request_limit
|
150
|
+
end
|
151
|
+
results = self
|
152
|
+
loop do
|
153
|
+
results.each { |r| yield r }
|
154
|
+
if request_limit
|
155
|
+
request_limit -= 1
|
156
|
+
break if request_limit < 0
|
157
|
+
end
|
158
|
+
break unless results.next?
|
159
|
+
results = results.next
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
##
|
164
|
+
# @private New DocumentReference::List from a
|
165
|
+
# Google::Firestore::V1::ListDocumentsResponse object.
|
166
|
+
def self.from_grpc grpc, service, parent, collection_id, max = nil
|
167
|
+
documents = List.new(Array(grpc.documents).map do |document|
|
168
|
+
DocumentReference.from_path document.name, service
|
169
|
+
end)
|
170
|
+
documents.instance_variable_set :@parent, parent
|
171
|
+
documents.instance_variable_set :@collection_id, collection_id
|
172
|
+
token = grpc.next_page_token
|
173
|
+
token = nil if token == "".freeze
|
174
|
+
documents.instance_variable_set :@token, token
|
175
|
+
documents.instance_variable_set :@service, service
|
176
|
+
documents.instance_variable_set :@max, max
|
177
|
+
documents
|
178
|
+
end
|
179
|
+
|
180
|
+
protected
|
181
|
+
|
182
|
+
##
|
183
|
+
# Raise an error unless an active service is available.
|
184
|
+
def ensure_service!
|
185
|
+
raise "Must have active connection" unless @service
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -17,6 +17,7 @@ require "google/cloud/firestore/v1"
|
|
17
17
|
require "google/cloud/firestore/document_snapshot"
|
18
18
|
require "google/cloud/firestore/collection_reference"
|
19
19
|
require "google/cloud/firestore/document_listener"
|
20
|
+
require "google/cloud/firestore/document_reference/list"
|
20
21
|
|
21
22
|
module Google
|
22
23
|
module Cloud
|
@@ -41,7 +41,11 @@ module Google
|
|
41
41
|
|
42
42
|
def channel
|
43
43
|
require "grpc"
|
44
|
-
GRPC::Core::Channel.new host,
|
44
|
+
GRPC::Core::Channel.new host, chan_args, chan_creds
|
45
|
+
end
|
46
|
+
|
47
|
+
def chan_args
|
48
|
+
{ "grpc.service_config_disable_resolution" => 1 }
|
45
49
|
end
|
46
50
|
|
47
51
|
def chan_creds
|
@@ -81,6 +85,26 @@ module Google
|
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
88
|
+
##
|
89
|
+
# Returns a list of DocumentReferences that are directly nested under
|
90
|
+
# the given collection. Fetches all documents from the server, but
|
91
|
+
# provides an empty field mask to avoid unnecessary data transfer. Sets
|
92
|
+
# the showMissing flag to true to support full document traversal. If
|
93
|
+
# there are too many documents, recommendation will be not to call this
|
94
|
+
# method.
|
95
|
+
def list_documents parent, collection_id, token: nil, max: nil
|
96
|
+
mask = { field_paths: [] }
|
97
|
+
call_options = nil
|
98
|
+
call_options = Google::Gax::CallOptions.new page_token: token if token
|
99
|
+
execute do
|
100
|
+
paged_enum = firestore.list_documents \
|
101
|
+
parent, collection_id, mask: mask, show_missing: true,
|
102
|
+
page_size: max, options: call_options
|
103
|
+
|
104
|
+
paged_enum.page.response
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
84
108
|
def list_collections parent, transaction: nil
|
85
109
|
list_args = {}
|
86
110
|
if transaction.is_a? String
|
@@ -27,6 +27,7 @@ require "google/gax"
|
|
27
27
|
|
28
28
|
require "google/firestore/v1/firestore_pb"
|
29
29
|
require "google/cloud/firestore/v1/credentials"
|
30
|
+
require "google/cloud/firestore/version"
|
30
31
|
|
31
32
|
module Google
|
32
33
|
module Cloud
|
@@ -223,7 +224,7 @@ module Google
|
|
223
224
|
updater_proc = credentials.updater_proc
|
224
225
|
end
|
225
226
|
|
226
|
-
package_version =
|
227
|
+
package_version = Google::Cloud::Firestore::VERSION
|
227
228
|
|
228
229
|
google_api_client = "gl-ruby/#{RUBY_VERSION}"
|
229
230
|
google_api_client << " #{lib_name}/#{lib_version}" if lib_name
|
@@ -27,6 +27,7 @@ require "google/gax"
|
|
27
27
|
|
28
28
|
require "google/firestore/v1beta1/firestore_pb"
|
29
29
|
require "google/cloud/firestore/v1beta1/credentials"
|
30
|
+
require "google/cloud/firestore/version"
|
30
31
|
|
31
32
|
module Google
|
32
33
|
module Cloud
|
@@ -223,7 +224,7 @@ module Google
|
|
223
224
|
updater_proc = credentials.updater_proc
|
224
225
|
end
|
225
226
|
|
226
|
-
package_version =
|
227
|
+
package_version = Google::Cloud::Firestore::VERSION
|
227
228
|
|
228
229
|
google_api_client = "gl-ruby/#{RUBY_VERSION}"
|
229
230
|
google_api_client << " #{lib_name}/#{lib_version}" if lib_name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-firestore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.26.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Google Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-cloud-core
|
@@ -234,6 +234,7 @@ files:
|
|
234
234
|
- lib/google/cloud/firestore/document_change.rb
|
235
235
|
- lib/google/cloud/firestore/document_listener.rb
|
236
236
|
- lib/google/cloud/firestore/document_reference.rb
|
237
|
+
- lib/google/cloud/firestore/document_reference/list.rb
|
237
238
|
- lib/google/cloud/firestore/document_snapshot.rb
|
238
239
|
- lib/google/cloud/firestore/field_path.rb
|
239
240
|
- lib/google/cloud/firestore/field_value.rb
|