google-cloud-firestore 2.10.1 → 2.12.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: f6f5f652c19f42202037ab6ea3281e24a0a78a73749b9ad0a3eea4e5028c934d
4
- data.tar.gz: b8f499a9749fe11b7eabe4998e2b51660c85083edadf89bc5aeedcdd60c0e363
3
+ metadata.gz: c8d082b21e20a784bbc4ded66f836f6d04bd36b9925791edabe11e8d134427b4
4
+ data.tar.gz: f7d0f0cc23591434e68a92fee5132860fa6128cdaa3fbe4d3143911eb0c5f147
5
5
  SHA512:
6
- metadata.gz: 8c482b86c7d6a2f6fab119cb6056d2d9e34a45449496b154ed023bb81fec17a54a597cee2be7708ab6b630d5b46f76fe406899fcd3b8389a177199ac46f009a8
7
- data.tar.gz: '0944612066e1adcf21269961ec377e9b6ca3e809058328e5b002cfc0b80c5303c233420316ead38df278615092b6c3752fa47f55942054d378d2f4d9cd9f18f8'
6
+ metadata.gz: 19c611f16d93bedede808df8f049f9e6ec500a49e1b883b4d7e658d3c7f940c7afdf05eb4407615b80e91ee849eea6091662a886bf442b0a12f7887837578c8b
7
+ data.tar.gz: 9948560560760181151c1ec60f0c005a84e6ec1ae29c05f40efcca77d6be159f60592eafed854c69e7ab75a075c19b3786316782dccd5b98efaa814354f7d7e1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Release History
2
2
 
3
+ ### 2.12.0 (2023-04-20)
4
+
5
+ #### Features
6
+
7
+ * Add support for OR query ([#20920](https://github.com/googleapis/google-cloud-ruby/issues/20920))
8
+
9
+ ### 2.11.0 (2023-02-23)
10
+
11
+ #### Features
12
+
13
+ * Support REST transport ([#20446](https://github.com/googleapis/google-cloud-ruby/issues/20446))
14
+
3
15
  ### 2.10.1 (2023-02-16)
4
16
 
5
17
  #### Bug Fixes
@@ -23,6 +23,7 @@ require "google/cloud/firestore/document_snapshot"
23
23
  require "google/cloud/firestore/collection_group"
24
24
  require "google/cloud/firestore/batch"
25
25
  require "google/cloud/firestore/transaction"
26
+ require "google/cloud/firestore/filter"
26
27
 
27
28
  module Google
28
29
  module Cloud
@@ -185,6 +186,56 @@ module Google
185
186
  end
186
187
  alias collection_group col_group
187
188
 
189
+ ##
190
+ # Creates a filter object.
191
+ #
192
+ # @param field [FieldPath, String, Symbol] A field path to filter
193
+ # results with.
194
+ # If a {FieldPath} object is not provided then the field will be
195
+ # treated as a dotted string, meaning the string represents individual
196
+ # fields joined by ".". Fields containing `~`, `*`, `/`, `[`, `]`, and
197
+ # `.` cannot be in a dotted string, and should provided using a
198
+ # {FieldPath} object instead.
199
+ #
200
+ # @param operator [String, Symbol] The operation to compare the field
201
+ # to. Acceptable values include:
202
+ # * less than: `<`, `lt`
203
+ # * less than or equal: `<=`, `lte`
204
+ # * greater than: `>`, `gt`
205
+ # * greater than or equal: `>=`, `gte`
206
+ # * equal: `=`, `==`, `eq`, `eql`, `is`
207
+ # * not equal: `!=`
208
+ # * in: `in`
209
+ # * not in: `not-in`, `not_in`
210
+ # * array contains: `array-contains`, `array_contains`
211
+ #
212
+ # @param value [Object] The value to compare the property to. Defaults to nil.
213
+ # Possible values are:
214
+ # * Integer
215
+ # * Float/BigDecimal
216
+ # * String
217
+ # * Boolean
218
+ # * Array
219
+ # * Date/Time
220
+ # * StringIO
221
+ # * Google::Cloud::Datastore::Key
222
+ # * Google::Cloud::Datastore::Entity
223
+ # * nil
224
+ #
225
+ # @return [Google::Cloud::Firestore::Filter] New filter object.
226
+ #
227
+ # @example
228
+ # require "google/cloud/firestore"
229
+ #
230
+ # firestore = Google::Cloud::Firestore.new
231
+ #
232
+ # # Create a filter
233
+ # filter = firestore.filter(:population, :>=, 1000000)
234
+ #
235
+ def filter field, operator, value
236
+ Filter.new field, operator, value
237
+ end
238
+
188
239
  ##
189
240
  # Retrieves a document reference.
190
241
  #
@@ -0,0 +1,326 @@
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/firestore/v1"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Firestore
21
+ ##
22
+ # Represents the filter for structured query.
23
+ #
24
+ class Filter
25
+ ##
26
+ # @private Object of type
27
+ # Google::Cloud::Firestore::V1::StructuredQuery::Filter
28
+ attr_accessor :filter
29
+
30
+ ##
31
+ # Create a Filter object.
32
+ #
33
+ # @param field [FieldPath, String, Symbol] A field path to filter
34
+ # results with.
35
+ # If a {FieldPath} object is not provided then the field will be
36
+ # treated as a dotted string, meaning the string represents individual
37
+ # fields joined by ".". Fields containing `~`, `*`, `/`, `[`, `]`, and
38
+ # `.` cannot be in a dotted string, and should provided using a
39
+ # {FieldPath} object instead.
40
+ #
41
+ # @param operator [String, Symbol] The operation to compare the field
42
+ # to. Acceptable values include:
43
+ # * less than: `<`, `lt`
44
+ # * less than or equal: `<=`, `lte`
45
+ # * greater than: `>`, `gt`
46
+ # * greater than or equal: `>=`, `gte`
47
+ # * equal: `=`, `==`, `eq`, `eql`, `is`
48
+ # * not equal: `!=`
49
+ # * in: `in`
50
+ # * not in: `not-in`, `not_in`
51
+ # * array contains: `array-contains`, `array_contains`
52
+ #
53
+ # @param value [Object] The value to compare the property to. Defaults to nil.
54
+ # Possible values are:
55
+ # * Integer
56
+ # * Float/BigDecimal
57
+ # * String
58
+ # * Boolean
59
+ # * Array
60
+ # * Date/Time
61
+ # * StringIO
62
+ # * Google::Cloud::Datastore::Key
63
+ # * Google::Cloud::Datastore::Entity
64
+ # * nil
65
+ #
66
+ # @return [Google::Cloud::Firestore::Filter] New filter for the given condition
67
+ #
68
+ # @example
69
+ # require "google/cloud/firestore"
70
+ #
71
+ # firestore = Google::Cloud::Firestore.new
72
+ #
73
+ # # Create a Filter
74
+ # Google::Cloud::Firestore::Filter.new(:population, :>=, 1000000)
75
+ #
76
+ def initialize field, operator, value
77
+ @filter = create_filter field, operator, value
78
+ end
79
+
80
+ ##
81
+ # Joins filter using AND operator.
82
+ #
83
+ # @overload where(filter)
84
+ # Pass Firestore::Filter to `where` via field_or_filter argument.
85
+ #
86
+ # @param filter [::Google::Cloud::Firestore::Filter]
87
+ #
88
+ # @overload where(field, operator, value)
89
+ # Pass arguments to `where` via positional arguments.
90
+ #
91
+ # @param field [FieldPath, String, Symbol] A field path to filter
92
+ # results with.
93
+ # If a {FieldPath} object is not provided then the field will be
94
+ # treated as a dotted string, meaning the string represents individual
95
+ # fields joined by ".". Fields containing `~`, `*`, `/`, `[`, `]`, and
96
+ # `.` cannot be in a dotted string, and should provided using a
97
+ # {FieldPath} object instead.
98
+ #
99
+ # @param operator [String, Symbol] The operation to compare the field
100
+ # to. Acceptable values include:
101
+ # * less than: `<`, `lt`
102
+ # * less than or equal: `<=`, `lte`
103
+ # * greater than: `>`, `gt`
104
+ # * greater than or equal: `>=`, `gte`
105
+ # * equal: `=`, `==`, `eq`, `eql`, `is`
106
+ # * not equal: `!=`
107
+ # * in: `in`
108
+ # * not in: `not-in`, `not_in`
109
+ # * array contains: `array-contains`, `array_contains`
110
+ #
111
+ # @param value [Object] The value to compare the property to. Defaults to nil.
112
+ # Possible values are:
113
+ # * Integer
114
+ # * Float/BigDecimal
115
+ # * String
116
+ # * Boolean
117
+ # * Array
118
+ # * Date/Time
119
+ # * StringIO
120
+ # * Google::Cloud::Datastore::Key
121
+ # * Google::Cloud::Datastore::Entity
122
+ # * nil
123
+ #
124
+ # @return [Filter] New Filter object.
125
+ #
126
+ # @example Pass a Filter type object in argument
127
+ # require "google/cloud/firestore"
128
+ #
129
+ # filter_1 = Google::Cloud::Firestore.Firestore.new(:population, :>=, 1000000)
130
+ # filter_2 = Google::Cloud::Firestore.Firestore.new("done", "=", "false")
131
+ #
132
+ # filter = filter_1.and(filter_2)
133
+ #
134
+ # @example Pass filter conditions in the argument
135
+ # require "google/cloud/firestore"
136
+ #
137
+ # filter_1 = Google::Cloud::Firestore.Firestore.new(:population, :>=, 1000000)
138
+ #
139
+ # filter = filter_1.and("done", "=", "false")
140
+ #
141
+ def and filter_or_field = nil, operator = nil, value = nil
142
+ combine_filters composite_filter_and, filter_or_field, operator, value
143
+ end
144
+
145
+ ##
146
+ # Joins filter using OR operator.
147
+ #
148
+ # @overload where(filter)
149
+ # Pass Firestore::Filter to `where` via field_or_filter argument.
150
+ #
151
+ # @param filter [::Google::Cloud::Firestore::Filter]
152
+ #
153
+ # @overload where(field, operator, value)
154
+ # Pass arguments to `where` via positional arguments.
155
+ #
156
+ # @param field [FieldPath, String, Symbol] A field path to filter
157
+ # results with.
158
+ # If a {FieldPath} object is not provided then the field will be
159
+ # treated as a dotted string, meaning the string represents individual
160
+ # fields joined by ".". Fields containing `~`, `*`, `/`, `[`, `]`, and
161
+ # `.` cannot be in a dotted string, and should provided using a
162
+ # {FieldPath} object instead.
163
+ #
164
+ # @param operator [String, Symbol] The operation to compare the field
165
+ # to. Acceptable values include:
166
+ # * less than: `<`, `lt`
167
+ # * less than or equal: `<=`, `lte`
168
+ # * greater than: `>`, `gt`
169
+ # * greater than or equal: `>=`, `gte`
170
+ # * equal: `=`, `==`, `eq`, `eql`, `is`
171
+ # * not equal: `!=`
172
+ # * in: `in`
173
+ # * not in: `not-in`, `not_in`
174
+ # * array contains: `array-contains`, `array_contains`
175
+ #
176
+ # @param value [Object] The value to compare the property to. Defaults to nil.
177
+ # Possible values are:
178
+ # * Integer
179
+ # * Float/BigDecimal
180
+ # * String
181
+ # * Boolean
182
+ # * Array
183
+ # * Date/Time
184
+ # * StringIO
185
+ # * Google::Cloud::Datastore::Key
186
+ # * Google::Cloud::Datastore::Entity
187
+ # * nil
188
+ #
189
+ # @return [Filter] New Filter object.
190
+ #
191
+ # @example Pass a Filter type object in argument
192
+ # require "google/cloud/firestore"
193
+ #
194
+ # filter_1 = Google::Cloud::Firestore.Firestore.new(:population, :>=, 1000000)
195
+ # filter_2 = Google::Cloud::Firestore.Firestore.new("done", "=", "false")
196
+ #
197
+ # filter = filter_1.or(filter_2)
198
+ #
199
+ # @example Pass filter conditions in the argument
200
+ # require "google/cloud/firestore"
201
+ #
202
+ # filter_1 = Google::Cloud::Firestore.Firestore.new(:population, :>=, 1000000)
203
+ #
204
+ # filter = filter_1.or("done", "=", "false")
205
+ #
206
+ def or filter_or_field = nil, operator = nil, value = nil
207
+ combine_filters composite_filter_or, filter_or_field, operator, value
208
+ end
209
+
210
+ private
211
+
212
+ ##
213
+ # @private
214
+ StructuredQuery = Google::Cloud::Firestore::V1::StructuredQuery
215
+
216
+ ##
217
+ # @private
218
+ FILTER_OPS = {
219
+ "<" => :LESS_THAN,
220
+ "lt" => :LESS_THAN,
221
+ "<=" => :LESS_THAN_OR_EQUAL,
222
+ "lte" => :LESS_THAN_OR_EQUAL,
223
+ ">" => :GREATER_THAN,
224
+ "gt" => :GREATER_THAN,
225
+ ">=" => :GREATER_THAN_OR_EQUAL,
226
+ "gte" => :GREATER_THAN_OR_EQUAL,
227
+ "=" => :EQUAL,
228
+ "==" => :EQUAL,
229
+ "eq" => :EQUAL,
230
+ "eql" => :EQUAL,
231
+ "is" => :EQUAL,
232
+ "!=" => :NOT_EQUAL,
233
+ "array_contains" => :ARRAY_CONTAINS,
234
+ "array-contains" => :ARRAY_CONTAINS,
235
+ "include" => :ARRAY_CONTAINS,
236
+ "include?" => :ARRAY_CONTAINS,
237
+ "has" => :ARRAY_CONTAINS,
238
+ "in" => :IN,
239
+ "not_in" => :NOT_IN,
240
+ "not-in" => :NOT_IN,
241
+ "array_contains_any" => :ARRAY_CONTAINS_ANY,
242
+ "array-contains-any" => :ARRAY_CONTAINS_ANY
243
+ }.freeze
244
+
245
+ ##
246
+ # @private
247
+ INEQUALITY_FILTERS = [
248
+ :LESS_THAN,
249
+ :LESS_THAN_OR_EQUAL,
250
+ :GREATER_THAN,
251
+ :GREATER_THAN_OR_EQUAL
252
+ ].freeze
253
+
254
+ def composite_filter_and
255
+ StructuredQuery::Filter.new(
256
+ composite_filter: StructuredQuery::CompositeFilter.new(op: :AND)
257
+ )
258
+ end
259
+
260
+ def composite_filter_or
261
+ StructuredQuery::Filter.new(
262
+ composite_filter: StructuredQuery::CompositeFilter.new(op: :OR)
263
+ )
264
+ end
265
+
266
+ def combine_filters new_filter, filter_or_field, operator, value
267
+ new_filter.composite_filter.filters << @filter
268
+ new_filter.composite_filter.filters << if filter_or_field.is_a? Google::Cloud::Firestore::Filter
269
+ filter_or_field.filter
270
+ else
271
+ create_filter filter_or_field, operator, value
272
+ end
273
+ dup.tap do |f|
274
+ f.filter = new_filter
275
+ end
276
+ end
277
+
278
+ def value_nil? value
279
+ [nil, :null, :nil].include? value
280
+ end
281
+
282
+ def value_nan? value
283
+ # Comparing NaN values raises, so check for #nan? first.
284
+ return true if value.respond_to?(:nan?) && value.nan?
285
+ [:nan].include? value
286
+ end
287
+
288
+ def value_unary? value
289
+ value_nil?(value) || value_nan?(value)
290
+ end
291
+
292
+ def create_filter field, op_key, value
293
+ return if field.nil? && op_key.nil? && value.nil?
294
+ field = FieldPath.parse field unless field.is_a? FieldPath
295
+ field = StructuredQuery::FieldReference.new field_path: field.formatted_string.to_s
296
+ operator = FILTER_OPS[op_key.to_s.downcase]
297
+ raise ArgumentError, "unknown operator #{op_key}" if operator.nil?
298
+
299
+ if value_unary? value
300
+ operator = case operator
301
+ when :EQUAL
302
+ value_nan?(value) ? :IS_NAN : :IS_NULL
303
+ when :NOT_EQUAL
304
+ value_nan?(value) ? :IS_NOT_NAN : :IS_NOT_NULL
305
+ else
306
+ raise ArgumentError, "can only perform '==' and '!=' comparisons on #{value} values"
307
+ end
308
+
309
+ return StructuredQuery::Filter.new(
310
+ unary_filter: StructuredQuery::UnaryFilter.new(
311
+ field: field, op: operator
312
+ )
313
+ )
314
+ end
315
+
316
+ value = Convert.raw_to_value value
317
+ StructuredQuery::Filter.new(
318
+ field_filter: StructuredQuery::FieldFilter.new(
319
+ field: field, op: operator, value: value
320
+ )
321
+ )
322
+ end
323
+ end
324
+ end
325
+ end
326
+ end
@@ -18,6 +18,7 @@ require "google/cloud/firestore/document_snapshot"
18
18
  require "google/cloud/firestore/query_listener"
19
19
  require "google/cloud/firestore/convert"
20
20
  require "google/cloud/firestore/aggregate_query"
21
+ require "google/cloud/firestore/filter"
21
22
  require "json"
22
23
 
23
24
  module Google
@@ -210,29 +211,48 @@ module Google
210
211
  end
211
212
 
212
213
  ##
213
- # Filters the query on a field.
214
- #
215
- # @param [FieldPath, String, Symbol] field A field path to filter
216
- # results with.
217
- #
218
- # If a {FieldPath} object is not provided then the field will be
219
- # treated as a dotted string, meaning the string represents individual
220
- # fields joined by ".". Fields containing `~`, `*`, `/`, `[`, `]`, and
221
- # `.` cannot be in a dotted string, and should provided using a
222
- # {FieldPath} object instead.
223
- # @param [String, Symbol] operator The operation to compare the field
224
- # to. Acceptable values include:
225
- #
226
- # * less than: `<`, `lt`
227
- # * less than or equal: `<=`, `lte`
228
- # * greater than: `>`, `gt`
229
- # * greater than or equal: `>=`, `gte`
230
- # * equal: `=`, `==`, `eq`, `eql`, `is`
231
- # * not equal: `!=`
232
- # * in: `in`
233
- # * not in: `not-in`, `not_in`
234
- # * array contains: `array-contains`, `array_contains`
235
- # @param [Object] value A value the field is compared to.
214
+ # Adds filter to the where clause
215
+ #
216
+ # @overload where(filter)
217
+ # Pass Firestore::Filter to `where` via field_or_filter argument.
218
+ #
219
+ # @param filter [::Google::Cloud::Firestore::Filter]
220
+ #
221
+ # @overload where(field, operator, value)
222
+ # Pass arguments to `where` via positional arguments.
223
+ #
224
+ # @param field [FieldPath, String, Symbol] A field path to filter
225
+ # results with.
226
+ # If a {FieldPath} object is not provided then the field will be
227
+ # treated as a dotted string, meaning the string represents individual
228
+ # fields joined by ".". Fields containing `~`, `*`, `/`, `[`, `]`, and
229
+ # `.` cannot be in a dotted string, and should provided using a
230
+ # {FieldPath} object instead.
231
+ #
232
+ # @param operator [String, Symbol] The operation to compare the field
233
+ # to. Acceptable values include:
234
+ # * less than: `<`, `lt`
235
+ # * less than or equal: `<=`, `lte`
236
+ # * greater than: `>`, `gt`
237
+ # * greater than or equal: `>=`, `gte`
238
+ # * equal: `=`, `==`, `eq`, `eql`, `is`
239
+ # * not equal: `!=`
240
+ # * in: `in`
241
+ # * not in: `not-in`, `not_in`
242
+ # * array contains: `array-contains`, `array_contains`
243
+ #
244
+ # @param value [Object] The value to compare the property to. Defaults to nil.
245
+ # Possible values are:
246
+ # * Integer
247
+ # * Float/BigDecimal
248
+ # * String
249
+ # * Boolean
250
+ # * Array
251
+ # * Date/Time
252
+ # * StringIO
253
+ # * Google::Cloud::Datastore::Key
254
+ # * Google::Cloud::Datastore::Entity
255
+ # * nil
236
256
  #
237
257
  # @return [Query] New query with `where` called on it.
238
258
  #
@@ -251,7 +271,25 @@ module Google
251
271
  # puts "#{city.document_id} has #{city[:population]} residents."
252
272
  # end
253
273
  #
254
- def where field, operator, value
274
+ # @example
275
+ # require "google/cloud/firestore"
276
+ #
277
+ # firestore = Google::Cloud::Firestore.new
278
+ #
279
+ # # Get a collection reference
280
+ # cities_col = firestore.col "cities"
281
+ #
282
+ # # Create a filter
283
+ # filter = Filter.create(:population, :>=, 1000000)
284
+ #
285
+ # # Add filter to where clause
286
+ # query = query.where filter
287
+ #
288
+ # query.get do |city|
289
+ # puts "#{city.document_id} has #{city[:population]} residents."
290
+ # end
291
+ #
292
+ def where filter_or_field = nil, operator = nil, value = nil
255
293
  if query_has_cursors?
256
294
  raise "cannot call where after calling " \
257
295
  "start_at, start_after, end_before, or end_at"
@@ -260,10 +298,12 @@ module Google
260
298
  new_query = @query.dup
261
299
  new_query ||= StructuredQuery.new
262
300
 
263
- field = FieldPath.parse field unless field.is_a? FieldPath
264
-
265
- new_filter = filter field.formatted_string, operator, value
266
- add_filters_to_query new_query, new_filter
301
+ if filter_or_field.is_a? Google::Cloud::Firestore::Filter
302
+ new_query.where = filter_or_field.filter
303
+ else
304
+ new_filter = Google::Cloud::Firestore::Filter.new filter_or_field, operator, value
305
+ add_filters_to_query new_query, new_filter.filter
306
+ end
267
307
 
268
308
  Query.start new_query, parent_path, client, limit_type: limit_type
269
309
  end
@@ -1087,34 +1127,6 @@ module Google
1087
1127
  # @private
1088
1128
  StructuredQuery = Google::Cloud::Firestore::V1::StructuredQuery
1089
1129
 
1090
- ##
1091
- # @private
1092
- FILTER_OPS = {
1093
- "<" => :LESS_THAN,
1094
- "lt" => :LESS_THAN,
1095
- "<=" => :LESS_THAN_OR_EQUAL,
1096
- "lte" => :LESS_THAN_OR_EQUAL,
1097
- ">" => :GREATER_THAN,
1098
- "gt" => :GREATER_THAN,
1099
- ">=" => :GREATER_THAN_OR_EQUAL,
1100
- "gte" => :GREATER_THAN_OR_EQUAL,
1101
- "=" => :EQUAL,
1102
- "==" => :EQUAL,
1103
- "eq" => :EQUAL,
1104
- "eql" => :EQUAL,
1105
- "is" => :EQUAL,
1106
- "!=" => :NOT_EQUAL,
1107
- "array_contains" => :ARRAY_CONTAINS,
1108
- "array-contains" => :ARRAY_CONTAINS,
1109
- "include" => :ARRAY_CONTAINS,
1110
- "include?" => :ARRAY_CONTAINS,
1111
- "has" => :ARRAY_CONTAINS,
1112
- "in" => :IN,
1113
- "not_in" => :NOT_IN,
1114
- "not-in" => :NOT_IN,
1115
- "array_contains_any" => :ARRAY_CONTAINS_ANY,
1116
- "array-contains-any" => :ARRAY_CONTAINS_ANY
1117
- }.freeze
1118
1130
  ##
1119
1131
  # @private
1120
1132
  INEQUALITY_FILTERS = [
@@ -1138,36 +1150,6 @@ module Google
1138
1150
  value_nil?(value) || value_nan?(value)
1139
1151
  end
1140
1152
 
1141
- def filter name, op_key, value
1142
- field = StructuredQuery::FieldReference.new field_path: name.to_s
1143
- operator = FILTER_OPS[op_key.to_s.downcase]
1144
- raise ArgumentError, "unknown operator #{op_key}" if operator.nil?
1145
-
1146
- if value_unary? value
1147
- operator = case operator
1148
- when :EQUAL
1149
- value_nan?(value) ? :IS_NAN : :IS_NULL
1150
- when :NOT_EQUAL
1151
- value_nan?(value) ? :IS_NOT_NAN : :IS_NOT_NULL
1152
- else
1153
- raise ArgumentError, "can only perform '==' and '!=' comparisons on #{value} values"
1154
- end
1155
-
1156
- return StructuredQuery::Filter.new(
1157
- unary_filter: StructuredQuery::UnaryFilter.new(
1158
- field: field, op: operator
1159
- )
1160
- )
1161
- end
1162
-
1163
- value = Convert.raw_to_value value
1164
- StructuredQuery::Filter.new(
1165
- field_filter: StructuredQuery::FieldFilter.new(
1166
- field: field, op: operator, value: value
1167
- )
1168
- )
1169
- end
1170
-
1171
1153
  def composite_filter
1172
1154
  StructuredQuery::Filter.new(
1173
1155
  composite_filter: StructuredQuery::CompositeFilter.new(op: :AND)
@@ -34,17 +34,19 @@ module Google
34
34
 
35
35
  ##
36
36
  # Creates a new Service instance.
37
- def initialize project, credentials, host: nil, timeout: nil, database: nil
37
+ def initialize project, credentials, host: nil, timeout: nil, database: nil, transport: :grpc
38
38
  @project = project
39
39
  @credentials = credentials
40
40
  @host = host
41
41
  @timeout = timeout
42
42
  @database = database
43
+ @transport = transport
43
44
  end
44
45
 
45
46
  def firestore
46
- @firestore ||= \
47
- V1::Firestore::Client.new do |config|
47
+ @firestore ||= begin
48
+ client_class = @transport == :rest ? V1::Firestore::Rest::Client : V1::Firestore::Client
49
+ client_class.new do |config|
48
50
  config.credentials = credentials if credentials
49
51
  config.timeout = timeout if timeout
50
52
  config.endpoint = host if host
@@ -52,6 +54,7 @@ module Google
52
54
  config.lib_version = Google::Cloud::Firestore::VERSION
53
55
  config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}/databases/#{@database}" }
54
56
  end
57
+ end
55
58
  end
56
59
 
57
60
  def get_documents document_paths, mask: nil, transaction: nil, read_time: nil
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Firestore
19
- VERSION = "2.10.1".freeze
19
+ VERSION = "2.12.0".freeze
20
20
  end
21
21
  end
22
22
  end
@@ -61,6 +61,8 @@ module Google
61
61
  # If the param is nil, uses the value of the `emulator_host` config.
62
62
  # @param [String] database_id Identifier for a Firestore database. If not
63
63
  # present, the default database of the project is used.
64
+ # @param [:grpc,:rest] transport Which transport to use to communicate
65
+ # with the server. Defaults to `:grpc`.
64
66
  # @param [String] project Alias for the `project_id` argument. Deprecated.
65
67
  # @param [String] keyfile Alias for the `credentials` argument.
66
68
  # Deprecated.
@@ -79,6 +81,7 @@ module Google
79
81
  endpoint: nil,
80
82
  emulator_host: nil,
81
83
  database_id: nil,
84
+ transport: nil,
82
85
  project: nil,
83
86
  keyfile: nil
84
87
  project_id ||= (project || default_project_id)
@@ -87,13 +90,14 @@ module Google
87
90
  endpoint ||= configure.endpoint
88
91
  emulator_host ||= configure.emulator_host
89
92
  database_id ||= configure.database_id
93
+ transport ||= configure.transport
90
94
 
91
95
  if emulator_host
92
96
  project_id = project_id.to_s
93
97
  raise ArgumentError, "project_id is missing" if project_id.empty?
94
98
 
95
99
  service = Firestore::Service.new project_id, :this_channel_is_insecure, host: emulator_host,
96
- timeout: timeout, database: database_id
100
+ timeout: timeout, database: database_id, transport: transport
97
101
  return Firestore::Client.new service
98
102
  end
99
103
 
@@ -109,7 +113,7 @@ module Google
109
113
  raise ArgumentError, "project_id is missing" if project_id.empty?
110
114
 
111
115
  service = Firestore::Service.new project_id, credentials, host: endpoint,
112
- timeout: timeout, database: database_id
116
+ timeout: timeout, database: database_id, transport: transport
113
117
  Firestore::Client.new service
114
118
  end
115
119
 
@@ -44,6 +44,8 @@ module Google
44
44
  # @param [Integer] timeout Default timeout to use in requests. Optional.
45
45
  # @param [String] database_id Identifier for a Firestore database. If not
46
46
  # present, the default database of the project is used.
47
+ # @param [:grpc,:rest] transport Which transport to use to communicate
48
+ # with the server. Defaults to `:grpc`.
47
49
  #
48
50
  # @return [Google::Cloud::Firestore::Client]
49
51
  #
@@ -67,8 +69,16 @@ module Google
67
69
  # database_id = "my-todo-database"
68
70
  # firestore = gcloud.firestore database_id: database_id
69
71
  #
70
- def firestore scope: nil, timeout: nil, database_id: nil
71
- Google::Cloud.firestore @project, @keyfile, scope: scope, timeout: (timeout || @timeout), database_id: database_id
72
+ def firestore scope: nil,
73
+ timeout: nil,
74
+ database_id: nil,
75
+ transport: nil
76
+ transport ||= Google::Cloud.configure.firestore.transport
77
+ Google::Cloud.firestore @project, @keyfile,
78
+ scope: scope,
79
+ timeout: (timeout || @timeout),
80
+ database_id: database_id,
81
+ transport: transport
72
82
  end
73
83
 
74
84
  ##
@@ -94,6 +104,8 @@ module Google
94
104
  # @param [Integer] timeout Default timeout to use in requests. Optional.
95
105
  # @param [String] database_id Identifier for a Firestore database. If not
96
106
  # present, the default database of the project is used.
107
+ # @param [:grpc,:rest] transport Which transport to use to communicate
108
+ # with the server. Defaults to `:grpc`.
97
109
  #
98
110
  # @return [Google::Cloud::Firestore::Client]
99
111
  #
@@ -102,17 +114,26 @@ module Google
102
114
  #
103
115
  # firestore = Google::Cloud.firestore
104
116
  #
105
- def self.firestore project_id = nil, credentials = nil, scope: nil, timeout: nil, database_id: nil
117
+ def self.firestore project_id = nil,
118
+ credentials = nil,
119
+ scope: nil,
120
+ timeout: nil,
121
+ database_id: nil,
122
+ transport: nil
106
123
  require "google/cloud/firestore"
124
+ transport ||= Google::Cloud.configure.firestore.transport
107
125
  Google::Cloud::Firestore.new project_id: project_id,
108
126
  credentials: credentials,
109
127
  scope: scope,
110
128
  timeout: timeout,
111
- database_id: database_id
129
+ database_id: database_id,
130
+ transport: transport
112
131
  end
113
132
  end
114
133
  end
115
134
 
135
+ # rubocop:disable Metrics/BlockLength
136
+
116
137
  # Set the default firestore configuration
117
138
  Google::Cloud.configure.add_config! :firestore do |config|
118
139
  default_project = Google::Cloud::Config.deferred do
@@ -141,4 +162,7 @@ Google::Cloud.configure.add_config! :firestore do |config|
141
162
  config.add_field! :emulator_host, default_emulator, match: String, allow_nil: true
142
163
  config.add_field! :endpoint, "firestore.googleapis.com", match: String
143
164
  config.add_field! :database_id, "(default)", match: String
165
+ config.add_field! :transport, :grpc, match: Symbol
144
166
  end
167
+
168
+ # rubocop:enable Metrics/BlockLength
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: 2.10.1
4
+ version: 2.12.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: 2023-02-16 00:00:00.000000000 Z
11
+ date: 2023-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-cloud-core
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.8'
33
+ version: '0.10'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.8'
40
+ version: '0.10'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: concurrent-ruby
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -242,6 +242,7 @@ files:
242
242
  - lib/google/cloud/firestore/document_snapshot.rb
243
243
  - lib/google/cloud/firestore/field_path.rb
244
244
  - lib/google/cloud/firestore/field_value.rb
245
+ - lib/google/cloud/firestore/filter.rb
245
246
  - lib/google/cloud/firestore/generate.rb
246
247
  - lib/google/cloud/firestore/query.rb
247
248
  - lib/google/cloud/firestore/query_listener.rb