From ccb4827ec9ff55aca51e6175faaf995e8bf5f084 Mon Sep 17 00:00:00 2001 From: blackbrrr Date: Tue, 5 Jan 2010 14:28:24 -0600 Subject: [PATCH] added meta support for indexes ensured at call-time --- mongoengine/base.py | 4 ++++ mongoengine/queryset.py | 20 +++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index c00e452c..47db127f 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -147,8 +147,12 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): 'allow_inheritance': True, 'max_documents': None, 'max_size': None, + 'indexes': [] # indexes to be ensured at runtime } + + # Apply document-defined meta options meta.update(attrs.get('meta', {})) + # Only simple classes - direct subclasses of Document - may set # allow_inheritance to False if not simple_class and not meta['allow_inheritance']: diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index e98c11a1..ed634391 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -31,18 +31,32 @@ class QuerySet(object): """ if isinstance(key_or_list, basestring): # single-field indexes needn't specify a direction - if key_or_list.startswith("-"): + if key_or_list.startswith("-") or key_or_list.startswith("+"): key_or_list = key_or_list[1:] self._collection.ensure_index(key_or_list) elif isinstance(key_or_list, (list, tuple)): - print key_or_list - self._collection.ensure_index(key_or_list) + index_list = [] + for key in key_or_list: + if key.startswith("-"): + index_list.append((key[1:], pymongo.DESCENDING)) + else: + if key.startswith("+"): + key = key[1:] + index_list.append((key, pymongo.ASCENDING)) + self._collection.ensure_index(index_list) return self def __call__(self, **query): """Filter the selected documents by calling the :class:`~mongoengine.QuerySet` with a query. """ + + # ensure document-defined indexes are created + if self._document._meta['indexes']: + for key_or_list in self._document._meta['indexes']: + # print "key", key_or_list + self.ensure_index(key_or_list) + query = QuerySet._transform_query(_doc_cls=self._document, **query) self._query.update(query) return self