Thanks Nick, I just wanted to make sure I wasn't missing something wrt to tuple handling and lists - your solution sounds good - cheers,
Colin On Jun 22, 11:10 am, "Nick Johnson (Google)" <nick.john...@google.com> wrote: > Hi hawkett, > > > > On Sat, Jun 20, 2009 at 3:05 PM, hawkett <hawk...@gmail.com> wrote: > > > Hi, > > > I was watching Brett's IO talk re. using 'Relational Index Tables', > > and there were a few hints of things in there, and I just wanted to > > check I got it all correctly - > > > 1. Lists are good for tuples - a use case I see is an entity being > > tagged, and having a state within that tag - so the tuples might be > > ('tagA', 'PENDING') , ('tagB', 'ACCEPTED'), ('tagC', 'DENIED') etc. - > > so the list structures would be > > > class Thing(db.Model): > > name = db.StringProperty() > > tags = db.ListProperty(str, default=[]) > > states = db.ListProperty(str, default=[]) > > > with their contents tags = ['tagA', 'tagB', 'tagC'], states = > > ['PENDING', 'ACCEPTED', 'DENIED'] > > > and as data comes and goes you maintain both lists to ensure you > > record the correct state for the correct tag by matching their list > > position. > > A much better approach is to use a single ListProperty, and serialize your > tuples to it - using Pickle, JSON, CSV, etc - whatever suits. If you want, > you can easily write a custom Datastore property class to make this easier. > This allows you to do everything you outlined below without extra effort. > > -Nick Johnson > > > > > > > 2. Relational Index Tables are good for exploding index problems - so > > the query here might be - > > "get me all the 'Things' which have 'tagA' and which are 'PENDING' in > > that tag" - i.e. all records with the tuple ('tagA, 'PENDING'), which > > would be a composite index over two list properties - an exploding > > index. > > > So assuming I've got the above right, I'm trying to work out a few > > things > > > a. Without relational index tables, what is the best way to construct > > the query - e.g. > > > things = db.GqlQuery( > > "SELECT * FROM Thing " > > "WHERE tags = :1 AND states = :2", 'tagA', 'PENDING') > > > which would get me anything that had 'tagA' at any point in the tags > > list, and anything that had a 'PENDING' at any point in the states > > list. This is potentially many more records than those that match the > > tuple. So then I have to do an in-memory cull of those records > > returned and work out which ones actually conform to the tuple? Just > > wondering if I am missing something here, because it seems like a > > great method for storing a tuple, but complex to query for that same > > tuple? > > > b. If I am going to use relational index tables, to avoid the > > exploding index that the above query could generate - > > > class Thing(db.model): > > name = db.StringProperty() > > > class ThingTagIndex(db.Model) > > tags = db.ListProperty(str, default=[]) > > > class ThingStateIndex(db.Model) > > states = db.ListProperty(str, default=[]) > > > then am I right in thinking that my query would be performed as > > > tagIndexKeys = db.GqlQuery( > > "SELECT __key__ FROM ThingTagIndex " > > "WHERE tags = :1", 'tagA') > > > # All the things that have 'tagA' in their tags list > > thingTagKeys = [k.parent() for k in tagIndexKeys] > > > stateIndexKeys = db.GqlQuery( > > "SELECT __key__ FROM ThingStateIndex " > > "WHERE states = :1 AND ANCESTOR IN :2", 'PENDING', thingTagKeys) > > > # All the things that have both 'tagA' and 'PENDING' (but not > > necessarily as a tuple) > > thingKeys = [k.parent() for k in stateIndexKeys] > > > things = db.get(thingKeys) > > > # Oops - I need the lists to do the culling part of my tuple query > > from (a) > > > So I have avoided the exploding index by performing two separate > > queries, but I could have achieved much the same result without the > > index tables - i.e. by performing separate queries and avoiding the > > composite index. Just wondering if I am seeing the tuple situation > > correctly - i.e. there is no way to query them that doesn't require > > some in-memory culling? Thanks, > > > Colin > > -- > Nick Johnson, App Engine Developer Programs Engineer > Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration Number: > 368047 --~--~---------~--~----~------------~-------~--~----~ 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-appengine@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 -~----------~----~----~----~------~----~------~--~---