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_success(self): from google.cloud.firestore_v1beta1.gapic import enums from google.cloud.firestore_v1beta1.proto import query_pb2 from google.cloud.firestore_v1beta1 import _helpers field_path1 = 'a' field_path2 = 'a.b' field_path3 = 'x' direction1 = enums.StructuredQuery.Direction.DESCENDING direction2 = enums.StructuredQuery.Direction.ASCENDING direction3 = enums.StructuredQuery.Direction.ASCENDING orders = ( _make_order_pb(field_path1, direction1), _make_order_pb(field_path2, direction2), _make_order_pb(field_path3, direction3), ) data = { 'a': { 'b': 10, 'c': 1.5, }, 'x': True, } cursor_pair = data, True cursor_pb = self._call_fut(cursor_pair, orders) expected_pb = query_pb2.Cursor( values=[ _helpers.encode_value(data['a']), _helpers.encode_value(data['a']['b']), _helpers.encode_value(data['x']), ], before=True, ) self.assertEqual(cursor_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 _cursor_pb(cursor_pair, orders): """Convert a cursor pair to a protobuf. If ``cursor_pair`` is :data:`None`, just returns :data:`None`. Args: cursor_pair (Optional[Tuple[dict, bool]]): Two-tuple of * a mapping of fields. Any field that is present in this mapping must also be present in ``orders`` * a ``before`` flag orders (Tuple[google.cloud.proto.firestore.v1beta1.\ query_pb2.StructuredQuery.Order, ...]]): The "order by" entries to use for a query. (We use this rather than a list of field path strings just because it is how a query stores calls to ``order_by``.) Returns: Optional[google.cloud.firestore_v1beta1.types.Cursor]: A protobuf cursor corresponding to the values. Raises: ValueError: If ``cursor_pair`` is not :data:`None`, but there are no ``orders``. ValueError: If one of the field paths in ``orders`` is not contained in the ``data`` (i.e. the first component of ``cursor_pair``). """ if cursor_pair is None: return None if len(orders) == 0: raise ValueError(_NO_ORDERS_FOR_CURSOR) data, before = cursor_pair value_pbs = [] for order in orders: field_path = order.field.field_path try: value = _helpers.get_nested_value(field_path, data) except KeyError: msg = _MISSING_ORDER_BY.format(field_path, data) raise ValueError(msg) value_pb = _helpers.encode_value(value) value_pbs.append(value_pb) return query_pb2.Cursor(values=value_pbs, before=before)
def _cursor_pb(cursor_pair): """Convert a cursor pair to a protobuf. If ``cursor_pair`` is :data:`None`, just returns :data:`None`. Args: cursor_pair (Optional[Tuple[list, bool]]): Two-tuple of * a list of field values. * a ``before`` flag Returns: Optional[google.cloud.firestore_v1beta1.types.Cursor]: A protobuf cursor corresponding to the values. """ if cursor_pair is not None: data, before = cursor_pair value_pbs = [_helpers.encode_value(value) for value in data] return query_pb2.Cursor(values=value_pbs, before=before)