[ 
https://issues.apache.org/jira/browse/CAY-2521?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vital Zanko updated CAY-2521:
-----------------------------
    Description: 
As an example, there are three tables: issue, team, location. There are some 
relationships among them:
 * issue.home_team_id = team.id
 * issue.location_id = location.id
 * location.team_id = team.id
 * team.home_location_id = location.id

!disjoint issue.png!
{code:java}
Team team = Cayenne.objectForPK(localContext, Team.class, 1);
                
SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
ExpressionFactory.exp("homeTeam = 1"));

select.addPrefetch(Issue.HOME_TEAM.disjoint());
select.addPrefetch(Issue.LOCATION.disjoint());
select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjoint());

List<Issue> issues = localContext.select(select);
{code}
This causes following sql query for prefetched team's home location objects 
which doesn't correlate with the expression (it shouldn't be applied on): 
{code:java}
[05/Feb/2019:09:36:37,102] bootique-http-41 u=user1 INFO  
o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
t0 WHERE t0.id = ? [bind: 1->id:1]
[05/Feb/2019:09:36:37,104] bootique-http-41 u=user1 INFO  
o.a.c.l.JdbcEventLogger: === returned 0 rows. - took 3 ms.
{code}
 

The issue will be resolved when Object Id is being used as a parameter in the 
expression:
{code:java}
SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
ExpressionFactory.exp("homeTeam = $id" , (Object) team.getObjectId()));
// some custom code
select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjoint());

List<Issue> issues = localContext.select(select);{code}
{code:java}
[05/Feb/2019:09:56:25,087] bootique-http-34 u=user1 INFO  
o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
t0 JOIN mydb.team t1 ON (t0.id = t1.home_location_id) WHERE t1.id = ? [bind: 
1->id:1]
[05/Feb/2019:09:56:25,100] bootique-http-34 u=user1 INFO  
o.a.c.l.JdbcEventLogger: === returned 1 row. - took 13 ms.{code}
 

Or the issue will be also resolved in case of expression without object id when 
java code declares _disjoint by id_
{code:java}
SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
ExpressionFactory.exp("homeTeam = 1"));
// some custom code
select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjointById());

List<Issue> issues = localContext.select(select);
{code}
{code:java}
[05/Feb/2019:09:59:23,605] bootique-http-36 u=user1 INFO  
o.a.c.l.JdbcEventLogger: --- transaction started.
[05/Feb/2019:09:59:23,606] bootique-http-36 u=user1 INFO  
o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
t0 WHERE t0.id = ? [bind: 1->id:71]
[05/Feb/2019:09:59:23,609] bootique-http-36 u=user1 INFO  
o.a.c.l.JdbcEventLogger: === returned 1 row. - took 4 ms.
{code}

  was:
As an example, there are three tables: issue, team, location. There are some 
relationships among them:
 * issue.home_team_id = team.id
 * issue.location_id = location.id
 * location.team_id = team.id
 * team.home_location_id = location.id

!disjoint issue.png!
{code:java}
Team team = Cayenne.objectForPK(localContext, Team.class, 1);
                
SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
ExpressionFactory.exp("homeTeam = 1"));

select.addPrefetch(Issue.HOME_TEAM.disjoint());
select.addPrefetch(Issue.LOCATION.disjoint());
select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjoint());

List<Issue> issues = localContext.select(select);
{code}
This causes following sql query for prefetched team's home location objects 
which doesn't correlate with the expression (it shouldn't be applied on): 
{code:java}
[05/Feb/2019:09:36:37,102] bootique-http-41 u=user1 INFO  
o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
t0 WHERE t0.id = ? [bind: 1->id:1]
[05/Feb/2019:09:36:37,104] bootique-http-41 u=user1 INFO  
o.a.c.l.JdbcEventLogger: === returned 0 rows. - took 3 ms.
{code}
 

The issue will be resolved when Object Id is being used as a parameter in the 
expression:
{code:java}
SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
ExpressionFactory.exp("homeTeam = $id" , (Object) team.getObjectId()));
// some custom code
select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjoint());

List<Issue> issues = localContext.select(select);{code}
{code:java}
[05/Feb/2019:09:56:25,087] bootique-http-34 u=user1 INFO  
o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
t0 JOIN mydb2.team t1 ON (t0.id = t1.home_location_id) WHERE t1.id = ? [bind: 
1->id:1]
[05/Feb/2019:09:56:25,100] bootique-http-34 u=user1 INFO  
o.a.c.l.JdbcEventLogger: === returned 1 row. - took 13 ms.{code}
 

Or the issue will be also resolved in case of expression without object id when 
java code declares _disjoint by id_
{code:java}
SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
ExpressionFactory.exp("homeTeam = 1"));
// some custom code
select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjointById());

List<Issue> issues = localContext.select(select);
{code}
{code:java}
[05/Feb/2019:09:59:23,605] bootique-http-36 u=user1 INFO  
o.a.c.l.JdbcEventLogger: --- transaction started.
[05/Feb/2019:09:59:23,606] bootique-http-36 u=user1 INFO  
o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
t0 WHERE t0.id = ? [bind: 1->id:71]
[05/Feb/2019:09:59:23,609] bootique-http-36 u=user1 INFO  
o.a.c.l.JdbcEventLogger: === returned 1 row. - took 4 ms.
{code}


> Expression without Object ID disjoint issue
> -------------------------------------------
>
>                 Key: CAY-2521
>                 URL: https://issues.apache.org/jira/browse/CAY-2521
>             Project: Cayenne
>          Issue Type: Bug
>    Affects Versions: 4.0, 4.0.1
>            Reporter: Vital Zanko
>            Priority: Major
>         Attachments: disjoint issue.png
>
>
> As an example, there are three tables: issue, team, location. There are some 
> relationships among them:
>  * issue.home_team_id = team.id
>  * issue.location_id = location.id
>  * location.team_id = team.id
>  * team.home_location_id = location.id
> !disjoint issue.png!
> {code:java}
> Team team = Cayenne.objectForPK(localContext, Team.class, 1);
>               
> SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
> ExpressionFactory.exp("homeTeam = 1"));
> select.addPrefetch(Issue.HOME_TEAM.disjoint());
> select.addPrefetch(Issue.LOCATION.disjoint());
> select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjoint());
> List<Issue> issues = localContext.select(select);
> {code}
> This causes following sql query for prefetched team's home location objects 
> which doesn't correlate with the expression (it shouldn't be applied on): 
> {code:java}
> [05/Feb/2019:09:36:37,102] bootique-http-41 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
> t0 WHERE t0.id = ? [bind: 1->id:1]
> [05/Feb/2019:09:36:37,104] bootique-http-41 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: === returned 0 rows. - took 3 ms.
> {code}
>  
> The issue will be resolved when Object Id is being used as a parameter in the 
> expression:
> {code:java}
> SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
> ExpressionFactory.exp("homeTeam = $id" , (Object) team.getObjectId()));
> // some custom code
> select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjoint());
> List<Issue> issues = localContext.select(select);{code}
> {code:java}
> [05/Feb/2019:09:56:25,087] bootique-http-34 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
> t0 JOIN mydb.team t1 ON (t0.id = t1.home_location_id) WHERE t1.id = ? [bind: 
> 1->id:1]
> [05/Feb/2019:09:56:25,100] bootique-http-34 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: === returned 1 row. - took 13 ms.{code}
>  
> Or the issue will be also resolved in case of expression without object id 
> when java code declares _disjoint by id_
> {code:java}
> SelectQuery<Issue> select = new SelectQuery<>(Issue.class, 
> ExpressionFactory.exp("homeTeam = 1"));
> // some custom code
> select.addPrefetch(Issue.HOME_TEAM.dot(Team.HOME_LOCATION).disjointById());
> List<Issue> issues = localContext.select(select);
> {code}
> {code:java}
> [05/Feb/2019:09:59:23,605] bootique-http-36 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: --- transaction started.
> [05/Feb/2019:09:59:23,606] bootique-http-36 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: SELECT t0.name, t0.id, t0.team_id FROM mydb.location 
> t0 WHERE t0.id = ? [bind: 1->id:71]
> [05/Feb/2019:09:59:23,609] bootique-http-36 u=user1 INFO  
> o.a.c.l.JdbcEventLogger: === returned 1 row. - took 4 ms.
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to