Skip to content

Commit 4cee217

Browse files
committed
Add property fetch support for cross join
1 parent b57e654 commit 4cee217

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99

1010

1111
using System;
12+
using System.Collections.Generic;
1213
using System.Linq;
1314
using NHibernate.Cache;
1415
using NHibernate.Cfg;
1516
using NHibernate.Hql.Ast.ANTLR;
1617
using NHibernate.Linq;
1718
using NUnit.Framework;
19+
using NUnit.Framework.Constraints;
1820
using Environment = NHibernate.Cfg.Environment;
1921

2022
namespace NHibernate.Test.FetchLazyProperties
@@ -943,6 +945,37 @@ public async Task TestFetchAfterEntityIsInitializedAsync(bool readOnly)
943945
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True);
944946
}
945947

948+
[Test]
949+
public async Task TestHqlCrossJoinFetchFormulaAsync()
950+
{
951+
var persons = new List<Person>();
952+
var bestFriends = new List<Person>();
953+
using (var sqlSpy = new SqlLogSpy())
954+
using (var s = OpenSession())
955+
{
956+
var list = await (s.CreateQuery("select p, bf from Person p cross join Person bf fetch bf.Formula where bf.Id = p.BestFriend.Id").ListAsync<object[]>());
957+
foreach (var arr in list)
958+
{
959+
persons.Add((Person) arr[0]);
960+
bestFriends.Add((Person) arr[1]);
961+
}
962+
}
963+
964+
AssertPersons(persons, false);
965+
AssertPersons(bestFriends, true);
966+
967+
void AssertPersons(List<Person> results, bool fetched)
968+
{
969+
foreach (var person in results)
970+
{
971+
Assert.That(person, Is.Not.Null);
972+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Image"), Is.False);
973+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Address"), Is.False);
974+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), fetched ? Is.True : (IResolveConstraint) Is.False);
975+
}
976+
}
977+
}
978+
946979
private static Person GeneratePerson(int i, Person bestFriend)
947980
{
948981
return new Person

src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using NHibernate.Cache;
45
using NHibernate.Cfg;
56
using NHibernate.Hql.Ast.ANTLR;
67
using NHibernate.Linq;
78
using NUnit.Framework;
9+
using NUnit.Framework.Constraints;
810
using Environment = NHibernate.Cfg.Environment;
911

1012
namespace NHibernate.Test.FetchLazyProperties
@@ -932,6 +934,37 @@ public void TestFetchAfterEntityIsInitialized(bool readOnly)
932934
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True);
933935
}
934936

937+
[Test]
938+
public void TestHqlCrossJoinFetchFormula()
939+
{
940+
var persons = new List<Person>();
941+
var bestFriends = new List<Person>();
942+
using (var sqlSpy = new SqlLogSpy())
943+
using (var s = OpenSession())
944+
{
945+
var list = s.CreateQuery("select p, bf from Person p cross join Person bf fetch bf.Formula where bf.Id = p.BestFriend.Id").List<object[]>();
946+
foreach (var arr in list)
947+
{
948+
persons.Add((Person) arr[0]);
949+
bestFriends.Add((Person) arr[1]);
950+
}
951+
}
952+
953+
AssertPersons(persons, false);
954+
AssertPersons(bestFriends, true);
955+
956+
void AssertPersons(List<Person> results, bool fetched)
957+
{
958+
foreach (var person in results)
959+
{
960+
Assert.That(person, Is.Not.Null);
961+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Image"), Is.False);
962+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Address"), Is.False);
963+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), fetched ? Is.True : (IResolveConstraint) Is.False);
964+
}
965+
}
966+
}
967+
935968
private static Person GeneratePerson(int i, Person bestFriend)
936969
{
937970
return new Person

src/NHibernate/Hql/Ast/ANTLR/Hql.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ fromClause
256256
fromJoin
257257
: ( ( ( LEFT | RIGHT ) (OUTER)? ) | FULL | INNER )? JOIN^ (FETCH)? path (asAlias)? (propertyFetch)? (withClause)?
258258
| ( ( ( LEFT | RIGHT ) (OUTER)? ) | FULL | INNER )? JOIN^ (FETCH)? ELEMENTS! OPEN! path CLOSE! (asAlias)? (propertyFetch)? (withClause)?
259-
| CROSS JOIN^ { WeakKeywords(); } path (asAlias)?
259+
| CROSS JOIN^ { WeakKeywords(); } path (asAlias)? (propertyFetch)?
260260
;
261261
262262
withClause

0 commit comments

Comments
 (0)