Skip to content

Commit 6fdb5b1

Browse files
committed
Merge pull request #1226 from mpeg/datastore-fix-unprefixed-id
Fix datastore: unprefixed ids in client
2 parents 6692df2 + c32656e commit 6fdb5b1

2 files changed

Lines changed: 54 additions & 3 deletions

File tree

gcloud/datastore/client.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from gcloud.datastore.batch import Batch
2525
from gcloud.datastore.entity import Entity
2626
from gcloud.datastore.key import Key
27+
from gcloud.datastore.key import _dataset_ids_equal
2728
from gcloud.datastore.query import Query
2829
from gcloud.datastore.transaction import Transaction
2930
from gcloud.environment_vars import DATASET
@@ -288,9 +289,10 @@ def get_multi(self, keys, missing=None, deferred=None):
288289
if not keys:
289290
return []
290291

291-
ids = list(set([key.dataset_id for key in keys]))
292-
if ids != [self.dataset_id]:
293-
raise ValueError('Keys do not match dataset ID')
292+
ids = set(key.dataset_id for key in keys)
293+
for current_id in ids:
294+
if not _dataset_ids_equal(current_id, self.dataset_id):
295+
raise ValueError('Keys do not match dataset ID')
294296

295297
transaction = self.current_transaction
296298

gcloud/datastore/test_client.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,55 @@ def test_get_multi_hit_multiple_keys_different_dataset(self):
500500
with self.assertRaises(ValueError):
501501
client.get_multi([key1, key2])
502502

503+
def test_get_multi_diff_prefixes(self):
504+
from gcloud.datastore.key import Key
505+
506+
DATASET_ID1 = 'DATASET'
507+
DATASET_ID2 = 'e~DATASET'
508+
DATASET_ID3 = 's~DATASET'
509+
KIND = 'Kind'
510+
ID1 = 1234
511+
ID2 = 2345
512+
ID3 = 3456
513+
514+
# Make found entity pbs to be returned from mock backend.
515+
entity_pb1 = _make_entity_pb(DATASET_ID1, KIND, ID1)
516+
entity_pb2 = _make_entity_pb(DATASET_ID2, KIND, ID2)
517+
entity_pb3 = _make_entity_pb(DATASET_ID3, KIND, ID3)
518+
519+
creds = object()
520+
client = self._makeOne(credentials=creds)
521+
client.connection._add_lookup_result([entity_pb1,
522+
entity_pb2,
523+
entity_pb3])
524+
525+
key1 = Key(KIND, ID1, dataset_id=DATASET_ID1)
526+
key2 = Key(KIND, ID2, dataset_id=DATASET_ID2)
527+
key3 = Key(KIND, ID3, dataset_id=DATASET_ID3)
528+
529+
retrieved_all = client.get_multi([key1, key2, key3])
530+
retrieved1, retrieved2, retrieved3 = retrieved_all
531+
532+
# Check values & keys match.
533+
self.assertEqual(retrieved1.key.path, key1.path)
534+
self.assertEqual(retrieved2.key.path, key2.path)
535+
self.assertEqual(retrieved3.key.path, key3.path)
536+
537+
def test_get_multi_diff_datasets_w_prefix(self):
538+
from gcloud.datastore.key import Key
539+
540+
DATASET_ID1 = 'e~DATASET'
541+
DATASET_ID2 = 's~DATASET-ALT'
542+
543+
key1 = Key('KIND', 1234, dataset_id=DATASET_ID1)
544+
key2 = Key('KIND', 1234, dataset_id=DATASET_ID2)
545+
546+
creds = object()
547+
client = self._makeOne(credentials=creds)
548+
549+
with self.assertRaises(ValueError):
550+
client.get_multi([key1, key2])
551+
503552
def test_get_multi_max_loops(self):
504553
from gcloud._testing import _Monkey
505554
from gcloud.datastore import client as _MUT

0 commit comments

Comments
 (0)