From f0277736e2144130b209e0a11667e50c098ec1bc Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Mon, 9 May 2011 10:22:37 +0100 Subject: [PATCH] Updated queryset to handle latest version of pymongo map_reduce now requires an output. Reverted previous _lookup_field change, until a test case is produced for the incorrect behaviour. --- mongoengine/queryset.py | 14 ++++++-------- tests/queryset.py | 9 ++++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index e2273620..f5d5c5fb 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -522,7 +522,6 @@ class QuerySet(object): raise InvalidQueryError('Cannot resolve field "%s"' % field_name) fields.append(field) - field = None return fields @classmethod @@ -731,7 +730,7 @@ class QuerySet(object): def __len__(self): return self.count() - def map_reduce(self, map_f, reduce_f, finalize_f=None, limit=None, + def map_reduce(self, map_f, reduce_f, output, finalize_f=None, limit=None, scope=None, keep_temp=False): """Perform a map/reduce query using the current query spec and ordering. While ``map_reduce`` respects ``QuerySet`` chaining, @@ -745,26 +744,26 @@ class QuerySet(object): :param map_f: map function, as :class:`~pymongo.code.Code` or string :param reduce_f: reduce function, as :class:`~pymongo.code.Code` or string + :param output: output collection name :param finalize_f: finalize function, an optional function that performs any post-reduction processing. :param scope: values to insert into map/reduce global scope. Optional. :param limit: number of objects from current query to provide to map/reduce method - :param keep_temp: keep temporary table (boolean, default ``True``) Returns an iterator yielding :class:`~mongoengine.document.MapReduceDocument`. - .. note:: Map/Reduce requires server version **>= 1.1.1**. The PyMongo + .. note:: Map/Reduce changed in server version **>= 1.7.4**. The PyMongo :meth:`~pymongo.collection.Collection.map_reduce` helper requires - PyMongo version **>= 1.2**. + PyMongo version **>= 1.11**. .. versionadded:: 0.3 """ from document import MapReduceDocument if not hasattr(self._collection, "map_reduce"): - raise NotImplementedError("Requires MongoDB >= 1.1.1") + raise NotImplementedError("Requires MongoDB >= 1.7.1") map_f_scope = {} if isinstance(map_f, pymongo.code.Code): @@ -795,8 +794,7 @@ class QuerySet(object): if limit: mr_args['limit'] = limit - - results = self._collection.map_reduce(map_f, reduce_f, **mr_args) + results = self._collection.map_reduce(map_f, reduce_f, output, **mr_args) results = results.find() if self._ordering: diff --git a/tests/queryset.py b/tests/queryset.py index d0cdf106..746e8c2e 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -1027,7 +1027,7 @@ class QuerySetTest(unittest.TestCase): """ # run a map/reduce operation spanning all posts - results = BlogPost.objects.map_reduce(map_f, reduce_f) + results = BlogPost.objects.map_reduce(map_f, reduce_f, "myresults") results = list(results) self.assertEqual(len(results), 4) @@ -1076,7 +1076,7 @@ class QuerySetTest(unittest.TestCase): } """ - results = BlogPost.objects.map_reduce(map_f, reduce_f) + results = BlogPost.objects.map_reduce(map_f, reduce_f, "myresults") results = list(results) self.assertEqual(results[0].object, post1) @@ -1187,6 +1187,7 @@ class QuerySetTest(unittest.TestCase): results = Link.objects.order_by("-value") results = results.map_reduce(map_f, reduce_f, + "myresults", finalize_f=finalize_f, scope=scope) results = list(results) @@ -1451,7 +1452,9 @@ class QuerySetTest(unittest.TestCase): """ class Test(Document): testdict = DictField() - + + Test.drop_collection() + t = Test(testdict={'f': 'Value'}) t.save()