[google-appengine] Re: Retrieving Large Query Sets Containing Inequality Operators

2009-04-20 Thread djidjadji

Hi Chris,

You can do this by adding an extra attribute to the object that
contains the date and a sequence number.

The extra attribute is an IntegerProperty. It has arbitrary precision,
unlimited bit length.
If you store  (long(datetime.toordinal(myRecord.date))128)+long(sequenceNum)
you can store a lot of entities on one date, 2**128. If you set
sequenceNum starting at 1 you can use your query that sets

startDate = (long(datetime.toordinal(someDate1))128)+long(0)
endDate  = (long(datetime.toordinal(someDate2))128)+long(0)
query = Record.all().filter('dateEx ', startDate).filter('dateEx ', endDate)

if you fetch 100 objects use the value of dateEx of the last object
retrieved as the new startDate for the next batch.

When you store a new entity:
get the object with the highest value of dateEx with the same
ordinal value,
add 1L and set as the dateEx value of the new entity
This should be done in a transaction or some kind of Critical
section to ensure unique sequence numbers

2009/4/20 Chris Spencer chriss...@gmail.com:

 Thanks, but I don't see how that's relevant. Like I said, the ordering
 of an object's key has no correlation to an object's date.

 I'm not trying to simply page. That's trivial using the method listed
 in your link. What I'm trying to do is page through a set of objects
 limited by a date range.

 Chris

 2009/4/19 秦锋 feng.w@gmail.com:

 CHeck this:
 http://google-appengine.googlegroups.com/web/efficient_paging_using_key_instead_of_a_dedicated_unique_property.txt?gda=7FbhWXcAAACSStSWrftt07H4FK2Rtvurv5Qi9dmYyYZMEnTZCjCsYQQgER4RQV57mxjvIzAWBZmQ3TeCdbqm30Qz_AwgYlIpRbcWRj3jGGBm-fgbnPJIYc4-hXRRmo3Xgj6KgtSLBeZ45alvcyXc30EbEX-RNDZveV4duv6pDMGhhhZdjQlNAw

 On 4月19日, 下午12时32分, Chris chriss...@gmail.com wrote:
 I have the model:

 class Record(db.Model):
   date = db.DateProperty()

 Over 1000 Record instances may contain the same date value. The
 instances are also not created in the order of their dates.

 I'm trying to query all instances whose date is within a given range.
 I need to be able to query sets larger than the default max of 1000.

 I was thinking of doing something like:

 Record.all().filter('date ', startDate).filter('date ', endDate)

 But this would limit me at most to the first 1000 records. How would I
 get the next 1000 records, maintaining the range query? I can't use
 the last date value from the previous query as the startDate for the
 next query, since there's no guarantee that the date value has
 changed. For example, I could have 2000 instances with the date
 2008-1-1, so the first and second query sets have identical filter
 parameters.

 Intuitively, I could accomplish this by simply filtering on the
 previous key value (e.g. .filter('key ', lastKeyValue)).
 Unfortunately, App Engine currently prohibits filtering with
 inequality operators on more than one property.

 Am I correct in understanding that there's essentially no way to query
 all instances within a specific date range, due to this limitation?

 This issue keeps coming up for me, and has been a huge deal-breaker in
 a lot of potential projects I've been working on for App Engine. Any
 advice on how I could work around it would be appreciated.

 Chris
 


--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[google-appengine] Re: Retrieving Large Query Sets Containing Inequality Operators

2009-04-20 Thread Chris Spencer

Thanks, that's a good thought. I agree that it should be done in a
transaction. However, I don't believe App Engine allows you to run
queries in a transaction.

Chris

2009/4/20 djidjadji djidja...@gmail.com:

 Hi Chris,

 You can do this by adding an extra attribute to the object that
 contains the date and a sequence number.

 The extra attribute is an IntegerProperty. It has arbitrary precision,
 unlimited bit length.
 If you store  (long(datetime.toordinal(myRecord.date))128)+long(sequenceNum)
 you can store a lot of entities on one date, 2**128. If you set
 sequenceNum starting at 1 you can use your query that sets

 startDate = (long(datetime.toordinal(someDate1))128)+long(0)
 endDate  = (long(datetime.toordinal(someDate2))128)+long(0)
 query = Record.all().filter('dateEx ', startDate).filter('dateEx ', endDate)

 if you fetch 100 objects use the value of dateEx of the last object
 retrieved as the new startDate for the next batch.

 When you store a new entity:
get the object with the highest value of dateEx with the same
 ordinal value,
add 1L and set as the dateEx value of the new entity
 This should be done in a transaction or some kind of Critical
 section to ensure unique sequence numbers

 2009/4/20 Chris Spencer chriss...@gmail.com:

 Thanks, but I don't see how that's relevant. Like I said, the ordering
 of an object's key has no correlation to an object's date.

 I'm not trying to simply page. That's trivial using the method listed
 in your link. What I'm trying to do is page through a set of objects
 limited by a date range.

 Chris

 2009/4/19 秦锋 feng.w@gmail.com:

 CHeck this:
 http://google-appengine.googlegroups.com/web/efficient_paging_using_key_instead_of_a_dedicated_unique_property.txt?gda=7FbhWXcAAACSStSWrftt07H4FK2Rtvurv5Qi9dmYyYZMEnTZCjCsYQQgER4RQV57mxjvIzAWBZmQ3TeCdbqm30Qz_AwgYlIpRbcWRj3jGGBm-fgbnPJIYc4-hXRRmo3Xgj6KgtSLBeZ45alvcyXc30EbEX-RNDZveV4duv6pDMGhhhZdjQlNAw

 On 4月19日, 下午12时32分, Chris chriss...@gmail.com wrote:
 I have the model:

 class Record(db.Model):
   date = db.DateProperty()

 Over 1000 Record instances may contain the same date value. The
 instances are also not created in the order of their dates.

 I'm trying to query all instances whose date is within a given range.
 I need to be able to query sets larger than the default max of 1000.

 I was thinking of doing something like:

 Record.all().filter('date ', startDate).filter('date ', endDate)

 But this would limit me at most to the first 1000 records. How would I
 get the next 1000 records, maintaining the range query? I can't use
 the last date value from the previous query as the startDate for the
 next query, since there's no guarantee that the date value has
 changed. For example, I could have 2000 instances with the date
 2008-1-1, so the first and second query sets have identical filter
 parameters.

 Intuitively, I could accomplish this by simply filtering on the
 previous key value (e.g. .filter('key ', lastKeyValue)).
 Unfortunately, App Engine currently prohibits filtering with
 inequality operators on more than one property.

 Am I correct in understanding that there's essentially no way to query
 all instances within a specific date range, due to this limitation?

 This issue keeps coming up for me, and has been a huge deal-breaker in
 a lot of potential projects I've been working on for App Engine. Any
 advice on how I could work around it would be appreciated.

 Chris
 


 


--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[google-appengine] Re: Retrieving Large Query Sets Containing Inequality Operators

2009-04-20 Thread djidjadji

You can use a unique counter for all the entities. 2**128 is a lot.
You can use a sharded counter to generate the unique id's, it uses a
transaction.

2009/4/20 Chris Spencer chriss...@gmail.com:

 Thanks, that's a good thought. I agree that it should be done in a
 transaction. However, I don't believe App Engine allows you to run
 queries in a transaction.

 Chris

 2009/4/20 djidjadji djidja...@gmail.com:

 Hi Chris,

 You can do this by adding an extra attribute to the object that
 contains the date and a sequence number.

 The extra attribute is an IntegerProperty. It has arbitrary precision,
 unlimited bit length.
 If you store  
 (long(datetime.toordinal(myRecord.date))128)+long(sequenceNum)
 you can store a lot of entities on one date, 2**128. If you set
 sequenceNum starting at 1 you can use your query that sets

 startDate = (long(datetime.toordinal(someDate1))128)+long(0)
 endDate  = (long(datetime.toordinal(someDate2))128)+long(0)
 query = Record.all().filter('dateEx ', startDate).filter('dateEx ', 
 endDate)

 if you fetch 100 objects use the value of dateEx of the last object
 retrieved as the new startDate for the next batch.

 When you store a new entity:
get the object with the highest value of dateEx with the same
 ordinal value,
add 1L and set as the dateEx value of the new entity
 This should be done in a transaction or some kind of Critical
 section to ensure unique sequence numbers

 2009/4/20 Chris Spencer chriss...@gmail.com:

 Thanks, but I don't see how that's relevant. Like I said, the ordering
 of an object's key has no correlation to an object's date.

 I'm not trying to simply page. That's trivial using the method listed
 in your link. What I'm trying to do is page through a set of objects
 limited by a date range.

 Chris

 2009/4/19 秦锋 feng.w@gmail.com:

 CHeck this:
 http://google-appengine.googlegroups.com/web/efficient_paging_using_key_instead_of_a_dedicated_unique_property.txt?gda=7FbhWXcAAACSStSWrftt07H4FK2Rtvurv5Qi9dmYyYZMEnTZCjCsYQQgER4RQV57mxjvIzAWBZmQ3TeCdbqm30Qz_AwgYlIpRbcWRj3jGGBm-fgbnPJIYc4-hXRRmo3Xgj6KgtSLBeZ45alvcyXc30EbEX-RNDZveV4duv6pDMGhhhZdjQlNAw

 On 4月19日, 下午12时32分, Chris chriss...@gmail.com wrote:
 I have the model:

 class Record(db.Model):
   date = db.DateProperty()

 Over 1000 Record instances may contain the same date value. The
 instances are also not created in the order of their dates.

 I'm trying to query all instances whose date is within a given range.
 I need to be able to query sets larger than the default max of 1000.

 I was thinking of doing something like:

 Record.all().filter('date ', startDate).filter('date ', endDate)

 But this would limit me at most to the first 1000 records. How would I
 get the next 1000 records, maintaining the range query? I can't use
 the last date value from the previous query as the startDate for the
 next query, since there's no guarantee that the date value has
 changed. For example, I could have 2000 instances with the date
 2008-1-1, so the first and second query sets have identical filter
 parameters.

 Intuitively, I could accomplish this by simply filtering on the
 previous key value (e.g. .filter('key ', lastKeyValue)).
 Unfortunately, App Engine currently prohibits filtering with
 inequality operators on more than one property.

 Am I correct in understanding that there's essentially no way to query
 all instances within a specific date range, due to this limitation?

 This issue keeps coming up for me, and has been a huge deal-breaker in
 a lot of potential projects I've been working on for App Engine. Any
 advice on how I could work around it would be appreciated.

 Chris
 


 


 


--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[google-appengine] Re: Retrieving Large Query Sets Containing Inequality Operators

2009-04-19 Thread Barry Hunter

perhaps your question could be 'how can i do xyz given the 1000 result limit?'

basically can your task be done some other way? perhaps you can
calculate something at write time. eg if its a sum or count you want.

the limitations sometimes requires thinking outside the box!


On 19/04/2009, Chris chriss...@gmail.com wrote:

  I have the model:

  class Record(db.Model):
   date = db.DateProperty()

  Over 1000 Record instances may contain the same date value. The
  instances are also not created in the order of their dates.

  I'm trying to query all instances whose date is within a given range.
  I need to be able to query sets larger than the default max of 1000.

  I was thinking of doing something like:

  Record.all().filter('date ', startDate).filter('date ', endDate)

  But this would limit me at most to the first 1000 records. How would I
  get the next 1000 records, maintaining the range query? I can't use
  the last date value from the previous query as the startDate for the
  next query, since there's no guarantee that the date value has
  changed. For example, I could have 2000 instances with the date
  2008-1-1, so the first and second query sets have identical filter
  parameters.

  Intuitively, I could accomplish this by simply filtering on the
  previous key value (e.g. .filter('key ', lastKeyValue)).
  Unfortunately, App Engine currently prohibits filtering with
  inequality operators on more than one property.

  Am I correct in understanding that there's essentially no way to query
  all instances within a specific date range, due to this limitation?

  This issue keeps coming up for me, and has been a huge deal-breaker in
  a lot of potential projects I've been working on for App Engine. Any
  advice on how I could work around it would be appreciated.


  Chris
  



-- 
Barry

- www.nearby.org.uk - www.geograph.org.uk -

--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[google-appengine] Re: Retrieving Large Query Sets Containing Inequality Operators

2009-04-19 Thread 秦锋

CHeck this:
http://google-appengine.googlegroups.com/web/efficient_paging_using_key_instead_of_a_dedicated_unique_property.txt?gda=7FbhWXcAAACSStSWrftt07H4FK2Rtvurv5Qi9dmYyYZMEnTZCjCsYQQgER4RQV57mxjvIzAWBZmQ3TeCdbqm30Qz_AwgYlIpRbcWRj3jGGBm-fgbnPJIYc4-hXRRmo3Xgj6KgtSLBeZ45alvcyXc30EbEX-RNDZveV4duv6pDMGhhhZdjQlNAw

On 4月19日, 下午12时32分, Chris chriss...@gmail.com wrote:
 I have the model:

 class Record(db.Model):
   date = db.DateProperty()

 Over 1000 Record instances may contain the same date value. The
 instances are also not created in the order of their dates.

 I'm trying to query all instances whose date is within a given range.
 I need to be able to query sets larger than the default max of 1000.

 I was thinking of doing something like:

 Record.all().filter('date ', startDate).filter('date ', endDate)

 But this would limit me at most to the first 1000 records. How would I
 get the next 1000 records, maintaining the range query? I can't use
 the last date value from the previous query as the startDate for the
 next query, since there's no guarantee that the date value has
 changed. For example, I could have 2000 instances with the date
 2008-1-1, so the first and second query sets have identical filter
 parameters.

 Intuitively, I could accomplish this by simply filtering on the
 previous key value (e.g. .filter('key ', lastKeyValue)).
 Unfortunately, App Engine currently prohibits filtering with
 inequality operators on more than one property.

 Am I correct in understanding that there's essentially no way to query
 all instances within a specific date range, due to this limitation?

 This issue keeps coming up for me, and has been a huge deal-breaker in
 a lot of potential projects I've been working on for App Engine. Any
 advice on how I could work around it would be appreciated.

 Chris
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[google-appengine] Re: Retrieving Large Query Sets Containing Inequality Operators

2009-04-19 Thread Chris Spencer

Thanks, but I don't see how that's relevant. Like I said, the ordering
of an object's key has no correlation to an object's date.

I'm not trying to simply page. That's trivial using the method listed
in your link. What I'm trying to do is page through a set of objects
limited by a date range.

Chris

2009/4/19 秦锋 feng.w@gmail.com:

 CHeck this:
 http://google-appengine.googlegroups.com/web/efficient_paging_using_key_instead_of_a_dedicated_unique_property.txt?gda=7FbhWXcAAACSStSWrftt07H4FK2Rtvurv5Qi9dmYyYZMEnTZCjCsYQQgER4RQV57mxjvIzAWBZmQ3TeCdbqm30Qz_AwgYlIpRbcWRj3jGGBm-fgbnPJIYc4-hXRRmo3Xgj6KgtSLBeZ45alvcyXc30EbEX-RNDZveV4duv6pDMGhhhZdjQlNAw

 On 4月19日, 下午12时32分, Chris chriss...@gmail.com wrote:
 I have the model:

 class Record(db.Model):
   date = db.DateProperty()

 Over 1000 Record instances may contain the same date value. The
 instances are also not created in the order of their dates.

 I'm trying to query all instances whose date is within a given range.
 I need to be able to query sets larger than the default max of 1000.

 I was thinking of doing something like:

 Record.all().filter('date ', startDate).filter('date ', endDate)

 But this would limit me at most to the first 1000 records. How would I
 get the next 1000 records, maintaining the range query? I can't use
 the last date value from the previous query as the startDate for the
 next query, since there's no guarantee that the date value has
 changed. For example, I could have 2000 instances with the date
 2008-1-1, so the first and second query sets have identical filter
 parameters.

 Intuitively, I could accomplish this by simply filtering on the
 previous key value (e.g. .filter('key ', lastKeyValue)).
 Unfortunately, App Engine currently prohibits filtering with
 inequality operators on more than one property.

 Am I correct in understanding that there's essentially no way to query
 all instances within a specific date range, due to this limitation?

 This issue keeps coming up for me, and has been a huge deal-breaker in
 a lot of potential projects I've been working on for App Engine. Any
 advice on how I could work around it would be appreciated.

 Chris
 


--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---