On Tue, Jun 23, 2009 at 3:27 PM, herbie <4whi...@o2.co.uk> wrote:

>
> Oh, really? That limits my app somewhat.   I asume if I have no
> inequality filtres and order by date I will get the latest entities?
>
> I could then filter these in memory for x > threshold


Correct.

-Nick Johnson


>
>
>
> On Jun 23, 1:50 pm, "Nick Johnson (Google)" <nick.john...@google.com>
> wrote:
> > Hi herbie,
> >
> > If your query includes an inequality (such as x>50), then your first sort
> > order has to be on the same property as that inequality, which means you
> > can't (directly) fetch the most recent 200 results with x>50. You either
> > need to change your query to use only equality filters, or you need to
> fetch
> > extra results, then sort them in memory and only take the most recent
> ones.
> >
> > -Nick Johnson
> >
> >
> >
> > On Tue, Jun 23, 2009 at 1:44 PM, herbie <4whi...@o2.co.uk> wrote:
> >
> > > Thanks for your help Nick.
> >
> > > No my threshold value 'x' isn't constant.   I still havn't got my head
> > > round this yet!   Can you tell me how to get the latest entities
> > > (assuming I don't want all of them)   out of the datastore  and filter
> > > on another property?
> >
> > > For example:  Get the latest 200 entities  where x > 50.   I don't
> > > care what their 'date's are as long as I get the latest and x > 50.
> >
> > > On Jun 23, 1:16 pm, "Nick Johnson (Google)" <nick.john...@google.com>
> > > wrote:
> > > > On Tue, Jun 23, 2009 at 12:42 PM, herbie <4whi...@o2.co.uk> wrote:
> >
> > > > > So will this :
> > > > > query = Foo.all().filter("property_x >" 50).order("property_x")
> .order
> > > > > ("-timestamp")
> > > > > results = query.fetch(200)
> >
> > > > > ..get the latest entities where property_x > 50 ?  Or will it get
> the
> > > > > 200 properties with the largest 'property_x'  which are then
> ordered
> > > > > by 'timestamp' ?   A subtle but important difference.
> >
> > > > It will get the 200 entities with the smallest property_x greater
> than 50
> > > > (since you're filtering >50 and ordering first by property_x). If two
> > > > entities have the same value for property_x, they will be sorted by
> > > > timestamp, descending.
> >
> > > > If you need the latest, and your threshold of 50 is a constant, you
> can
> > > add
> > > > a BooleanProperty to your entity group encoding the condition 'is
> greater
> > > > than 50', and filter on that using an equality filter.
> >
> > > > -Nick Johnson
> >
> > > > > As I said I need make sure I get the latest entities.
> >
> > > > > On Jun 22, 11:33 pm, Tony <fatd...@gmail.com> wrote:
> > > > > > Yes, that is what it means.  I forgot about that restriction.
> >
> > > > > > I see what you mean about changing 'x' values.  Perhaps consider
> > > > > > keeping two counts - a running sum and a running count (of the #
> of x
> > > > > > properties).  If a user modifies an 'x' value, you can adjust the
> sum
> > > > > > up or down accordingly.
> >
> > > > > > On Jun 22, 5:40 pm, herbie <4whi...@o2.co.uk> wrote:
> >
> > > > > > > I tried your query below but I get "BadArgumentError: First
> > > ordering
> > > > > > > property must be the same as inequality filter property, if
> > > specified
> > > > > > > for this query;"
> > > > > > > Does this mean I have to order on 'x' first, then order on
> 'date'?
> > > > > > > Will this still return the latest 200 of all entities with x >
> 50
> > > if
> > > > > > > I  call query.fetch(200)?
> >
> > > > > > > I take your's and Nick's about keeping a 'running average'.
> But
> > > in
> > > > > > > my example the user can change the 'x' value so the average has
> to
> > > be
> > > > > > > recalculated from the latest entities.
> >
> > > > > > > On Jun 22, 9:46 pm, Tony <fatd...@gmail.com> wrote:
> >
> > > > > > > > You could accomplish this task like so:
> >
> > > > > > > > xlist = []
> > > > > > > > query = Foo.all().filter("property_x >"
> 50).order("-timestamp")
> > > > > > > > for q in query:
> > > > > > > >   xlist.append(q.property_x)
> > > > > > > > avg = sum(xlist) / len(xlist)
> >
> > > > > > > > What Nick is saying, I think, is that fetching 1000 entities
> is
> > > going
> > > > > > > > to be very resource-intensive, so a better way to do it is to
> > > > > > > > calculate this data at write-time instead of read-time.  For
> > > example,
> > > > > > > > every time you add an entity, you could update a separate
> entity
> > > that
> > > > > > > > has a property like "average = db.FloatProperty()" with the
> > > current
> > > > > > > > average, and then you could simply fetch that entity and get
> the
> > > > > > > > current running average.
> >
> > > > > > > > On Jun 22, 4:25 pm, herbie <4whi...@o2.co.uk> wrote:
> >
> > > > > > > > > Ok. Say I have many (>1000)  Model entities with two
> properties
> > > 'x'
> > > > > > > > > and 'date'.    What is the most efficient query to fetch
> say
> > > the
> > > > > > > > > latest 200 entities  where x > 50.   I don't care what
> their
> > > > > 'date's
> > > > > > > > > are as long as I get the latest and x > 50
> >
> > > > > > > > > Thanks again for your help.
> >
> > > > > > > > > On Jun 22, 4:11 pm, "Nick Johnson (Google)" <
> > > > > nick.john...@google.com>
> > > > > > > > > wrote:
> >
> > > > > > > > > > Consider precalculating this data and storing it against
> > > another
> > > > > entity.
> > > > > > > > > > This will save a lot of work on requests.
> >
> > > > > > > > > > -Nick Johnson
> >
> > > > > > > > > > On Mon, Jun 22, 2009 at 3:55 PM, herbie <
> 4whi...@o2.co.uk>
> > > > > wrote:
> >
> > > > > > > > > > > No the users won't need to read 1000 entities, but I
> want
> > > to
> > > > > calculate
> > > > > > > > > > > the average of a  property from the latest 1000
> entities.
> >
> > > > > > > > > > > On Jun 22, 3:30 pm, "Nick Johnson (Google)" <
> > > > > nick.john...@google.com>
> > > > > > > > > > > wrote:
> > > > > > > > > > > > Correct. Are you sure you need 1000 entities, though?
> > > Your
> > > > > users probably
> > > > > > > > > > > > won't read through all 1000.
> >
> > > > > > > > > > > > -Nick Johnson
> >
> > > > > > > > > > > > On Mon, Jun 22, 2009 at 3:23 PM, herbie <
> > > 4whi...@o2.co.uk>
> > > > > wrote:
> >
> > > > > > > > > > > > > So to be sure to get the latest 1000 entities I
> should
> > > add
> > > > > a datetime
> > > > > > > > > > > > > property to my entitie model and filter and sort on
> > > that?
> >
> > > > > > > > > > > > > On Jun 22, 1:42 pm, herbie <4whi...@o2.co.uk>
> wrote:
> > > > > > > > > > > > > > I know that if there are more than 1000 entities
> that
> > > > > match a query,
> > > > > > > > > > > > > > then only 1000 will  be return by fetch().  But
> my
> > > > > question is which
> > > > > > > > > > > > > > 1000? The last 1000 added to the datastore?  The
> > > first
> > > > > 1000 added to
> > > > > > > > > > > > > > the datastore? Or is it undedined?
> >
> > > > > > > > > > > > > > Thanks
> > > > > > > > > > > > > > Ian
> >
> > > > > > > > > > > > --
> > > > > > > > > > > > Nick Johnson, App Engine Developer Programs Engineer
> > > > > > > > > > > > Google Ireland Ltd. :: Registered in Dublin, Ireland,
> > > > > Registration
> > > > > > > > > > > Number:
> > > > > > > > > > > > 368047
> >
> > > > > > > > > > --
> > > > > > > > > > Nick Johnson, App Engine Developer Programs Engineer
> > > > > > > > > > Google Ireland Ltd. :: Registered in Dublin, Ireland,
> > > > > Registration Number:
> > > > > > > > > > 368047
> >
> > > > --
> > > > Nick Johnson, App Engine Developer Programs Engineer
> > > > Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration
> > > Number:
> > > > 368047
> >
> > --
> > Nick Johnson, App Engine Developer Programs Engineer
> > Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration
> Number:
> > 368047
> >
>


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

Reply via email to