Skip to content

Commit 8f866fa

Browse files
authored
Skip table group join processing for implicit join (#3106)
1 parent 267e226 commit 8f866fa

File tree

4 files changed

+69
-4
lines changed

4 files changed

+69
-4
lines changed

src/NHibernate.Test/Async/SubclassFilterTest/JoinedSubclassFilterTest.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Collections;
1313
using NUnit.Framework;
1414
using System.Linq;
15+
using NHibernate.Linq;
1516

1617
namespace NHibernate.Test.SubclassFilterTest
1718
{
@@ -107,6 +108,35 @@ public async Task FiltersWithSubclassAsync()
107108
s.Close();
108109
}
109110

111+
[Test]
112+
public async Task FilterCollectionWithSubclass1Async()
113+
{
114+
using var s = OpenSession();
115+
using var t = s.BeginTransaction();
116+
await (PrepareTestDataAsync(s));
117+
118+
s.EnableFilter("minionsWithManager");
119+
120+
var employees = await (s.Query<Employee>().Where(x => x.Minions.Any()).ToListAsync());
121+
Assert.That(employees.Count, Is.EqualTo(1));
122+
Assert.That(employees[0].Minions.Count, Is.EqualTo(2));
123+
}
124+
125+
[KnownBug("GH-3079: Collection filter on subclass columns")]
126+
[Test]
127+
public async Task FilterCollectionWithSubclass2Async()
128+
{
129+
using var s = OpenSession();
130+
using var t = s.BeginTransaction();
131+
await (PrepareTestDataAsync(s));
132+
133+
s.EnableFilter("minionsRegion").SetParameter("userRegion", "US");
134+
135+
var employees = await (s.Query<Employee>().Where(x => x.Minions.Any()).ToListAsync());
136+
Assert.That(employees.Count, Is.EqualTo(1));
137+
Assert.That(employees[0].Minions.Count, Is.EqualTo(1));
138+
}
139+
110140
private static async Task PrepareTestDataAsync(ISession s, CancellationToken cancellationToken = default(CancellationToken))
111141
{
112142
Employee john = new Employee("John Doe");
@@ -147,4 +177,4 @@ public async Task FiltersWithSubclassAsync()
147177
await (s.FlushAsync(cancellationToken));
148178
}
149179
}
150-
}
180+
}

src/NHibernate.Test/SubclassFilterTest/JoinedSubclassFilterTest.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,35 @@ public void FiltersWithSubclass()
9595
s.Close();
9696
}
9797

98+
[Test]
99+
public void FilterCollectionWithSubclass1()
100+
{
101+
using var s = OpenSession();
102+
using var t = s.BeginTransaction();
103+
PrepareTestData(s);
104+
105+
s.EnableFilter("minionsWithManager");
106+
107+
var employees = s.Query<Employee>().Where(x => x.Minions.Any()).ToList();
108+
Assert.That(employees.Count, Is.EqualTo(1));
109+
Assert.That(employees[0].Minions.Count, Is.EqualTo(2));
110+
}
111+
112+
[KnownBug("GH-3079: Collection filter on subclass columns")]
113+
[Test]
114+
public void FilterCollectionWithSubclass2()
115+
{
116+
using var s = OpenSession();
117+
using var t = s.BeginTransaction();
118+
PrepareTestData(s);
119+
120+
s.EnableFilter("minionsRegion").SetParameter("userRegion", "US");
121+
122+
var employees = s.Query<Employee>().Where(x => x.Minions.Any()).ToList();
123+
Assert.That(employees.Count, Is.EqualTo(1));
124+
Assert.That(employees[0].Minions.Count, Is.EqualTo(1));
125+
}
126+
98127
private static void PrepareTestData(ISession s)
99128
{
100129
Employee john = new Employee("John Doe");
@@ -135,4 +164,4 @@ private static void PrepareTestData(ISession s)
135164
s.Flush();
136165
}
137166
}
138-
}
167+
}

src/NHibernate.Test/SubclassFilterTest/joined-subclass.hbm.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
<set name="Minions" inverse="true" lazy="true" cascade="all">
2222
<key column="mgr_id"/>
2323
<one-to-many class="Employee"/>
24+
<filter name="minionsWithManager" condition="mgr_id is not null"/>
25+
<filter name="minionsRegion" condition="Region = :userRegion"/>
2426
</set>
2527
</joined-subclass>
2628

@@ -36,4 +38,8 @@
3638
<filter-def name="region">
3739
<filter-param name="userRegion" type="string"/>
3840
</filter-def>
39-
</hibernate-mapping>
41+
<filter-def name="minionsRegion">
42+
<filter-param name="userRegion" type="string"/>
43+
</filter-def>
44+
<filter-def name="minionsWithManager"/>
45+
</hibernate-mapping>

src/NHibernate/Engine/JoinSequence.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ internal JoinFragment ToJoinFragment(
191191
last = join.Joinable;
192192
}
193193

194-
if (rootJoinable == null && TableGroupJoinHelper.ProcessAsTableGroupJoin(joins, withClauses, includeAllSubclassJoins, joinFragment, alias => IsIncluded(alias), factory))
194+
if (rootJoinable == null && !IsThetaStyle && TableGroupJoinHelper.ProcessAsTableGroupJoin(joins, withClauses, includeAllSubclassJoins, joinFragment, alias => IsIncluded(alias), factory))
195195
{
196196
return joinFragment;
197197
}

0 commit comments

Comments
 (0)