Skip to content

Commit a2a11bd

Browse files
committed
DRY out read_options logic.
Feedback from @dhermes: #449 (comment) #449 (comment)
1 parent 31ab4ea commit a2a11bd

1 file changed

Lines changed: 47 additions & 49 deletions

File tree

gcloud/datastore/connection.py

Lines changed: 47 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -233,17 +233,8 @@ def lookup(self, dataset_id, key_pbs,
233233
if deferred is not None and deferred != []:
234234
raise ValueError('deferred must be None or an empty list')
235235

236-
transaction = self.transaction()
237-
if eventual and transaction:
238-
raise ValueError('eventual must be False when in a transaction')
239-
240236
lookup_request = datastore_pb.LookupRequest()
241-
242-
opts = lookup_request.read_options
243-
if eventual:
244-
opts.read_consistency = datastore_pb.ReadOptions.EVENTUAL
245-
elif transaction:
246-
opts.transaction = transaction
237+
self._set_read_options(lookup_request, eventual)
247238

248239
single_key = isinstance(key_pbs, datastore_pb.Key)
249240

@@ -270,36 +261,6 @@ def lookup(self, dataset_id, key_pbs,
270261

271262
return results
272263

273-
def _lookup(self, lookup_request, dataset_id, stop_on_deferred):
274-
"""Repeat lookup until all keys found (unless stop requested).
275-
276-
Helper method for ``lookup()``.
277-
"""
278-
results = []
279-
missing = []
280-
deferred = []
281-
while True: # loop against possible deferred.
282-
lookup_response = self._rpc(dataset_id, 'lookup', lookup_request,
283-
datastore_pb.LookupResponse)
284-
285-
results.extend(
286-
[result.entity for result in lookup_response.found])
287-
288-
missing.extend(
289-
[result.entity for result in lookup_response.missing])
290-
291-
if stop_on_deferred:
292-
deferred.extend([key for key in lookup_response.deferred])
293-
break
294-
295-
if not lookup_response.deferred:
296-
break
297-
298-
# We have deferred keys, and the user didn't ask to know about
299-
# them, so retry (but only with the deferred ones).
300-
_copy_deferred_keys(lookup_request, lookup_response)
301-
return results, missing, deferred
302-
303264
def run_query(self, dataset_id, query_pb, namespace=None, eventual=False):
304265
"""Run a query on the Cloud Datastore.
305266
@@ -351,16 +312,8 @@ def run_query(self, dataset_id, query_pb, namespace=None, eventual=False):
351312
consistency. If the connection has a current
352313
transaction, this value *must* be false.
353314
"""
354-
transaction = self.transaction()
355-
if eventual and transaction:
356-
raise ValueError('eventual must be False when in a transaction')
357-
358315
request = datastore_pb.RunQueryRequest()
359-
opts = request.read_options
360-
if eventual:
361-
opts.read_consistency = datastore_pb.ReadOptions.EVENTUAL
362-
elif transaction:
363-
opts.transaction = transaction
316+
self._set_read_options(request, eventual)
364317

365318
if namespace:
366319
request.partition_id.namespace = namespace
@@ -563,6 +516,51 @@ def delete_entities(self, dataset_id, key_pbs):
563516

564517
return True
565518

519+
def _lookup(self, lookup_request, dataset_id, stop_on_deferred):
520+
"""Repeat lookup until all keys found (unless stop requested).
521+
522+
Helper method for ``lookup()``.
523+
"""
524+
results = []
525+
missing = []
526+
deferred = []
527+
while True: # loop against possible deferred.
528+
lookup_response = self._rpc(dataset_id, 'lookup', lookup_request,
529+
datastore_pb.LookupResponse)
530+
531+
results.extend(
532+
[result.entity for result in lookup_response.found])
533+
534+
missing.extend(
535+
[result.entity for result in lookup_response.missing])
536+
537+
if stop_on_deferred:
538+
deferred.extend([key for key in lookup_response.deferred])
539+
break
540+
541+
if not lookup_response.deferred:
542+
break
543+
544+
# We have deferred keys, and the user didn't ask to know about
545+
# them, so retry (but only with the deferred ones).
546+
_copy_deferred_keys(lookup_request, lookup_response)
547+
return results, missing, deferred
548+
549+
def _set_read_options(self, request, eventual):
550+
"""Validate rules for read options, and assign to the request.
551+
552+
Helper method for ``lookup()`` and ``run_query``.
553+
"""
554+
transaction = self.transaction()
555+
if eventual and transaction:
556+
raise ValueError('eventual must be False when in a transaction')
557+
558+
opts = request.read_options
559+
if eventual:
560+
opts.read_consistency = datastore_pb.ReadOptions.EVENTUAL
561+
elif transaction:
562+
opts.transaction = transaction
563+
566564

567565
def _copy_deferred_keys(lookup_request, lookup_response):
568566
"""Clear requested keys and copy deferred keys back in.

0 commit comments

Comments
 (0)