From 7c62fdc0b82f13bae0796b0d749ecb87002240a7 Mon Sep 17 00:00:00 2001 From: Colin Howe Date: Wed, 8 Jun 2011 12:20:58 +0100 Subject: [PATCH 1/2] Allow for types to never be auto-prepended to indices --- mongoengine/queryset.py | 9 ++++++--- tests/queryset.py | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 17a1b0da..303afb6a 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -410,8 +410,10 @@ class QuerySet(object): if use_types and not all(f._index_with_types for f in fields): use_types = False - # If _types is being used, prepend it to every specified index - if doc_cls._meta.get('allow_inheritance') and use_types: + # If _types is being used, create an index for it + index_types = doc_cls._meta.get('index_types', True) + allow_inheritance = doc_cls._meta.get('allow_inheritance') + if index_types and allow_inheritance and use_types: index_list.insert(0, ('_types', 1)) return index_list @@ -457,6 +459,7 @@ class QuerySet(object): background = self._document._meta.get('index_background', False) drop_dups = self._document._meta.get('index_drop_dups', False) index_opts = self._document._meta.get('index_options', {}) + index_types = self._document._meta.get('index_types', True) # Ensure indexes created by uniqueness constraints for index in self._document._meta['unique_indexes']: @@ -470,7 +473,7 @@ class QuerySet(object): background=background, **index_opts) # If _types is being used (for polymorphism), it needs an index - if '_types' in self._query: + if index_types and '_types' in self._query: self._collection.ensure_index('_types', background=background, **index_opts) diff --git a/tests/queryset.py b/tests/queryset.py index 1f03fbd9..1e5e7a5a 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -1710,6 +1710,22 @@ class QuerySetTest(unittest.TestCase): self.assertTrue([('_types', 1)] in info) self.assertTrue([('_types', 1), ('date', -1)] in info) + def test_dont_index_types(self): + """Ensure that index_types will, when disabled, prevent _types + being added to all indices. + """ + class BlogPost(Document): + date = DateTimeField() + meta = {'index_types': False, + 'indexes': ['-date']} + + # Indexes are lazy so use list() to perform query + list(BlogPost.objects) + info = BlogPost.objects._collection.index_information() + info = [value['key'] for key, value in info.iteritems()] + self.assertTrue([('_types', 1)] not in info) + self.assertTrue([('date', -1)] in info) + BlogPost.drop_collection() class BlogPost(Document): From aa32d4301479a7cd45071ca3e5607ebe319f225e Mon Sep 17 00:00:00 2001 From: Colin Howe Date: Wed, 8 Jun 2011 12:36:32 +0100 Subject: [PATCH 2/2] Pydoc update --- mongoengine/document.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mongoengine/document.py b/mongoengine/document.py index b563f427..cae8343d 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -53,6 +53,11 @@ class Document(BaseDocument): dictionary. The value should be a list of field names or tuples of field names. Index direction may be specified by prefixing the field names with a **+** or **-** sign. + + By default, _types will be added to the start of every index (that + doesn't contain a list) if allow_inheritence is True. This can be + disabled by either setting types to False on the specific index or + by setting index_types to False on the meta dictionary for the document. """ __metaclass__ = TopLevelDocumentMetaclass