def test__filters_pb_multi(self): from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 query1 = self._make_one(mock.sentinel.parent) query2 = query1.where('x.y', '>', 50.5) query3 = query2.where('ABC', '==', 123) filter_pb = query3._filters_pb() op_class = enums.StructuredQuery.FieldFilter.Operator expected_pb = query_pb2.StructuredQuery.Filter( composite_filter=query_pb2.StructuredQuery.CompositeFilter( op=enums.StructuredQuery.CompositeFilter.Operator.AND, filters=[ query_pb2.StructuredQuery.Filter( field_filter=query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference( field_path='x.y', ), op=op_class.GREATER_THAN, value=document_pb2.Value(double_value=50.5), ), ), query_pb2.StructuredQuery.Filter( field_filter=query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference( field_path='ABC', ), op=op_class.EQUAL, value=document_pb2.Value(integer_value=123), ), ), ], ), ) self.assertEqual(filter_pb, expected_pb)
def test_found(self): from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud._helpers import _datetime_to_pb_timestamp from google.cloud.firestore_v1beta1.document import DocumentSnapshot now = datetime.datetime.utcnow() read_time = _datetime_to_pb_timestamp(now) delta = datetime.timedelta(seconds=100) update_time = _datetime_to_pb_timestamp(now - delta) create_time = _datetime_to_pb_timestamp(now - 2 * delta) ref_string = self._dummy_ref_string() document_pb = document_pb2.Document( name=ref_string, fields={ "foo": document_pb2.Value(double_value=1.5), "bar": document_pb2.Value(string_value=u"skillz"), }, create_time=create_time, update_time=update_time, ) response_pb = _make_batch_response(found=document_pb, read_time=read_time) reference_map = {ref_string: mock.sentinel.reference} snapshot = self._call_fut(response_pb, reference_map) self.assertIsInstance(snapshot, DocumentSnapshot) self.assertIs(snapshot._reference, mock.sentinel.reference) self.assertEqual(snapshot._data, {"foo": 1.5, "bar": u"skillz"}) self.assertTrue(snapshot._exists) self.assertEqual(snapshot.read_time, read_time) self.assertEqual(snapshot.create_time, create_time) self.assertEqual(snapshot.update_time, update_time)
def test__to_protobuf_all_fields(self): from google.protobuf import wrappers_pb2 from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 parent = mock.Mock(id='cat', spec=['id']) query1 = self._make_one(parent) query2 = query1.select(['X', 'Y', 'Z']) query3 = query2.where('Y', '>', 2.5) query4 = query3.order_by('X') query5 = query4.limit(17) query6 = query5.offset(3) query7 = query6.start_at({'X': 10}) query8 = query7.end_at({'X': 25}) structured_query_pb = query8._to_protobuf() query_kwargs = { 'from': [ query_pb2.StructuredQuery.CollectionSelector( collection_id=parent.id, ), ], 'select': query_pb2.StructuredQuery.Projection(fields=[ query_pb2.StructuredQuery.FieldReference(field_path=field_path) for field_path in ['X', 'Y', 'Z'] ], ), 'where': query_pb2.StructuredQuery.Filter( field_filter=query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference( field_path='Y', ), op=enums.StructuredQuery.FieldFilter.Operator.GREATER_THAN, value=document_pb2.Value(double_value=2.5), ), ), 'order_by': [ _make_order_pb( 'X', enums.StructuredQuery.Direction.ASCENDING, ), ], 'start_at': query_pb2.Cursor( values=[ document_pb2.Value(integer_value=10), ], before=True, ), 'end_at': query_pb2.Cursor(values=[ document_pb2.Value(integer_value=25), ], ), 'offset': 3, 'limit': wrappers_pb2.Int32Value(value=17), } expected_pb = query_pb2.StructuredQuery(**query_kwargs) self.assertEqual(structured_query_pb, expected_pb)
def test__to_protobuf_end_at_only(self): # NOTE: "only" is wrong since we must have ``order_by`` as well. from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 parent = mock.Mock(id='ghoti', spec=['id']) query1 = self._make_one(parent) query2 = query1.end_at({'a': 88}) query3 = query2.order_by('a') structured_query_pb = query3._to_protobuf() query_kwargs = { 'from': [ query_pb2.StructuredQuery.CollectionSelector( collection_id=parent.id, ), ], 'order_by': [ _make_order_pb( 'a', enums.StructuredQuery.Direction.ASCENDING, ), ], 'end_at': query_pb2.Cursor(values=[ document_pb2.Value(integer_value=88), ], ), } expected_pb = query_pb2.StructuredQuery(**query_kwargs) self.assertEqual(structured_query_pb, expected_pb)
def test__to_protobuf_where_only(self): from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 parent = mock.Mock(id='dog', spec=['id']) query1 = self._make_one(parent) query2 = query1.where('a', '==', u'b') structured_query_pb = query2._to_protobuf() query_kwargs = { 'from': [ query_pb2.StructuredQuery.CollectionSelector( collection_id=parent.id, ), ], 'where': query_pb2.StructuredQuery.Filter( field_filter=query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference( field_path='a', ), op=enums.StructuredQuery.FieldFilter.Operator.EQUAL, value=document_pb2.Value(string_value=u'b'), ), ), } expected_pb = query_pb2.StructuredQuery(**query_kwargs) self.assertEqual(structured_query_pb, expected_pb)
def test_field(self): from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 field_filter_pb = query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference(field_path='XYZ', ), op=enums.StructuredQuery.FieldFilter.Operator.GREATER_THAN, value=document_pb2.Value(double_value=90.75), ) filter_pb = self._call_fut(field_filter_pb) expected_pb = query_pb2.StructuredQuery.Filter( field_filter=field_filter_pb) self.assertEqual(filter_pb, expected_pb)
def test__filters_pb_single(self): from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 query1 = self._make_one(mock.sentinel.parent) query2 = query1.where('x.y', '>', 50.5) filter_pb = query2._filters_pb() expected_pb = query_pb2.StructuredQuery.Filter( field_filter=query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference( field_path='x.y', ), op=enums.StructuredQuery.FieldFilter.Operator.GREATER_THAN, value=document_pb2.Value(double_value=50.5), ), ) self.assertEqual(filter_pb, expected_pb)
def test_where(self): from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import document_pb2 from google.cloud.firestore_v1beta1.proto import query_pb2 query = self._make_one_all_fields(skip_fields=('field_filters', )) new_query = query.where('power.level', '>', 9000) self.assertIsNot(query, new_query) self.assertIsInstance(new_query, self._get_target_class()) self.assertEqual(len(new_query._field_filters), 1) field_pb = new_query._field_filters[0] expected_pb = query_pb2.StructuredQuery.FieldFilter( field=query_pb2.StructuredQuery.FieldReference( field_path='power.level', ), op=enums.StructuredQuery.FieldFilter.Operator.GREATER_THAN, value=document_pb2.Value(integer_value=9000), ) self.assertEqual(field_pb, expected_pb) self._compare_queries(query, new_query, '_field_filters')
def encode_value(value): """Converts a native Python value into a Firestore protobuf ``Value``. Args: value (Union[NoneType, bool, int, float, datetime.datetime, \ str, bytes, dict, ~google.cloud.Firestore.GeoPoint]): A native Python value to convert to a protobuf field. Returns: ~google.cloud.firestore_v1beta1.types.Value: A value encoded as a Firestore protobuf. Raises: TypeError: If the ``value`` is not one of the accepted types. """ if value is None: return document_pb2.Value(null_value=struct_pb2.NULL_VALUE) # Must come before six.integer_types since ``bool`` is an integer subtype. if isinstance(value, bool): return document_pb2.Value(boolean_value=value) if isinstance(value, six.integer_types): return document_pb2.Value(integer_value=value) if isinstance(value, float): return document_pb2.Value(double_value=value) if isinstance(value, datetime.datetime): return document_pb2.Value(timestamp_value=_datetime_to_pb_timestamp(value)) if isinstance(value, six.text_type): return document_pb2.Value(string_value=value) if isinstance(value, six.binary_type): return document_pb2.Value(bytes_value=value) # NOTE: We avoid doing an isinstance() check for a Document # here to avoid import cycles. document_path = getattr(value, "_document_path", None) if document_path is not None: return document_pb2.Value(reference_value=document_path) if isinstance(value, GeoPoint): return document_pb2.Value(geo_point_value=value.to_protobuf()) if isinstance(value, list): value_list = [encode_value(element) for element in value] value_pb = document_pb2.ArrayValue(values=value_list) return document_pb2.Value(array_value=value_pb) if isinstance(value, dict): value_dict = encode_dict(value) value_pb = document_pb2.MapValue(fields=value_dict) return document_pb2.Value(map_value=value_pb) raise TypeError( "Cannot convert to a Firestore Value", value, "Invalid type", type(value) )
def _timestamp_value(seconds, nanos): return document_pb2.Value( timestamp_value=timestamp_pb2.Timestamp(seconds=seconds, nanos=nanos))
def _reference_value(r): return document_pb2.Value(reference_value=r)