Added ~ field name substitution to mapreduce funcs
This commit is contained in:
parent
25a0a5364a
commit
5b42578cb1
@ -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:
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user