diff --git a/docs/changelog.rst b/docs/changelog.rst index c2a5cb47..d7c7761f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,10 @@ Changelog ========= +Changes in 0.7.X +================ +- Update index spec generation so its not destructive (MongoEngine/mongoengine#113) + Changes in 0.7.1 ================= - Fixed index spec inheritance (MongoEngine/mongoengine#111) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index b020209b..6f913fc7 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -398,6 +398,7 @@ class QuerySet(object): or a **-** to determine the index ordering """ index_spec = QuerySet._build_index_spec(self._document, key_or_list) + index_spec = index_spec.copy() fields = index_spec.pop('fields') index_spec['drop_dups'] = drop_dups index_spec['background'] = background @@ -472,7 +473,9 @@ class QuerySet(object): # Ensure document-defined indexes are created if self._document._meta['index_specs']: - for spec in self._document._meta['index_specs']: + index_spec = self._document._meta['index_specs'] + for spec in index_spec: + spec = spec.copy() fields = spec.pop('fields') types_indexed = types_indexed or includes_types(fields) opts = index_opts.copy() diff --git a/tests/test_document.py b/tests/test_document.py index 976a2731..9637bfeb 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -688,6 +688,25 @@ class DocumentTest(unittest.TestCase): self.assertEqual(A._meta['index_specs'], B._meta['index_specs']) + def test_build_index_spec_is_not_destructive(self): + + class MyDoc(Document): + keywords = StringField() + + meta = { + 'indexes': ['keywords'], + 'allow_inheritance': False + } + + self.assertEqual(MyDoc._meta['index_specs'], + [{'fields': [('keywords', 1)]}]) + + # Force index creation + MyDoc.objects._ensure_indexes() + + self.assertEqual(MyDoc._meta['index_specs'], + [{'fields': [('keywords', 1)]}]) + def test_db_field_load(self): """Ensure we load data correctly """