Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions gcloud/datastore/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from gcloud.datastore.batch import Batch
from gcloud.datastore.entity import Entity
from gcloud.datastore.key import Key
from gcloud.datastore.key import _dataset_ids_equal
from gcloud.datastore.query import Query
from gcloud.datastore.transaction import Transaction
from gcloud.environment_vars import DATASET
Expand Down Expand Up @@ -288,9 +289,10 @@ def get_multi(self, keys, missing=None, deferred=None):
if not keys:
return []

ids = list(set([key.dataset_id for key in keys]))
if ids != [self.dataset_id]:
raise ValueError('Keys do not match dataset ID')
ids = set(key.dataset_id for key in keys)
for current_id in ids:
if not _dataset_ids_equal(current_id, self.dataset_id):
raise ValueError('Keys do not match dataset ID')

transaction = self.current_transaction

Expand Down
42 changes: 42 additions & 0 deletions gcloud/datastore/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,48 @@ def test_get_multi_hit_multiple_keys_different_dataset(self):
with self.assertRaises(ValueError):
client.get_multi([key1, key2])

def test_get_multi_hit_multiple_keys_different_dataset_prefixes(self):

This comment was marked as spam.

from gcloud.datastore.key import Key

DATASET_ID1 = 'DATASET'
DATASET_ID2 = 'e~DATASET'
DATASET_ID3 = 's~DATASET'
KIND = 'Kind'
ID1 = 1234
ID2 = 2345
ID3 = 3456

# Make sure our IDs are actually different.

This comment was marked as spam.

This comment was marked as spam.

self.assertNotEqual(DATASET_ID1, DATASET_ID2)
self.assertNotEqual(DATASET_ID1, DATASET_ID3)
self.assertNotEqual(DATASET_ID2, DATASET_ID3)

# Make found entity pbs to be returned from mock backend.
entity_pb1 = _make_entity_pb(DATASET_ID1, KIND, ID1)
entity_pb2 = _make_entity_pb(DATASET_ID2, KIND, ID2)
entity_pb3 = _make_entity_pb(DATASET_ID3, KIND, ID3)

creds = object()
client = self._makeOne(credentials=creds)
client.connection._add_lookup_result([entity_pb1,
entity_pb2,

This comment was marked as spam.

entity_pb3])

key1 = Key(KIND, ID1, dataset_id=DATASET_ID1)
key2 = Key(KIND, ID2, dataset_id=DATASET_ID2)
key3 = Key(KIND, ID3, dataset_id=DATASET_ID3)

retrieved_all = client.get_multi([key1, key2, key3])
retrieved1, retrieved2, retrieved3 = retrieved_all

# Check values & keys match.
self.assertEqual(retrieved1.key.path, key1.path)
self.assertEqual(dict(retrieved1), {})

This comment was marked as spam.

self.assertEqual(retrieved2.key.path, key2.path)
self.assertEqual(dict(retrieved2), {})
self.assertEqual(retrieved3.key.path, key3.path)
self.assertEqual(dict(retrieved3), {})

def test_get_multi_max_loops(self):
from gcloud._testing import _Monkey
from gcloud.datastore import client as _MUT
Expand Down