From 9b9696aefd11a0eb77b12c7f987467fe924c63c7 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Mon, 3 Sep 2012 12:29:58 +0100 Subject: [PATCH] Updated index creation allows kwargs to be passed through refs (MongoEngine/mongoengine#104) --- docs/changelog.rst | 1 + mongoengine/queryset.py | 20 ++++++++++---------- tests/test_document.py | 28 +++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index ab34fb76..90460fbd 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.7.X ================= +- Updated index creation allows kwargs to be passed through refs (MongoEngine/mongoengine#104) - Fixed Q object merge edge case (MongoEngine/mongoengine#109) - Fixed reloading on sharded documents (hmarr/mongoengine#569) - Added NotUniqueError for duplicate keys (MongoEngine/mongoengine#62) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index f9494ebc..2b83adda 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -398,12 +398,12 @@ class QuerySet(object): or a **-** to determine the index ordering """ index_spec = QuerySet._build_index_spec(self._document, key_or_list) - self._collection.ensure_index( - index_spec['fields'], - drop_dups=drop_dups, - background=background, - sparse=index_spec.get('sparse', False), - unique=index_spec.get('unique', False)) + fields = index_spec.pop('fields') + index_spec['drop_dups'] = drop_dups + index_spec['background'] = background + index_spec.update(kwargs) + + self._collection.ensure_index(fields, **index_spec) return self def __call__(self, q_obj=None, class_check=True, slave_okay=False, **query): @@ -473,11 +473,11 @@ class QuerySet(object): # Ensure document-defined indexes are created if self._document._meta['index_specs']: for spec in self._document._meta['index_specs']: - types_indexed = types_indexed or includes_types(spec['fields']) + fields = spec.pop('fields') + types_indexed = types_indexed or includes_types(fields) opts = index_opts.copy() - opts['unique'] = spec.get('unique', False) - opts['sparse'] = spec.get('sparse', False) - self._collection.ensure_index(spec['fields'], + opts.update(spec) + self._collection.ensure_index(fields, background=background, **opts) # If _types is being used (for polymorphism), it needs an index, diff --git a/tests/test_document.py b/tests/test_document.py index 821637ea..75616c77 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -16,7 +16,7 @@ from tests.fixtures import Base, Mixin, PickleEmbedded, PickleTest from mongoengine import * from mongoengine.base import NotRegistered, InvalidDocumentError from mongoengine.queryset import InvalidQueryError -from mongoengine.connection import get_db +from mongoengine.connection import get_db, get_connection TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__), 'mongoengine.png') @@ -1102,6 +1102,32 @@ class DocumentTest(unittest.TestCase): BlogPost.drop_collection() + def test_ttl_indexes(self): + + class Log(Document): + created = DateTimeField(default=datetime.now) + meta = { + 'indexes': [ + {'fields': ['created'], 'expireAfterSeconds': 3600} + ] + } + + Log.drop_collection() + + if pymongo.version_tuple[0] < 2 and pymongo.version_tuple[1] < 3: + raise SkipTest('pymongo needs to be 2.3 or higher for this test') + + connection = get_connection() + version_array = connection.server_info()['versionArray'] + if version_array[0] < 2 and version_array[1] < 2: + raise SkipTest('MongoDB needs to be 2.2 or higher for this test') + + # Indexes are lazy so use list() to perform query + list(Log.objects) + info = Log.objects._collection.index_information() + self.assertEqual(3600, + info['_types_1_created_1']['expireAfterSeconds']) + def test_unique_and_indexes(self): """Ensure that 'unique' constraints aren't overridden by meta.indexes.