Skip to content

Commit 19e13e0

Browse files
Fix alias join on join
Fixes #1928
1 parent 7ea063e commit 19e13e0

File tree

5 files changed

+183
-7
lines changed

5 files changed

+183
-7
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using NHibernate.Criterion;
12+
using NUnit.Framework;
13+
14+
namespace NHibernate.Test.NHSpecificTest.GH1928
15+
{
16+
using System.Threading.Tasks;
17+
[TestFixture]
18+
public class FixtureAsync : BugTestCase
19+
{
20+
protected override void OnSetUp()
21+
{
22+
using (var session = OpenSession())
23+
using (var transaction = session.BeginTransaction())
24+
{
25+
var ez = new EntityZ { Name = "Bob" };
26+
session.Save(ez);
27+
var ey = new EntityY { Z = ez };
28+
session.Save(ey);
29+
var ex = new EntityX { Y = ey };
30+
session.Save(ex);
31+
32+
ez = new EntityZ { Name = "Sally" };
33+
session.Save(ez);
34+
ey = new EntityY { Z = ez };
35+
session.Save(ey);
36+
ex = new EntityX { Y = ey };
37+
session.Save(ex);
38+
39+
transaction.Commit();
40+
}
41+
}
42+
43+
protected override void OnTearDown()
44+
{
45+
using (var session = OpenSession())
46+
using (var transaction = session.BeginTransaction())
47+
{
48+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
49+
50+
transaction.Commit();
51+
}
52+
}
53+
54+
[Test]
55+
public async Task JoinAliasOnJoinAsync()
56+
{
57+
using (var session = OpenSession())
58+
using (session.BeginTransaction())
59+
{
60+
EntityZ aliasZ = null;
61+
var result = await (session
62+
.QueryOver<EntityX>()
63+
.Inner.JoinQueryOver(x => x.Y)
64+
.Inner.JoinAlias(y => y.Z, () => aliasZ)
65+
.Select(Projections.Entity(() => aliasZ))
66+
.ListAsync<EntityZ>());
67+
68+
Assert.That(result, Has.Count.EqualTo(2));
69+
}
70+
}
71+
}
72+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.GH1928
4+
{
5+
class EntityX
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual EntityY Y { get; set; }
9+
}
10+
11+
class EntityY
12+
{
13+
public virtual Guid Id { get; set; }
14+
public virtual EntityZ Z { get; set; }
15+
}
16+
17+
class EntityZ
18+
{
19+
public virtual Guid Id { get; set; }
20+
public virtual string Name { get; set; }
21+
}
22+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using NHibernate.Criterion;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.NHSpecificTest.GH1928
5+
{
6+
[TestFixture]
7+
public class Fixture : BugTestCase
8+
{
9+
protected override void OnSetUp()
10+
{
11+
using (var session = OpenSession())
12+
using (var transaction = session.BeginTransaction())
13+
{
14+
var ez = new EntityZ { Name = "Bob" };
15+
session.Save(ez);
16+
var ey = new EntityY { Z = ez };
17+
session.Save(ey);
18+
var ex = new EntityX { Y = ey };
19+
session.Save(ex);
20+
21+
ez = new EntityZ { Name = "Sally" };
22+
session.Save(ez);
23+
ey = new EntityY { Z = ez };
24+
session.Save(ey);
25+
ex = new EntityX { Y = ey };
26+
session.Save(ex);
27+
28+
transaction.Commit();
29+
}
30+
}
31+
32+
protected override void OnTearDown()
33+
{
34+
using (var session = OpenSession())
35+
using (var transaction = session.BeginTransaction())
36+
{
37+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
38+
39+
transaction.Commit();
40+
}
41+
}
42+
43+
[Test]
44+
public void JoinAliasOnJoin()
45+
{
46+
using (var session = OpenSession())
47+
using (session.BeginTransaction())
48+
{
49+
EntityZ aliasZ = null;
50+
var result = session
51+
.QueryOver<EntityX>()
52+
.Inner.JoinQueryOver(x => x.Y)
53+
.Inner.JoinAlias(y => y.Z, () => aliasZ)
54+
.Select(Projections.Entity(() => aliasZ))
55+
.List<EntityZ>();
56+
57+
Assert.That(result, Has.Count.EqualTo(2));
58+
}
59+
}
60+
}
61+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test"
3+
namespace="NHibernate.Test.NHSpecificTest.GH1928">
4+
5+
<class name="EntityX">
6+
<id name="Id" generator="guid.comb"/>
7+
<many-to-one name="Y"/>
8+
</class>
9+
10+
<class name="EntityY">
11+
<id name="Id" generator="guid.comb"/>
12+
<many-to-one name="Z"/>
13+
</class>
14+
15+
<class name="EntityZ">
16+
<id name="Id" generator="guid.comb"/>
17+
<property name="Name"/>
18+
</class>
19+
20+
</hibernate-mapping>

src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -418,15 +418,16 @@ private void CreateAssociationPathCriteriaMap()
418418
foreach (var crit in rootCriteria.IterateSubcriteria())
419419
{
420420
var wholeAssociationPath = GetWholeAssociationPath(crit, out var parentAlias);
421-
if (parentAlias != null)
421+
if (parentAlias == null)
422+
parentAlias = rootCriteria.Alias;
423+
424+
if (!associationAliasToChildrenAliasesMap.TryGetValue(parentAlias, out var children))
422425
{
423-
if (!associationAliasToChildrenAliasesMap.TryGetValue(parentAlias, out var children))
424-
{
425-
children = new HashSet<string>();
426-
associationAliasToChildrenAliasesMap.Add(parentAlias, children);
427-
}
428-
children.Add(crit.Alias);
426+
children = new HashSet<string>();
427+
associationAliasToChildrenAliasesMap.Add(parentAlias, children);
429428
}
429+
children.Add(crit.Alias);
430+
430431
var key = new AliasKey(crit.Alias, wholeAssociationPath);
431432
try
432433
{

0 commit comments

Comments
 (0)