Re: prefetch bug

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Apr 29 2005 - 16:23:55 EDT

  • Next message: Cris Daniluk: "RE: LOW SPAM: Re: prefetch bug"

    Sorry, didn't have time to look at it closely. A customer project deadline
    is May 9 so I am only participating in discussions that require no brain
    power :-)

    Anyway ... I thought this was a problem with new 1.2 "joint prefetches"
    only (http://objectstyle.org/confluence/display/CAY/Joint+Prefetches), but
    not the regular prefetches. You demonstrate that this is not the case.
    Lets open a bug report and see how we can handle it (I guess we'll start
    with #1 + #2 and then move to #3).

    Andrus

    > I hate to cross-post this, but I've done some more tinkering and I'm
    > pretty sure this qualifies as a serious bug in the way prefetches are
    > currently handled.
    >
    > The problem is that if you perform a prefetch on a relationship that is
    > also part of a query expression, the prefetched relationship is
    > incorrectly filtered. This is dangerous because the query root is
    > returned in a COMMITTED state with no relationship fault, giving the
    > impression that it accurately represents what is in the repository. As
    > far as I can tell, there is no indication that the relationship is
    > potentially incomplete, nor is there a way to fill in the "gaps".
    >
    > Since the current way prefetches are handled works as long as the
    > query expression does not overlap, I see a couple of ways to handle
    > this...
    >
    > 1. The prefetch could be removed (with a WARN log event)
    >
    > 2. The relationship could be left as a fault, with the objects that were
    > prefetched pre-resolved
    >
    > 3. A subselect (or select ... in) could be used on supported database
    > adapters.
    >
    > To me, the latter option is ideal, but I'm not sure if all of the DBMS
    > support it.
    > ---------- Forwarded message ----------
    > From: Cris Daniluk <cris.danilu..mail.com>
    > Date: Apr 28, 2005 1:53 PM
    > Subject: filtered prefetches
    > To: cayenne-use..bjectstyle.org
    >
    >
    > I'm currently using an expression to query for Users based on Roles
    > (through a UserRole join table) as such:
    >
    > SelectQuery userSearchQuery = new SelectQuery(User.class,
    > ExpressionFactory.matchExp("toUserRole.toRoleArray", searchRole));
    > userSearchQuery.addPrefetch("toUserRole");
    >
    > The search works as expected, but the prefetch does not. Cayenne is
    > applying the Expression from the base query to the prefetch:
    >
    > SELECT DISTINCT t0.TX_FIRST_NAME, t0.TX_LAST_NAME, t0.TX_LOGIN_NAME,
    > t0.NU_USER_ID FROM USER t0, USER_ROLE t1 WHERE t0.NU_USER_ID
    > t1.NU_USER_ID AND ((t1.NU_ROLE_ID = ?) AND (UPPER(t0.TX_LOGIN_NAME) LIKE
    > UPPER(?))) [bind: 0, 'cris']
    > === returned 1 row. - took 141 ms.
    > SELECT t0.NU_ROLE_ID, t0.NU_USER_ID FROM USER_ROLE t0, USER t1 WHERE
    > t0.NU_USER_ID = t1.NU_USER_ID AND ((t0.NU_ROLE_ID = ?) AND
    > (UPPER(t1.TX_LOGIN_NAME) LIKE UPPER(?))) [bind: 0, 'cris']
    > === returned 1 row. - took 93 ms.
    >
    > The prefetch should contain all roles for the matching users, not just
    > the ones that were used in selecting the user. The behavior makes
    > sense based on how prefetches were done, but this really seems like a
    > bug to me...
    >
    > Cris



    This archive was generated by hypermail 2.0.0 : Fri Apr 29 2005 - 16:23:57 EDT