Thanks Nick, I'll investigate further then.

On Mar 9, 4:11 am, "Nick Johnson (Google)" <[email protected]>
wrote:
> Hi Matt,
>
>
>
>
>
> On Mon, Mar 8, 2010 at 10:14 AM, Matt Quail <[email protected]> wrote:
> > I've been playing with the "relation index" example from Brett
> > Slatkin's "Building Scalable Web Applications" talk.
>
> > In it, he has something like the following. (These examples are using
> > Objectifyhttp://code.google.com/p/objectify-appengine/but it should
> > be pretty obvious what they are modelling.)
>
> > public class Message {
> > �...@id Long id;
> > �...@unindexed String body;
> > }
> > public class MessageIndex {
> > �...@id Long id;
> > �...@parent Key<Message> msg;
> >  ArrayList<Long> recipients; // user ids
> > }
>
> > That's all hunky dory. Getting all the messages someone has sent you
> > (all the messages where you are a recipient) proceeds using
>
> > a) a key-only query into MessageIndex,
> > b) a loop to get the parent key of each result,
> > c) a bulk get() of those parent keys.
>
> > I wanted to enhance his example to a bit more of a real twitter-like
> > use case, and to make sure the messages where you are a recipient are
> > returned in date-sorted order.
>
> > I tried this MessageIndex and composite index:
>
> > public class MessageIndex {
> > �...@id Long id;
> > �...@parent Key<Message> msg;
> >  ArrayList<Long> recipients; // user ids
> >  Date date;
> > }
> >   <datastore-index kind="MessageIndex" ancestor="false"
> > source="auto">
> >       <property name="recipients" direction="asc"/>
> >       <property name="date" direction="desc"/>
> >   </datastore-index>
>
> > And this query:
> > ofy.query(MessageIndex.class).filter("recipients",
> > user.getId()).order("-date")
>
> > The query finds the correct records, but it does not do the sort at
> > all! This behavior, I think, is hinted at here:
>
> >http://code.google.com/appengine/docs/java/datastore/queriesandindexe...
>
> > "One important caveat is queries with both an equality filter and a
> > sort order on a multi-valued property. In those queries, the sort
> > order is disregarded."
>
> > That seems to be talking about a filter and a sort on the *same*
> > multi-valued  property, whereas I am sorting on a separate value.
>
> > So, if anyone has any hints, my questions are:
>
> > 1) Am I just doing something wrong, and in fact a
> > filter-on-list-property plus a sort-on-date-property is possible?
>
> This sort of query is perfectly possible. I suspect a bug in the library
> you're using; to determine if that's the case for certain, you'd need to log
> the actual datastore query being made, using RPC call hooks 
> (http://blog.notdot.net/2009/11/App-Engine-Java-API-call-hooks).
>
>
>
>
>
>
>
> > 2) Or, is this the expected behaviour.
>
> > 3) I've got an idea to work around this problem, by appending the
> > recipients and the dates into the one list property, and using
> > inequality filters, e.g.
>
> > public class MessageIndex {
> > �...@id Long id;
> > �...@parent Key<Message> msg;
> >  ArrayList<String> recipientDates;
> > }
>
> > // create a new MessageIndex
> > for each recipient:
> >  long reverseDate = Long.MAX_VALUE - date;
> >  messageIndex.recipientDates.add(recipient + ":" + reverseDate);
>
> > // search for messages to recipient R
> > ofy.query(MessageIndex.class)
> > .filter("recipientDates>", recipient + ":")
> > .filter("recipientDates<", recipient + ":\uFFFd");
>
> > I think that would work? But you would end up with a huge number of
> > unique values in the recipientDates index -- one per recipient per
> > message. But writes to indexes happen in parallel, so as long as one
> > is happy paying for the space... shrug.
>
> > Thanks in advance for any advice,
>
> > =Matt
>
> > --
> > 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.
>
> --
> Nick Johnson, Developer Programs Engineer, App Engine
> 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 [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.

Reply via email to