From a9cacd2e0646423de5dee036387a1025f66d487e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 20 Sep 2011 08:56:30 -0300 Subject: [PATCH] fixed embedded null item_frequencies --- mongoengine/queryset.py | 21 ++++++++++++++++++--- tests/queryset.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index a6626855..a46581ef 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -1526,7 +1526,12 @@ class QuerySet(object): function() { path = '{{~%(field)s}}'.split('.'); field = this; - for (p in path) { field = field[path[p]]; } + for (p in path) { + if (field) + field = field[path[p]]; + else + break; + } if (field && field.constructor == Array) { field.forEach(function(item) { emit(item, 1); @@ -1572,7 +1577,12 @@ class QuerySet(object): var total = 0.0; db[collection].find(query).forEach(function(doc) { field = doc; - for (p in path) { field = field[path[p]]; } + for (p in path) { + if (field) + field = field[path[p]]; + else + break; + } if (field && field.constructor == Array) { total += field.length; } else { @@ -1588,7 +1598,12 @@ class QuerySet(object): } db[collection].find(query).forEach(function(doc) { field = doc; - for (p in path) { field = field[path[p]]; } + for (p in path) { + if (field) + field = field[path[p]]; + else + break; + } if (field && field.constructor == Array) { field.forEach(function(item) { frequencies[item] = inc + (isNaN(frequencies[item]) ? 0: frequencies[item]); diff --git a/tests/queryset.py b/tests/queryset.py index f093f6ab..de023877 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -1840,6 +1840,36 @@ class QuerySetTest(unittest.TestCase): freq = Person.objects.item_frequencies('city', normalize=True, map_reduce=True) self.assertEquals(freq, {'CRB': 0.5, None: 0.5}) + + def test_item_frequencies_with_null_embedded(self): + class Data(EmbeddedDocument): + name = StringField() + + class Extra(EmbeddedDocument): + tag = StringField() + + class Person(Document): + data = EmbeddedDocumentField(Data, required=True) + extra = EmbeddedDocumentField(Extra) + + + Person.drop_collection() + + p = Person() + p.data = Data(name="Wilson Jr") + p.save() + + p = Person() + p.data = Data(name="Wesley") + p.extra = Extra(tag="friend") + p.save() + + ot = Person.objects.item_frequencies('extra.tag', map_reduce=False) + self.assertEquals(ot, {None: 1.0, u'friend': 1.0}) + + ot = Person.objects.item_frequencies('extra.tag', map_reduce=True) + self.assertEquals(ot, {None: 1.0, u'friend': 1.0}) + def test_average(self): """Ensure that field can be averaged correctly. """