Skip to content

Commit 0bda5f9

Browse files
Fix many-to-one disabled filters for entity joins (#3048)
fix #3046
1 parent e99cf43 commit 0bda5f9

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
lines changed

src/NHibernate.Test/Async/NHSpecificTest/GH2549/Fixture.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
namespace NHibernate.Test.NHSpecificTest.GH2549
1616
{
1717
using System.Threading.Tasks;
18+
// Test GH3046 too, when useManyToOne is <c>true</c>.
1819
[TestFixture]
1920
public class FixtureAsync : BugTestCase
2021
{
@@ -41,16 +42,16 @@ protected override void OnTearDown()
4142
}
4243
}
4344

44-
[Test]
45-
public async Task EntityJoinFilterLinqAsync()
45+
[Theory]
46+
public async Task EntityJoinFilterLinqAsync(bool useManyToOne)
4647
{
4748
using (var s = OpenSession())
4849
{
4950
var list = await ((from p in s.Query<Person>()
5051
join c in s.Query<Customer>() on p.Name equals c.Name
5152
select p).ToListAsync());
5253

53-
s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
54+
s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
5455

5556
var filteredList = await ((from p in s.Query<Person>()
5657
join c in s.Query<Customer>() on p.Name equals c.Name
@@ -61,16 +62,16 @@ join c in s.Query<Customer>() on p.Name equals c.Name
6162
}
6263
}
6364

64-
[Test]
65-
public async Task EntityJoinFilterQueryOverAsync()
65+
[Theory]
66+
public async Task EntityJoinFilterQueryOverAsync(bool useManyToOne)
6667
{
6768
using (var s = OpenSession())
6869
{
6970
Customer c = null;
7071
Person p = null;
7172
var list = await (s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).ListAsync());
7273

73-
s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
74+
s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
7475

7576
var filteredList = await (s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).ListAsync());
7677

src/NHibernate.Test/NHSpecificTest/GH2549/Fixture.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace NHibernate.Test.NHSpecificTest.GH2549
55
{
6+
// Test GH3046 too, when useManyToOne is <c>true</c>.
67
[TestFixture]
78
public class Fixture : BugTestCase
89
{
@@ -29,16 +30,16 @@ protected override void OnTearDown()
2930
}
3031
}
3132

32-
[Test]
33-
public void EntityJoinFilterLinq()
33+
[Theory]
34+
public void EntityJoinFilterLinq(bool useManyToOne)
3435
{
3536
using (var s = OpenSession())
3637
{
3738
var list = (from p in s.Query<Person>()
3839
join c in s.Query<Customer>() on p.Name equals c.Name
3940
select p).ToList();
4041

41-
s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
42+
s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
4243

4344
var filteredList = (from p in s.Query<Person>()
4445
join c in s.Query<Customer>() on p.Name equals c.Name
@@ -49,16 +50,16 @@ join c in s.Query<Customer>() on p.Name equals c.Name
4950
}
5051
}
5152

52-
[Test]
53-
public void EntityJoinFilterQueryOver()
53+
[Theory]
54+
public void EntityJoinFilterQueryOver(bool useManyToOne)
5455
{
5556
using (var s = OpenSession())
5657
{
5758
Customer c = null;
5859
Person p = null;
5960
var list = s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).List();
6061

61-
s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
62+
s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
6263

6364
var filteredList = s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).List();
6465

src/NHibernate.Test/NHSpecificTest/GH2549/Mappings.hbm.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<property name="Deleted" type="Boolean" not-null="true" />
1111

1212
<filter name="DeletedCustomer" condition="Deleted = :deleted" />
13+
<filter name="DeletedCustomerNoManyToOne" condition="Deleted = :deleted" />
1314
</class>
1415

1516
<class name="Person">
@@ -23,4 +24,8 @@
2324
<filter-param name="deleted" type="Boolean"/>
2425
</filter-def>
2526

27+
<filter-def name="DeletedCustomerNoManyToOne" use-many-to-one="false">
28+
<filter-param name="deleted" type="Boolean"/>
29+
</filter-def>
30+
2631
</hibernate-mapping>

src/NHibernate/Engine/JoinSequence.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ internal virtual JoinFragment ToJoinFragment(
175175
{
176176
Join join = joins[i];
177177
string on = join.AssociationType.GetOnCondition(join.Alias, factory, enabledFilters);
178-
SqlString condition = new SqlString();
178+
SqlString condition;
179179
if (last != null &&
180180
IsManyToManyRoot(last) &&
181181
((IQueryableCollection)last).ElementType == join.AssociationType)
@@ -195,10 +195,17 @@ internal virtual JoinFragment ToJoinFragment(
195195
{
196196
// NH Different behavior : NH1179 and NH1293
197197
// Apply filters for entity joins and Many-To-One association
198-
var enabledForManyToOne = FilterHelper.GetEnabledForManyToOne(enabledFilters);
199-
condition = new SqlString(string.IsNullOrEmpty(on) && (ForceFilter || enabledForManyToOne.Count > 0)
200-
? join.Joinable.FilterFragment(join.Alias, enabledForManyToOne)
201-
: on);
198+
if (string.IsNullOrEmpty(on))
199+
{
200+
var enabledFiltersForJoin = ForceFilter ? enabledFilters : FilterHelper.GetEnabledForManyToOne(enabledFilters);
201+
condition = new SqlString(ForceFilter || enabledFiltersForJoin.Count > 0
202+
? join.Joinable.FilterFragment(join.Alias, enabledFiltersForJoin)
203+
: on);
204+
}
205+
else
206+
{
207+
condition = new SqlString(on);
208+
}
202209
}
203210

204211
if (withClauseFragment != null)

src/NHibernate/Loader/JoinWalker.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -853,9 +853,10 @@ protected JoinFragment MergeOuterJoins(IList<OuterJoinableAssociation> associati
853853
oj.AddJoins(outerjoin);
854854
// NH Different behavior : NH1179 and NH1293
855855
// Apply filters for entity joins and Many-To-One associations
856-
if (oj.ForceFilter || enabledFiltersForManyToOne.Count > 0)
856+
var enabledFiltersForJoin = oj.ForceFilter ? enabledFilters : enabledFiltersForManyToOne;
857+
if (oj.ForceFilter || enabledFiltersForJoin.Count > 0)
857858
{
858-
string manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFiltersForManyToOne);
859+
string manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFiltersForJoin);
859860
bool joinClauseDoesNotContainsFilterAlready =
860861
outerjoin.ToFromFragmentString.IndexOfCaseInsensitive(manyToOneFilterFragment) == -1;
861862
if (joinClauseDoesNotContainsFilterAlready)

0 commit comments

Comments
 (0)