On Mon Jan 30 19:37:54 2012, Andrus Adamchik wrote:
I keep encountering a common scenario where neither JOINT or DISJOINT prefetch strategies are 
adequate - queries with fetch limit. It is very common in the application to display X most recent 
entries from a table with millions of rows, and then drill down to the object details. E.g. assume 
2 entities - "Order" and "LineItem", with orders having multiple line items. We 
want 10 most recent orders, with line items prefetched, so you'd so something like this:

   SelectQuery q = new SelectQuery(Order.class);
   q.addPrefetch("lineItems");
   q.setFetchLimit(10);

"Disjoint" prefetch in this situation would fetch 10 orders and ALL LineItems 
in DB.

"Joint" prefetch will fetch anywhere between 1 and 10 orders, depending on how 
many line items the first 10 orders have, i.e. fetch limit is applied to to-many join, 
not to the query root. And this is certainly not what we want.

Now Cayenne already has something that can solve the problem:

  q.setPageSize(10); // same as fetch limit

Paginated query is the most optimal way to prefetch here. Whenever a result 
list is accessed, Cayenne would execute 2 IN () queries - one for the Orders, 
another one - for the LineItems. Both queries are matching on a set of Order 
PKs and are pretty efficient, and only return the objects that we care about.

The problem with this solution is that it is counterintuitive to the user (why should I set 
"pageSize" to make my prefetches work) and adds one extra query (the IN query resolving 
the root object list). Would be cool to turn it into a separate type of prefetch.  Something like 
"disjoint by id"?

Andrus




Isn't this just a bug in the old DISJOINT approach rather than a new type of prefetch? What is the use-case for fetching all related records in the database when you have a fetch limit?

I don't really know since we have found pagination so much more useful and powerful than fetchLimit.

Ari

--
-------------------------->
Aristedes Maniatis
GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A

Reply via email to