[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  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  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 秦锋 :
>
> 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  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

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 :
>
> 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 秦锋 :
>>
>> 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  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 :
>
> 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 :
>>
>> 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 秦锋 :
>>>
>>> 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  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 :
>
> 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 :
>>
>> 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 :
>>>
>>> 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 秦锋 :

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