From 5b42578cb19a60a2e3a2640e0117b3654aa0f575 Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Wed, 17 Mar 2010 14:06:31 +0000 Subject: [PATCH] Added ~ field name substitution to mapreduce funcs --- mongoengine/queryset.py | 24 ++++++++++++++++++------ tests/queryset.py | 15 ++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index d79e0b70..70272552 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -477,16 +477,28 @@ class QuerySet(object): if not hasattr(self._collection, "map_reduce"): raise NotImplementedError("Requires MongoDB >= 1.1.1") - if not isinstance(map_f, pymongo.code.Code): - map_f = pymongo.code.Code(map_f) - if not isinstance(reduce_f, pymongo.code.Code): - reduce_f = pymongo.code.Code(reduce_f) + map_f_scope = {} + if isinstance(map_f, pymongo.code.Code): + map_f_scope = map_f.scope + map_f = str(map_f) + map_f = pymongo.code.Code(self._sub_js_fields(map_f), map_f_scope) + + reduce_f_scope = {} + if isinstance(reduce_f, pymongo.code.Code): + reduce_f_scope = reduce_f.scope + reduce_f = str(reduce_f) + reduce_f_code = self._sub_js_fields(reduce_f) + reduce_f = pymongo.code.Code(reduce_f_code, reduce_f_scope) mr_args = {'query': self._query, 'keeptemp': keep_temp} if finalize_f: - if not isinstance(finalize_f, pymongo.code.Code): - finalize_f = pymongo.code.Code(finalize_f) + finalize_f_scope = {} + if isinstance(finalize_f, pymongo.code.Code): + finalize_f_scope = finalize_f.scope + finalize_f = str(finalize_f) + finalize_f_code = self._sub_js_fields(finalize_f) + finalize_f = pymongo.code.Code(finalize_f_code, finalize_f_scope) mr_args['finalize'] = finalize_f if scope: diff --git a/tests/queryset.py b/tests/queryset.py index c7091ca2..32eaf6e0 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -640,7 +640,7 @@ class QuerySetTest(unittest.TestCase): """ class BlogPost(Document): title = StringField() - tags = ListField(StringField()) + tags = ListField(StringField(), db_field='post-tag-list') BlogPost.drop_collection() @@ -650,7 +650,7 @@ class QuerySetTest(unittest.TestCase): map_f = """ function() { - this.tags.forEach(function(tag) { + this[~tags].forEach(function(tag) { emit(tag, 1); }); } @@ -686,10 +686,10 @@ class QuerySetTest(unittest.TestCase): from time import mktime class Link(Document): - title = StringField() + title = StringField(db_field='bpTitle') up_votes = IntField() down_votes = IntField() - submitted = DateTimeField() + submitted = DateTimeField(db_field='sTime') Link.drop_collection() @@ -726,8 +726,8 @@ class QuerySetTest(unittest.TestCase): map_f = """ function() { - emit(this._id, {up_delta: this.up_votes - this.down_votes, - sub_date: this.submitted.getTime() / 1000}) + emit(this[~id], {up_delta: this[~up_votes] - this[~down_votes], + sub_date: this[~submitted].getTime() / 1000}) } """ @@ -762,7 +762,8 @@ class QuerySetTest(unittest.TestCase): finalize_f = """ function(key, value) { - // f(sec_since_epoch,y,z) = log10(z) + ((y*sec_since_epoch) / 45000) + // f(sec_since_epoch,y,z) = + // log10(z) + ((y*sec_since_epoch) / 45000) z_10 = Math.log(value.z) / Math.log(10); weight = z_10 + ((value.y * value.t_s) / 45000); return weight;