cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Gentry <mgen...@masslight.net>
Subject Re: querying vs using relationship list and iterate
Date Tue, 08 Jun 2010 15:32:47 GMT
Both require a trip to the DB.

#1 requires a trip one time to the DB to fault the groups from the DB,
but then it'll be in memory.

#2 requires a trip to the DB every time, so that could be slower in
the long run even though it returns fewer matches.

If this is something that only happens once and you are REALLY
concerned about performance (and possibly have a LOT of groups), I'd
go with #2, otherwise #1.  You can optimize #1 a bit, too, so you
don't have to iterate each time to check.

mrg


On Tue, Jun 8, 2010 at 11:11 AM, Nishant Neeraj
<nishant.has.a.question@gmail.com> wrote:
> Thanks Michael for the quick response.
>
> I was wondering which one will be less costlier to do? A join query(#2), or
> iterating over objects(#1)? And isn't iterating over objects need to pull
> each object from database before they can be compared?
>
> Thanks
> Nishant
>
> On Tue, Jun 8, 2010 at 8:25 PM, Michael Gentry <mgentry@masslight.net>wrote:
>
>> #2 won't work the way you want.  It would need to be more along the lines
>> of:
>>
>> user = $testUser and user.memberships.group = $group
>>
>>
>> I've tended to use something closer to #1, but encapsulate it in my
>> User.java class as something like:
>>
>> public boolean isInGroup(String groupName)
>> {
>>    for (Group g : getMemberships().getGroups())
>>        if (groupName.equals(g.getName())
>>            return true;
>>    return false;
>> }
>>
>> That's pseudocode and unlikely to work, but should give you the
>> general idea.  You can then say:
>>
>> if (myUser.isInGroup(testGroupName)) {...}
>>
>>
>> Thanks,
>>
>> mrg
>>
>>
>> On Tue, Jun 8, 2010 at 10:41 AM, Nishant Neeraj
>> <nishant.has.a.question@gmail.com> wrote:
>> > Hi,
>> >
>> > I have three tables USERS, MEMBERSHIPS, GROUPS -- where membership is a
>> > linking table that joins users and groups in many-to-many relationship,
>> and
>> > also stores users' role in the group.
>> >
>> > Sometime when I need to know whether a user exists in a group [or what
>> role
>> > a user has in a group], I can do it by two ways:
>> >
>> > 1. groups.getMembershipList() and iterate over the list inflating each
>> > member and comparing with the User object that is on test. like
>> >
>> > for(Membership m: g.getMembershipList())
>> > {
>> >   if(m.getUser().equals(testUser)
>> >       return true;
>> > }
>> >
>> > Or.
>> >
>> > 2. I can just write a query using Expression.
>> >
>> > Expression.forString(Membership.class, "user = $testUser and
>> group=$group");
>> >
>> >
>> > Can someone suggest which one is better approach? Or, is there a even
>> better
>> > third approach?
>> >
>> > Thanks
>> > Nishant
>> >
>>
>

Mime
View raw message