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.
This commit is contained in:
parent
49c978ad9e
commit
f0277736e2
@ -522,7 +522,6 @@ class QuerySet(object):
|
|||||||
raise InvalidQueryError('Cannot resolve field "%s"'
|
raise InvalidQueryError('Cannot resolve field "%s"'
|
||||||
% field_name)
|
% field_name)
|
||||||
fields.append(field)
|
fields.append(field)
|
||||||
field = None
|
|
||||||
return fields
|
return fields
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -731,7 +730,7 @@ class QuerySet(object):
|
|||||||
def __len__(self):
|
def __len__(self):
|
||||||
return self.count()
|
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):
|
scope=None, keep_temp=False):
|
||||||
"""Perform a map/reduce query using the current query spec
|
"""Perform a map/reduce query using the current query spec
|
||||||
and ordering. While ``map_reduce`` respects ``QuerySet`` chaining,
|
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 map_f: map function, as :class:`~pymongo.code.Code` or string
|
||||||
:param reduce_f: reduce function, as
|
:param reduce_f: reduce function, as
|
||||||
:class:`~pymongo.code.Code` or string
|
:class:`~pymongo.code.Code` or string
|
||||||
|
:param output: output collection name
|
||||||
:param finalize_f: finalize function, an optional function that
|
:param finalize_f: finalize function, an optional function that
|
||||||
performs any post-reduction processing.
|
performs any post-reduction processing.
|
||||||
:param scope: values to insert into map/reduce global scope. Optional.
|
:param scope: values to insert into map/reduce global scope. Optional.
|
||||||
:param limit: number of objects from current query to provide
|
:param limit: number of objects from current query to provide
|
||||||
to map/reduce method
|
to map/reduce method
|
||||||
:param keep_temp: keep temporary table (boolean, default ``True``)
|
|
||||||
|
|
||||||
Returns an iterator yielding
|
Returns an iterator yielding
|
||||||
:class:`~mongoengine.document.MapReduceDocument`.
|
: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
|
:meth:`~pymongo.collection.Collection.map_reduce` helper requires
|
||||||
PyMongo version **>= 1.2**.
|
PyMongo version **>= 1.11**.
|
||||||
|
|
||||||
.. versionadded:: 0.3
|
.. versionadded:: 0.3
|
||||||
"""
|
"""
|
||||||
from document import MapReduceDocument
|
from document import MapReduceDocument
|
||||||
|
|
||||||
if not hasattr(self._collection, "map_reduce"):
|
if not hasattr(self._collection, "map_reduce"):
|
||||||
raise NotImplementedError("Requires MongoDB >= 1.1.1")
|
raise NotImplementedError("Requires MongoDB >= 1.7.1")
|
||||||
|
|
||||||
map_f_scope = {}
|
map_f_scope = {}
|
||||||
if isinstance(map_f, pymongo.code.Code):
|
if isinstance(map_f, pymongo.code.Code):
|
||||||
@ -795,8 +794,7 @@ class QuerySet(object):
|
|||||||
|
|
||||||
if limit:
|
if limit:
|
||||||
mr_args['limit'] = limit
|
mr_args['limit'] = limit
|
||||||
|
results = self._collection.map_reduce(map_f, reduce_f, output, **mr_args)
|
||||||
results = self._collection.map_reduce(map_f, reduce_f, **mr_args)
|
|
||||||
results = results.find()
|
results = results.find()
|
||||||
|
|
||||||
if self._ordering:
|
if self._ordering:
|
||||||
|
@ -1027,7 +1027,7 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# run a map/reduce operation spanning all posts
|
# 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)
|
results = list(results)
|
||||||
self.assertEqual(len(results), 4)
|
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)
|
results = list(results)
|
||||||
|
|
||||||
self.assertEqual(results[0].object, post1)
|
self.assertEqual(results[0].object, post1)
|
||||||
@ -1187,6 +1187,7 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
results = Link.objects.order_by("-value")
|
results = Link.objects.order_by("-value")
|
||||||
results = results.map_reduce(map_f,
|
results = results.map_reduce(map_f,
|
||||||
reduce_f,
|
reduce_f,
|
||||||
|
"myresults",
|
||||||
finalize_f=finalize_f,
|
finalize_f=finalize_f,
|
||||||
scope=scope)
|
scope=scope)
|
||||||
results = list(results)
|
results = list(results)
|
||||||
@ -1451,7 +1452,9 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
class Test(Document):
|
class Test(Document):
|
||||||
testdict = DictField()
|
testdict = DictField()
|
||||||
|
|
||||||
|
Test.drop_collection()
|
||||||
|
|
||||||
t = Test(testdict={'f': 'Value'})
|
t = Test(testdict={'f': 'Value'})
|
||||||
t.save()
|
t.save()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user