cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Aristedes Maniatis <...@maniatis.org>
Subject Re: Third prefetch kind - DISJOINT_BY_ID
Date Mon, 30 Jan 2012 09:13:17 GMT
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

Mime
View raw message