I've been planning something like this for my app, and so far this is
the best I've come up with:
First of all, you don't want to be querying to sum up scores for
individual users, so you need to keep a tally in one place. This is
BigTable business as usual.
In each relevant entity where you are tallying, track a day and a
score for that day:
user = "Kobe"
weight = "180"
...
lifetime_score = 14382 # total score over eternity
daily_day = "20090108" # the last day a score was recorded
daily_score = 153 # the score for daily_day
When you update the score, do a transaction as follows:
if today's date matches entity's daily_day:
lifetime_score += new_score
daily_score += new_score
else:
lifetime_score += new_score
daily_day = today
daily_score = new score
Then your final query is:
filter("day =", today_as("YYYYMMDD")).order("-score")
That requires a fairly simple (but custom) index.
The query ignores people who haven't scored today (the first filter
drops them), and sorts in descending on score.
And of course you should memcache the query results.
Hope this helps!
On Jan 8, 12:33 pm, Amir Michail <[email protected]> wrote:
> Hi,
>
> How can this be done efficiently with the current version of the GAE?
>
> I suppose you could keep track of all events affecting scoring for the
> last 24 hours. Whenever you handle a request -- even one that does
> not affect scoring -- you could prune out events older than 24 hours
> and add a new one if the player has received more points as a result
> of the current request.
>
> As you take out old events and add in new ones, you also update the
> top 10 ranking for the last 24 hours accordingly.
>
> The problem here is that taking out all the old events can be quite
> expensive. As an extreme example, if you don't get any requests for
> over 24 hours, then on the next request, you will need to clear out at
> a day's worth of scoring events.
>
> Amir
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Google App Engine" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---