From c9846a70b91dd24eb79ce7cc33e161687e54ba76 Mon Sep 17 00:00:00 2001 From: lucemia Date: Tue, 2 Dec 2014 17:11:16 +0800 Subject: [PATCH 1/5] fix list_value indexed --- gcloud/datastore/connection.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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. From c84fccf6a5bb304a4a8e9f851e851f6a59ecec74 Mon Sep 17 00:00:00 2001 From: lucemia Date: Wed, 3 Dec 2014 05:14:06 +0800 Subject: [PATCH 2/5] add test case --- gcloud/datastore/test_connection.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gcloud/datastore/test_connection.py b/gcloud/datastore/test_connection.py index d425d4654184..d3d88cf1a0d8 100644 --- a/gcloud/datastore/test_connection.py +++ b/gcloud/datastore/test_connection.py @@ -686,8 +686,8 @@ 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) @@ -706,10 +706,16 @@ def test_save_entity_w_exclude_from_indexes(self): upsert = upserts[0] self.assertEqual(upsert.key, key_pb) props = list(upsert.property) - self.assertEqual(len(props), 1) + 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) From 9a8d4e38a785d82e60fc9c0a9b326ba99dcb867a Mon Sep 17 00:00:00 2001 From: lucemia Date: Wed, 3 Dec 2014 05:35:15 +0800 Subject: [PATCH 3/5] make sure props in the same order --- gcloud/datastore/test_connection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gcloud/datastore/test_connection.py b/gcloud/datastore/test_connection.py index d3d88cf1a0d8..d33e7053a0c4 100644 --- a/gcloud/datastore/test_connection.py +++ b/gcloud/datastore/test_connection.py @@ -707,6 +707,7 @@ def test_save_entity_w_exclude_from_indexes(self): self.assertEqual(upsert.key, key_pb) props = list(upsert.property) self.assertEqual(len(props), 2) + props.sort(key=lambda i: i.name, reverse=True) self.assertEqual(props[0].name, 'foo') self.assertEqual(props[0].value.string_value, u'Foo') self.assertEqual(props[0].value.indexed, False) From 01714b28ccb4ebc9c6daf8bdb5109feb9c35b0aa Mon Sep 17 00:00:00 2001 From: lucemia Date: Wed, 3 Dec 2014 05:57:19 +0800 Subject: [PATCH 4/5] pep8 fix --- gcloud/datastore/test_connection.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gcloud/datastore/test_connection.py b/gcloud/datastore/test_connection.py index d33e7053a0c4..df74ec6aa120 100644 --- a/gcloud/datastore/test_connection.py +++ b/gcloud/datastore/test_connection.py @@ -686,7 +686,8 @@ 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', 'bar': [u'bar1', u'bar2']}, + 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 From 22163ff7cb1cee300c660950ca1b6fc4d0572780 Mon Sep 17 00:00:00 2001 From: lucemia Date: Sun, 7 Dec 2014 07:22:39 +0800 Subject: [PATCH 5/5] fix test coding style --- gcloud/datastore/test_connection.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcloud/datastore/test_connection.py b/gcloud/datastore/test_connection.py index df74ec6aa120..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() @@ -706,9 +707,10 @@ 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) + props = sorted(upsert.property, + key=operator.attrgetter('name'), + reverse=True) self.assertEqual(len(props), 2) - props.sort(key=lambda i: i.name, reverse=True) self.assertEqual(props[0].name, 'foo') self.assertEqual(props[0].value.string_value, u'Foo') self.assertEqual(props[0].value.indexed, False)