Perhaps I didn't explain my use case entirely well enough.  Basically it's a
leaderboard (high scores table) for an online game.  After thinking a little
more GAEly I came up with the following solution.  I was curious if anybody
had any comments or critiques for my approach.

Create a "WeeklyLeaderboardEntry" (or similarly named kind).  That basically
contains the player's score and the player's unique name.  And use it as
follows:

Make some code that establishes a sequence of weeks.  Let's say the number
of weeks since the Epoch.  For instance if it's January 3, 1970, the current
week is 0.  If it's January 8, 1970 it's week 1 and so on.

When player finishes game:
1) Look for WeeklyLeaderboardEntry with the current.  If it exists, skip to
step 4. (Maybe name the entitye PlayerName-Sequence).
2) Create "WeeklyLeaderboardEntry" for the current week.
3) Queue the entity to be deleted a week from now.
4) Set the player's current high score to that entity.
5) Persist object to be updated later in case the player plays another game

When displaying the leaderboard:
1) Query for "WeeklyLeaderboardEntries"
2) Filter out ones not pertaining to the current week
3) Sort highest score to lowest

This way the following holds true:

   - When the user is updating his/her high score he/she is only working a
   single entity.  I never need to do bulk updates in a cron job or anything.
   - I don't need to write a cron job to go through a whole mess of
   leaderboard entities trying to reset the counter for everbody at once.
   - When the week rolls over it appears to happen atomically because I just
   restrict the query to the current week.  There may be stale entry objects
   but those will get deleted at he app engine's leisure.

My only questions/concerns:

   - Is it okay to queue something to be deleted after a week? Will the task
   queue accept a timeout for that length of time?
   - Will the task queue keep up with clearing out stale entities as fast as
   they can be created?



On Wed, Jan 13, 2010 at 7:28 PM, Eric Ka Ka Ng <ngk...@gmail.com> wrote:

> how about batch update using db.put()?
>
> following is extracted from
>
> http://googleappengine.blogspot.com/2009/06/10-things-you-probably-didnt-know-about.html
>
>
> For example, take a look at this common pattern:
>
> for entity in MyModel.all().filter("color =",
>    old_favorite).fetch(100):
>  entity.color = new_favorite
>  entity.put()
>
>
> Doing the update this way requires one datastore round trip for the
> query, plus one additional round trip for each updated entity - for a
> total of up to 101 round trips! In comparison, take a look at this
> example:
>
> updated = []
> for entity in MyModel.all().filter("color =",
>    old_favorite).fetch(100):
>  entity.color = new_favorite
>  updated.append(entity)
> db.put(updated)
>
> By adding two lines, we've reduced the number of round trips required
> from 101 to just 2!
>
>
>
> - eric
>
>
> 2010/1/14 Patrick Twohig <patr...@namazustudios.com>:
> > So I'm looking at trying to reset large amounts of data en masse.  Say I
> > want to reset a counter on every account each week, how would I go about
> > implementing something like that?  Would I have to go through each
> object,
> > update it, and store it?  If that's the case, how do I go about doing so
> > without killing my quota or running up my usage extremely high?
> >
> > Thanks,
> > Patrick.
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> > "Google App Engine" group.
> > To post to this group, send email to google-appeng...@googlegroups.com.
> > To unsubscribe from this group, send email to
> > google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
> .
> > For more options, visit this group at
> > http://groups.google.com/group/google-appengine?hl=en.
> >
> >
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine" group.
> To post to this group, send email to google-appeng...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine?hl=en.
>
>
>
>


-- 
Patrick H. Twohig.

Namazu Studios
P.O. Box 34161
San Diego, CA 92163-4161

Office: 619.862.2890 x100
Cell: 619.453.5075
Twitter: @svm_invictvs
IRC: svm_invic...@irc.freenode.net ##java, #android-dev, #iphonedev,
#appengine

http://www.namazustudios.com/

This communication, and any attachments, shall be considered confidential
and proprietary information of Namazu Studios LLC.  This message, and
attachments, are intended for the listed recipients only.  If you are not
one of the intended recipients, please destroy all copies of this
communication.
--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To post to this group, send email to google-appeng...@googlegroups.com.
To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.

Reply via email to