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

Reply via email to