@@ -103,9 +103,16 @@ def check_get_splits(self, query, num_splits, num_entities,
103103 unused_batch_size: ignored in v1new since query results are entirely
104104 handled by the Datastore client.
105105 """
106- # Test for both random long ids and string ids.
107- for id_or_name in [True , False ]:
108- client_entities = helper .create_client_entities (num_entities , id_or_name )
106+ # Test for random long ids, string ids, and a mix of both.
107+ for id_or_name in [True , False , None ]:
108+ if id_or_name is None :
109+ client_entities = helper .create_client_entities (num_entities , False )
110+ client_entities .extend (helper .create_client_entities (num_entities ,
111+ True ))
112+ num_entities *= 2
113+ else :
114+ client_entities = helper .create_client_entities (num_entities ,
115+ id_or_name )
109116
110117 mock_client = mock .MagicMock ()
111118 mock_client_query = mock .MagicMock ()
@@ -154,6 +161,19 @@ def check_get_splits(self, query, num_splits, num_entities,
154161 if lt_key is None :
155162 last_query_seen = True
156163
164+ def test_id_or_name (self ):
165+ id_ = query_splitter .IdOrName (1 )
166+ self .assertEqual (1 , id_ .id )
167+ self .assertIsNone (id_ .name )
168+ name = query_splitter .IdOrName ('1' )
169+ self .assertIsNone (name .id )
170+ self .assertEqual ('1' , name .name )
171+ self .assertEqual (query_splitter .IdOrName (1 ), query_splitter .IdOrName (1 ))
172+ self .assertEqual (query_splitter .IdOrName ('1' ), query_splitter .IdOrName ('1' ))
173+ self .assertLess (query_splitter .IdOrName (2 ), query_splitter .IdOrName ('1' ))
174+ self .assertLess (query_splitter .IdOrName (1 ), query_splitter .IdOrName (2 ))
175+ self .assertLess (query_splitter .IdOrName ('1' ), query_splitter .IdOrName ('2' ))
176+
157177 def test_client_key_sort_key (self ):
158178 k = key .Key ('kind1' , 1 , project = self ._PROJECT , namespace = self ._NAMESPACE )
159179 k2 = key .Key ('kind2' , 'a' , parent = k )
@@ -165,6 +185,31 @@ def test_client_key_sort_key(self):
165185 keys .sort (key = query_splitter .client_key_sort_key )
166186 self .assertEqual (expected_sort , keys )
167187
188+ def test_client_key_sort_key_ids (self ):
189+ k1 = key .Key ('kind' , 2 , project = self ._PROJECT )
190+ k2 = key .Key ('kind' , 1 , project = self ._PROJECT )
191+ keys = [k1 , k2 ]
192+ expected_sort = [k2 , k1 ]
193+ keys .sort (key = query_splitter .client_key_sort_key )
194+ self .assertEqual (expected_sort , keys )
195+
196+ def test_client_key_sort_key_names (self ):
197+ k1 = key .Key ('kind' , '2' , project = self ._PROJECT )
198+ k2 = key .Key ('kind' , '1' , project = self ._PROJECT )
199+ keys = [k1 , k2 ]
200+ expected_sort = [k2 , k1 ]
201+ keys .sort (key = query_splitter .client_key_sort_key )
202+ self .assertEqual (expected_sort , keys )
203+
204+ def test_client_key_sort_key_ids_vs_names (self ):
205+ # Keys with IDs always come before keys with names.
206+ k1 = key .Key ('kind' , '1' , project = self ._PROJECT )
207+ k2 = key .Key ('kind' , 2 , project = self ._PROJECT )
208+ keys = [k1 , k2 ]
209+ expected_sort = [k2 , k1 ]
210+ keys .sort (key = query_splitter .client_key_sort_key )
211+ self .assertEqual (expected_sort , keys )
212+
168213
169214# Hide base class from collection by nose.
170215del QuerySplitterTestBase
0 commit comments