def make_filter(name, op, value): """Make a property filter protocol buffer. Args: name (str): The name of the property to filter by. op (str): The operator to apply in the filter. Must be one of "=", "<", "<=", ">", or ">=". value (Any): The value for comparison. Returns: query_pb2.PropertyFilter: The filter protocol buffer. """ filter_pb = query_pb2.PropertyFilter( property=query_pb2.PropertyReference(name=name), op=FILTER_OPERATORS[op], ) helpers._set_protobuf_value(filter_pb.value, value) return filter_pb
def _call_fut(self, value_pb, val): from google.cloud.datastore.helpers import _set_protobuf_value return _set_protobuf_value(value_pb, val)
def _pb_from_query(query): """Convert a Query instance to the corresponding protobuf. :type query: :class:`Query` :param query: The source query. :rtype: :class:`.query_pb2.Query` :returns: A protobuf that can be sent to the protobuf API. N.b. that it does not contain "in-flight" fields for ongoing query executions (cursors, offset, limit). """ pb = query_pb2.Query() for projection_name in query.projection: projection = query_pb2.Projection() projection.property.name = projection_name pb.projection.append(projection) if query.kind: kind = query_pb2.KindExpression() kind.name = query.kind pb.kind.append(kind) composite_filter = pb.filter.composite_filter composite_filter.op = query_pb2.CompositeFilter.Operator.AND if query.ancestor: ancestor_pb = query.ancestor.to_protobuf() # Filter on __key__ HAS_ANCESTOR == ancestor. ancestor_filter = composite_filter.filters._pb.add().property_filter ancestor_filter.property.name = "__key__" ancestor_filter.op = query_pb2.PropertyFilter.Operator.HAS_ANCESTOR ancestor_filter.value.key_value.CopyFrom(ancestor_pb._pb) for property_name, operator, value in query.filters: pb_op_enum = query.OPERATORS.get(operator) # Add the specific filter property_filter = composite_filter.filters._pb.add().property_filter property_filter.property.name = property_name property_filter.op = pb_op_enum # Set the value to filter on based on the type. if property_name == "__key__": key_pb = value.to_protobuf() property_filter.value.key_value.CopyFrom(key_pb._pb) else: helpers._set_protobuf_value(property_filter.value, value) if not composite_filter.filters: pb._pb.ClearField("filter") for prop in query.order: property_order = query_pb2.PropertyOrder() if prop.startswith("-"): property_order.property.name = prop[1:] property_order.direction = property_order.Direction.DESCENDING else: property_order.property.name = prop property_order.direction = property_order.Direction.ASCENDING pb.order.append(property_order) for distinct_on_name in query.distinct_on: ref = query_pb2.PropertyReference() ref.name = distinct_on_name pb.distinct_on.append(ref) return pb
def _pb_from_query(query): """Convert a Query instance to the corresponding protobuf. :type query: :class:`Query` :param query: The source query. :rtype: :class:`google.cloud.datastore._generated.query_pb2.Query` :returns: A protobuf that can be sent to the protobuf API. N.b. that it does not contain "in-flight" fields for ongoing query executions (cursors, offset, limit). """ pb = _query_pb2.Query() for projection_name in query.projection: pb.projection.add().property.name = projection_name if query.kind: pb.kind.add().name = query.kind composite_filter = pb.filter.composite_filter composite_filter.op = _query_pb2.CompositeFilter.AND if query.ancestor: ancestor_pb = query.ancestor.to_protobuf() # Filter on __key__ HAS_ANCESTOR == ancestor. ancestor_filter = composite_filter.filters.add().property_filter ancestor_filter.property.name = '__key__' ancestor_filter.op = _query_pb2.PropertyFilter.HAS_ANCESTOR ancestor_filter.value.key_value.CopyFrom(ancestor_pb) for property_name, operator, value in query.filters: pb_op_enum = query.OPERATORS.get(operator) # Add the specific filter property_filter = composite_filter.filters.add().property_filter property_filter.property.name = property_name property_filter.op = pb_op_enum # Set the value to filter on based on the type. if property_name == '__key__': key_pb = value.to_protobuf() property_filter.value.key_value.CopyFrom(key_pb) else: helpers._set_protobuf_value(property_filter.value, value) if not composite_filter.filters: pb.ClearField('filter') for prop in query.order: property_order = pb.order.add() if prop.startswith('-'): property_order.property.name = prop[1:] property_order.direction = property_order.DESCENDING else: property_order.property.name = prop property_order.direction = property_order.ASCENDING for distinct_on_name in query.distinct_on: pb.distinct_on.add().name = distinct_on_name return pb