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
> Objectify http://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/queriesandindexes.html#Restrictions_on_Queries
>
> "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%[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