Created
February 12, 2010 23:08
-
-
Save mattdennewitz/303096 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def test_map_reduce_finalize(self): | |
"""Ensure finalize is running by simulating "hotness" | |
ranking with Reddit algorithm. | |
""" | |
from time import mktime | |
class Link(Document): | |
title = StringField() | |
up_votes = IntField() | |
down_votes = IntField() | |
submitted = DateTimeField() | |
Link.drop_collection() | |
now = datetime.utcnow() | |
# Note: Test data taken from a custom Reddit homepage on | |
# Fri, 12 Feb 2010 14:36:00 -0600. Link ordering should | |
# reflect order of insertion below. | |
Link(title = "Google Buzz auto-followed a woman's abusive ex ...", | |
up_votes = 1079, | |
down_votes = 553, | |
submitted = now-timedelta(hours=4)).save() | |
Link(title = "We did it! Barbie is a computer engineer.", | |
up_votes = 481, | |
down_votes = 124, | |
submitted = now-timedelta(hours=2)).save() | |
Link(title = "This Is A Mosquito Getting Killed By A Laser", | |
up_votes = 1446, | |
down_votes = 530, | |
submitted=now-timedelta(hours=13)).save() | |
Link(title = "Arabic flashcards land physics student in jail.", | |
up_votes = 215, | |
down_votes = 105, | |
submitted = now-timedelta(hours=6)).save() | |
Link(title = "The Burger Lab: Presenting, the Flood Burger", | |
up_votes = 48, | |
down_votes = 17, | |
submitted = now-timedelta(hours=5)).save() | |
Link(title="How to see polarization with the naked eye", | |
up_votes = 74, | |
down_votes = 13, | |
submitted = now-timedelta(hours=10)).save() | |
map_f = """ | |
function() { | |
emit(this._id, {up_delta: this.up_votes - this.down_votes, | |
reddit_epoch: new Date(2005, 12, 8, 7, 46, 43, 0).getTime(), | |
sub_date: this.submitted.getTime()}) | |
} | |
""" | |
reduce_f = """ | |
function(key, values) { | |
data = values[0]; | |
x = data.up_delta; | |
// calculate time diff between reddit epoch and submission | |
sec_since_epoch = data.sub_date - data.reddit_epoch; | |
sec_since_epoch /= 1000; | |
// calculate 'Y' | |
if(x > 0) { | |
y = 1; | |
} else if (x = 0) { | |
y = 0; | |
} else { | |
y = -1; | |
} | |
// calculate 'Z', the maximal value | |
if(Math.abs(x) >= 1) { | |
z = Math.abs(x); | |
} else { | |
z = 1; | |
} | |
return {x: x, y: y, z: z, t_s: sec_since_epoch}; | |
} | |
""" | |
finalize_f = """ | |
function(key, value) { | |
// 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; | |
} | |
""" | |
# ensure both artists are found | |
results = Link.objects.order_by("-value") | |
results = results.map_reduce(map_f, reduce_f, finalize_f=finalize_f) | |
results = list(results) | |
# do something interesting with results | |
Link.drop_collection() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment