Hi Eli, Thanks for your input. This is a clever solution to the case I brought up. However, this actually won't work for me, because I actually need to accomodate for three different queries, each with a different sort order.
On Jan 12, 8:05 am, Eli Jones <[email protected]> wrote: > If the key_name for Entries doesn't need to be static.. and the stat1 value > does not change "very often".. and you don't depend on .get_by_key_name().. > I believe you could just prepend a zero padded version of stat1 to the > Entries key_name like so: > > new_key_name = stat1.rjust(10,'0') + '_' + old_key_name > > Then you should be able to do queries like: > > Select * From Entries Where campaigns = :1 AND stat3_categories = :2 AND > owners_saved = :3 Order By __key__ > > I have left out the details of exactly how you will determine what base > key_name to use when an Entity is first created. > > I have also left out the details of how you will handle the changing of the > key_name whenever stat1 changes. (I'd guess just do it in a transaction) > > I also do not know if this works on ListProperties.. I only know that you > can use it with regular single valued properties.. to get sorting "for free" > without needing to create a compound index. (I have an entity model that > does not change after it is created.. so I just make the __key__ begin with > a zero padded version of whatever I want to sort by.) > > > > > > > > On Tue, Jan 11, 2011 at 9:34 PM, Bill Edwards <[email protected]> wrote: > > I recently watched a Google I/O Talk regarding exploding indexes, and > > realized that the application that I am currently developing has > > queries that are susceptible to this problem. Try as I might, I can't > > think of a good way to resolve my problem, so I was hoping to get some > > input. > > > My database model is as follows: > > > class Entries(db.Model): > > campaigns = db.ListProperty(db.Key) > > owners = db.ListProperty(db.Key) > > owners_saved = db.ListProperty(db.Key) > > owners_unsaved = db.ListProperty(db.Key) > > parent_entries = db.StringListProperty() > > entry = db.StringProperty() > > stat1 = db.IntegerProperty(default = 0) > > stat2 = db.FloatProperty() > > stat3 = db.FloatProperty() > > stat3_categories= db.StringListProperty() > > > I am attempting to do queries such as: > > SELECT * FROM Entries WHERE campaigns=:1 and stat3_categories=:2 and > > owners_saved=:3 ORDER BY stat1 > > > The problem is rooted in the fact that length of the campaigns and > > owners_saved list can potentially grow into the hundreds and > > stat3_categories can be up to 40 elements long. > > > I have read other threads in relation to solutions for this problem. > > One solution that comes up is to remove the sort from the query. > > However, each query results in thousands of results, and I am only > > retrieving 10 at a time (and displaying the results in paged format). > > > Are there other ideas on how to resolve this type of exploding index > > issue? > > > -- > > 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]<google-appengine%2Bunsubscrib > > [email protected]> > > . > > 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 [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.
