@@ -122,7 +122,6 @@ def build_api_url(cls, dataset_id, method, base_url=None,
122122 dataset_id = dataset_id , method = method )
123123
124124 def lookup (self , dataset_id , key_pbs ,
125- missing = None , deferred = None ,
126125 eventual = False , transaction_id = None ):
127126 """Lookup keys from a dataset in the Cloud Datastore.
128127
@@ -150,16 +149,6 @@ def lookup(self, dataset_id, key_pbs,
150149 :type key_pbs: list of :class:`gcloud.datastore._datastore_v1_pb2.Key`
151150 :param key_pbs: The keys to retrieve from the datastore.
152151
153- :type missing: an empty list or None.
154- :param missing: If a list is passed, the key-only entity protobufs
155- returned by the backend as "missing" will be copied
156- into it. Use only as a keyword param.
157-
158- :type deferred: an empty list or None.
159- :param deferred: If a list is passed, the key protobufs returned
160- by the backend as "deferred" will be copied into it.
161- Use only as a keyword param.
162-
163152 :type eventual: boolean
164153 :param eventual: If False (the default), request ``STRONG`` read
165154 consistency. If True, request ``EVENTUAL`` read
@@ -170,35 +159,24 @@ def lookup(self, dataset_id, key_pbs,
170159 the given transaction. Incompatible with
171160 ``eventual==True``.
172161
173- :rtype: list of :class:`gcloud.datastore._datastore_v1_pb2.Entity`
174- (or a single Entity)
175- :returns: The entities corresponding to the keys provided.
176- If a single key was provided and no results matched,
177- this will return None.
178- If multiple keys were provided and no results matched,
179- this will return an empty list.
180- :raises: ValueError if ``eventual`` is True
162+ :rtype: tuple
163+ :returns: A triple of (``results``, ``missing``, ``deferred``) where
164+ both ``results`` and ``missing`` are lists of
165+ :class:`gcloud.datastore._datastore_v1_pb2.Entity` and
166+ ``deferred`` is a list of
167+ :class:`gcloud.datastore._datastore_v1_pb2.Key`.
181168 """
182- if missing is not None and missing != []:
183- raise ValueError ('missing must be None or an empty list' )
184-
185- if deferred is not None and deferred != []:
186- raise ValueError ('deferred must be None or an empty list' )
187-
188169 lookup_request = datastore_pb .LookupRequest ()
189170 _set_read_options (lookup_request , eventual , transaction_id )
190171 helpers ._add_keys_to_request (lookup_request .key , key_pbs )
191172
192- results , missing_found , deferred_found = self ._lookup (
193- lookup_request , dataset_id , deferred is not None )
194-
195- if missing is not None :
196- missing .extend (missing_found )
173+ lookup_response = self ._rpc (dataset_id , 'lookup' , lookup_request ,
174+ datastore_pb .LookupResponse )
197175
198- if deferred is not None :
199- deferred . extend ( deferred_found )
176+ results = [ result . entity for result in lookup_response . found ]
177+ missing = [ result . entity for result in lookup_response . missing ]
200178
201- return results
179+ return results , missing , lookup_response . deferred
202180
203181 def run_query (self , dataset_id , query_pb , namespace = None ,
204182 eventual = False , transaction_id = None ):
@@ -376,41 +354,14 @@ def allocate_ids(self, dataset_id, key_pbs):
376354 datastore_pb .AllocateIdsResponse )
377355 return list (response .key )
378356
379- def _lookup (self , lookup_request , dataset_id , stop_on_deferred ):
380- """Repeat lookup until all keys found (unless stop requested).
381-
382- Helper method for ``lookup()``.
383- """
384- results = []
385- missing = []
386- deferred = []
387- while True : # loop against possible deferred.
388- lookup_response = self ._rpc (dataset_id , 'lookup' , lookup_request ,
389- datastore_pb .LookupResponse )
390-
391- results .extend (
392- [result .entity for result in lookup_response .found ])
393-
394- missing .extend (
395- [result .entity for result in lookup_response .missing ])
396-
397- if stop_on_deferred :
398- deferred .extend ([key for key in lookup_response .deferred ])
399- break
400-
401- if not lookup_response .deferred :
402- break
403-
404- # We have deferred keys, and the user didn't ask to know about
405- # them, so retry (but only with the deferred ones).
406- _copy_deferred_keys (lookup_request , lookup_response )
407- return results , missing , deferred
408-
409357
410358def _set_read_options (request , eventual , transaction_id ):
411359 """Validate rules for read options, and assign to the request.
412360
413361 Helper method for ``lookup()`` and ``run_query``.
362+
363+ :raises: :class:`ValueError` if ``eventual`` is ``True`` and the
364+ ``transaction_id`` is not ``None``.
414365 """
415366 if eventual and (transaction_id is not None ):
416367 raise ValueError ('eventual must be False when in a transaction' )
@@ -420,14 +371,3 @@ def _set_read_options(request, eventual, transaction_id):
420371 opts .read_consistency = datastore_pb .ReadOptions .EVENTUAL
421372 elif transaction_id :
422373 opts .transaction = transaction_id
423-
424-
425- def _copy_deferred_keys (lookup_request , lookup_response ):
426- """Clear requested keys and copy deferred keys back in.
427-
428- Helper for ``Connection.lookup()``.
429- """
430- for old_key in list (lookup_request .key ):
431- lookup_request .key .remove (old_key )
432- for def_key in lookup_response .deferred :
433- lookup_request .key .add ().CopyFrom (def_key )
0 commit comments