@@ -363,73 +363,6 @@ def fetch(self, limit=0, offset=0, start_cursor=None, end_cursor=None):
363363 return _Iterator (self , limit , offset , start_cursor , end_cursor )
364364
365365
366- def _pb_from_query (query ):
367- """Convert a Query instance to the corresponding protobuf.
368-
369- :type query: :class:`Query`
370- :param query: the source query
371-
372- :rtype: :class:`gcloud.datastore.datastore_v1_pb2.Query`
373- :returns: a protobuf that can be sent to the protobuf API. N.b. that
374- it does not contain "in-flight" fields for ongoing query
375- executions (cursors, offset, limit).
376- """
377- pb = datastore_pb .Query ()
378-
379- for projection_name in query .projection :
380- pb .projection .add ().property .name = projection_name
381-
382- if query .kind :
383- pb .kind .add ().name = query .kind
384-
385- composite_filter = pb .filter .composite_filter
386- composite_filter .operator = datastore_pb .CompositeFilter .AND
387-
388- if query .ancestor :
389- ancestor_pb = helpers ._prepare_key_for_request (
390- query .ancestor .to_protobuf ())
391-
392- # Filter on __key__ HAS_ANCESTOR == ancestor.
393- ancestor_filter = composite_filter .filter .add ().property_filter
394- ancestor_filter .property .name = '__key__'
395- ancestor_filter .operator = datastore_pb .PropertyFilter .HAS_ANCESTOR
396- ancestor_filter .value .key_value .CopyFrom (ancestor_pb )
397-
398- for property_name , operator , value in query .filters :
399- pb_op_enum = query .OPERATORS .get (operator )
400-
401- # Add the specific filter
402- property_filter = composite_filter .filter .add ().property_filter
403- property_filter .property .name = property_name
404- property_filter .operator = pb_op_enum
405-
406- # Set the value to filter on based on the type.
407- if property_name == '__key__' :
408- key_pb = value .to_protobuf ()
409- property_filter .value .key_value .CopyFrom (
410- helpers ._prepare_key_for_request (key_pb ))
411- else :
412- helpers ._set_protobuf_value (property_filter .value , value )
413-
414- if not composite_filter .filter :
415- pb .ClearField ('filter' )
416-
417- for prop in query .order :
418- property_order = pb .order .add ()
419-
420- if prop .startswith ('-' ):
421- property_order .property .name = prop [1 :]
422- property_order .direction = property_order .DESCENDING
423- else :
424- property_order .property .name = prop
425- property_order .direction = property_order .ASCENDING
426-
427- for group_by_name in query .group_by :
428- pb .group_by .add ().name = group_by_name
429-
430- return pb
431-
432-
433366class _Iterator (object ):
434367 """Represent the state of a given execution of a Query.
435368 """
@@ -455,7 +388,7 @@ def next_page(self):
455388 Low-level API for fine control: the more convenient API is
456389 to iterate on us.
457390
458- :rtyoe : tuple, (entities, more_results, cursor)
391+ :rtype : tuple, (entities, more_results, cursor)
459392 """
460393 pb = _pb_from_query (self ._query )
461394
@@ -514,3 +447,70 @@ def __iter__(self):
514447 if not self ._more_results :
515448 break
516449 self .next_page ()
450+
451+
452+ def _pb_from_query (query ):
453+ """Convert a Query instance to the corresponding protobuf.
454+
455+ :type query: :class:`Query`
456+ :param query: the source query
457+
458+ :rtype: :class:`gcloud.datastore.datastore_v1_pb2.Query`
459+ :returns: a protobuf that can be sent to the protobuf API. N.b. that
460+ it does not contain "in-flight" fields for ongoing query
461+ executions (cursors, offset, limit).
462+ """
463+ pb = datastore_pb .Query ()
464+
465+ for projection_name in query .projection :
466+ pb .projection .add ().property .name = projection_name
467+
468+ if query .kind :
469+ pb .kind .add ().name = query .kind
470+
471+ composite_filter = pb .filter .composite_filter
472+ composite_filter .operator = datastore_pb .CompositeFilter .AND
473+
474+ if query .ancestor :
475+ ancestor_pb = helpers ._prepare_key_for_request (
476+ query .ancestor .to_protobuf ())
477+
478+ # Filter on __key__ HAS_ANCESTOR == ancestor.
479+ ancestor_filter = composite_filter .filter .add ().property_filter
480+ ancestor_filter .property .name = '__key__'
481+ ancestor_filter .operator = datastore_pb .PropertyFilter .HAS_ANCESTOR
482+ ancestor_filter .value .key_value .CopyFrom (ancestor_pb )
483+
484+ for property_name , operator , value in query .filters :
485+ pb_op_enum = query .OPERATORS .get (operator )
486+
487+ # Add the specific filter
488+ property_filter = composite_filter .filter .add ().property_filter
489+ property_filter .property .name = property_name
490+ property_filter .operator = pb_op_enum
491+
492+ # Set the value to filter on based on the type.
493+ if property_name == '__key__' :
494+ key_pb = value .to_protobuf ()
495+ property_filter .value .key_value .CopyFrom (
496+ helpers ._prepare_key_for_request (key_pb ))
497+ else :
498+ helpers ._set_protobuf_value (property_filter .value , value )
499+
500+ if not composite_filter .filter :
501+ pb .ClearField ('filter' )
502+
503+ for prop in query .order :
504+ property_order = pb .order .add ()
505+
506+ if prop .startswith ('-' ):
507+ property_order .property .name = prop [1 :]
508+ property_order .direction = property_order .DESCENDING
509+ else :
510+ property_order .property .name = prop
511+ property_order .direction = property_order .ASCENDING
512+
513+ for group_by_name in query .group_by :
514+ pb .group_by .add ().name = group_by_name
515+
516+ return pb
0 commit comments