diff --git a/gcloud/datastore/connection.py b/gcloud/datastore/connection.py index 36ce9bbd297d..96ae478a5177 100644 --- a/gcloud/datastore/connection.py +++ b/gcloud/datastore/connection.py @@ -415,7 +415,11 @@ def save_entity(self, dataset_id, key_pb, properties, helpers._set_protobuf_value(prop.value, value) if name in exclude_from_indexes: - prop.value.indexed = False + if not isinstance(value, list): + prop.value.indexed = False + + for sub_value in prop.value.list_value: + sub_value.indexed = False # If this is in a transaction, we should just return True. The # transaction will handle assigning any keys as necessary. diff --git a/gcloud/datastore/test_connection.py b/gcloud/datastore/test_connection.py index d425d4654184..b3476dd42058 100644 --- a/gcloud/datastore/test_connection.py +++ b/gcloud/datastore/test_connection.py @@ -672,6 +672,7 @@ def test_save_entity_wo_transaction_w_upsert(self): def test_save_entity_w_exclude_from_indexes(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key + import operator DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() @@ -686,8 +687,9 @@ def test_save_entity_w_exclude_from_indexes(self): 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) - result = conn.save_entity(DATASET_ID, key_pb, {'foo': u'Foo'}, - exclude_from_indexes=['foo']) + result = conn.save_entity(DATASET_ID, key_pb, + {'foo': u'Foo', 'bar': [u'bar1', u'bar2']}, + exclude_from_indexes=['foo', 'bar']) self.assertEqual(result, True) cw = http._called_with self.assertEqual(cw['uri'], URI) @@ -705,11 +707,19 @@ def test_save_entity_w_exclude_from_indexes(self): self.assertEqual(len(upserts), 1) upsert = upserts[0] self.assertEqual(upsert.key, key_pb) - props = list(upsert.property) - self.assertEqual(len(props), 1) + props = sorted(upsert.property, + key=operator.attrgetter('name'), + reverse=True) + self.assertEqual(len(props), 2) self.assertEqual(props[0].name, 'foo') self.assertEqual(props[0].value.string_value, u'Foo') self.assertEqual(props[0].value.indexed, False) + self.assertEqual(props[1].name, 'bar') + self.assertEqual(props[1].value.list_value[0].string_value, 'bar1') + self.assertEqual(props[1].value.list_value[1].string_value, 'bar2') + self.assertEqual(props[1].value.HasField('indexed'), False) + self.assertEqual(props[1].value.list_value[0].indexed, False) + self.assertEqual(props[1].value.list_value[1].indexed, False) self.assertEqual(len(mutation.delete), 0) self.assertEqual(request.mode, rq_class.NON_TRANSACTIONAL)