Skip to content

Commit 24b0435

Browse files
author
mrhihi
committed
1. filter should apply to subclass not superclass
2. add test case
1 parent 704fba2 commit 24b0435

File tree

10 files changed

+170
-4
lines changed

10 files changed

+170
-4
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace NHibernate.Test.NHSpecificTest.NH2053
6+
{
7+
public class Animal
8+
{
9+
public virtual int AnimalId { get; set; }
10+
public virtual string Name { get; set; }
11+
}
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace NHibernate.Test.NHSpecificTest.NH2053
7+
{
8+
public class Cat: Animal
9+
{
10+
}
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace NHibernate.Test.NHSpecificTest.NH2053
7+
{
8+
public class Dog: Animal
9+
{
10+
public virtual Boolean Talkable { get; set; }
11+
}
12+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
using NHibernate.Dialect;
6+
using NUnit.Framework;
7+
8+
namespace NHibernate.Test.NHSpecificTest.NH2053
9+
{
10+
[TestFixture]
11+
public class Fixture : BugTestCase
12+
{
13+
protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect)
14+
{
15+
return dialect is MsSql2005Dialect;
16+
}
17+
protected override void OnSetUp()
18+
{
19+
using (var session = this.OpenSession())
20+
{
21+
using (var tran = session.BeginTransaction())
22+
{
23+
Dog snoopy = new Dog()
24+
{
25+
Name = "Snoopy",
26+
Talkable = false
27+
};
28+
snoopy.Name = "Snoopy";
29+
Dog Jake = new Dog()
30+
{
31+
Name = "Jake the dog",
32+
Talkable = true
33+
};
34+
session.Save(snoopy);
35+
session.Save(Jake);
36+
Cat kitty = new Cat()
37+
{
38+
Name = "Kitty"
39+
};
40+
session.Save(kitty);
41+
tran.Commit();
42+
}
43+
}
44+
}
45+
protected override void OnTearDown()
46+
{
47+
using (var session = this.OpenSession())
48+
{
49+
using (var tran = session.BeginTransaction())
50+
{
51+
session.Delete("from Dog");
52+
session.Delete("from Animal");
53+
tran.Commit();
54+
}
55+
}
56+
}
57+
58+
[Test]
59+
public void JoinedSubClass_Filter()
60+
{
61+
using (var session = this.OpenSession())
62+
{
63+
using (var tran = session.BeginTransaction())
64+
{
65+
/*
66+
* This is not a good case for this feature.
67+
* In my case.
68+
*
69+
*/
70+
session.EnableFilter("talkableFilter").SetParameter("talkable", true);
71+
var snoopy = session.QueryOver<Dog>().Where(x => x.Name == "Snoopy").SingleOrDefault();
72+
Assert.AreEqual(null, snoopy); // there are no talking dog named Snoopy.
73+
74+
var jake = session.QueryOver<Dog>().Where(x => x.Name == "Jake the dog").SingleOrDefault();
75+
Assert.AreNotEqual(null, jake);
76+
Assert.AreEqual("Jake the dog", jake.Name);
77+
78+
var kitty = session.QueryOver<Cat>().Where(x => x.Name == "Kitty").SingleOrDefault();
79+
Assert.AreNotEqual(null, kitty);
80+
Assert.AreEqual("Kitty", kitty.Name);
81+
}
82+
}
83+
}
84+
85+
}
86+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
assembly="NHibernate.Test"
4+
namespace="NHibernate.Test.NHSpecificTest.NH2053">
5+
6+
<class name="Animal">
7+
<id name="AnimalId">
8+
<generator class="identity"/>
9+
</id>
10+
<property name="Name"/>
11+
</class>
12+
<joined-subclass
13+
extends="Animal"
14+
name="Dog">
15+
<key column="AnimalId" />
16+
<property column="Talkable" type="Boolean" name="Talkable" not-null="true"></property>
17+
<filter name="talkableFilter" condition="Talkable = :talkable" />
18+
</joined-subclass>
19+
<joined-subclass
20+
extends="Animal"
21+
name="Cat">
22+
<key column="AnimalId" />
23+
</joined-subclass>
24+
<filter-def name="talkableFilter">
25+
<filter-param name="talkable" type="Boolean"/>
26+
</filter-def>
27+
28+
</hibernate-mapping>

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,10 @@
688688
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Fixture.cs" />
689689
<Compile Include="Linq\ByMethod\DistinctTests.cs" />
690690
<Compile Include="Component\Basic\ComponentWithUniqueConstraintTests.cs" />
691+
<Compile Include="NHSpecificTest\NH2053\Cat.cs" />
692+
<Compile Include="NHSpecificTest\NH2053\Dog.cs" />
693+
<Compile Include="NHSpecificTest\NH2053\Fixture.cs" />
694+
<Compile Include="NHSpecificTest\NH2053\Animal.cs" />
691695
<Compile Include="NHSpecificTest\NH3620\Fixture.cs" />
692696
<Compile Include="NHSpecificTest\NH3620\TwoBlobs.cs" />
693697
<Compile Include="NHSpecificTest\NH3455\Address.cs" />
@@ -3052,6 +3056,7 @@
30523056
<EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
30533057
</ItemGroup>
30543058
<ItemGroup>
3059+
<EmbeddedResource Include="NHSpecificTest\NH2053\Mappings.hbm.xml" />
30553060
<EmbeddedResource Include="NHSpecificTest\NH3455\Mappings.hbm.xml" />
30563061
<EmbeddedResource Include="NHSpecificTest\NH3590\Mappings.hbm.xml" />
30573062
<EmbeddedResource Include="NHSpecificTest\NH3377\Mappings.hbm.xml" />

src/NHibernate/Cfg/XmlHbmBinding/JoinedSubclassBinder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public void Bind(HbmJoinedSubclass joinedSubclassMapping, IDictionary<string, Me
2121
{
2222
PersistentClass superModel = GetSuperclass(joinedSubclassMapping.extends);
2323
HandleJoinedSubclass(superModel, joinedSubclassMapping, inheritedMetas);
24-
new FiltersBinder(superModel, Mappings).Bind(joinedSubclassMapping.filter);
2524
}
2625

2726
public void HandleJoinedSubclass(PersistentClass model, HbmJoinedSubclass joinedSubclassMapping, IDictionary<string, MetaAttribute> inheritedMetas)
@@ -63,6 +62,8 @@ public void HandleJoinedSubclass(PersistentClass model, HbmJoinedSubclass joined
6362

6463
BindJoinedSubclasses(joinedSubclassMapping.JoinedSubclasses, subclass, inheritedMetas);
6564

65+
new FiltersBinder(subclass, Mappings).Bind(joinedSubclassMapping.filter);
66+
6667
model.AddSubclass(subclass);
6768
mappings.AddClass(subclass);
6869
}

src/NHibernate/Cfg/XmlHbmBinding/SubclassBinder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public void Bind(HbmSubclass subClassMapping, IDictionary<string, MetaAttribute>
2121
{
2222
PersistentClass superModel = GetSuperclass(subClassMapping.extends);
2323
HandleSubclass(superModel, subClassMapping, inheritedMetas);
24-
new FiltersBinder(superModel, Mappings).Bind(subClassMapping.filter);
2524
}
2625

2726
public void HandleSubclass(PersistentClass model, HbmSubclass subClassMapping, IDictionary<string, MetaAttribute> inheritedMetas)
@@ -43,7 +42,9 @@ public void HandleSubclass(PersistentClass model, HbmSubclass subClassMapping, I
4342

4443
model.AddSubclass(subclass);
4544
mappings.AddClass(subclass);
46-
}
45+
46+
new FiltersBinder(model, Mappings).Bind(subClassMapping.filter);
47+
}
4748

4849
}
4950
}

src/NHibernate/Mapping/Subclass.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Linq;
45
using NHibernate.Engine;
56
using NHibernate.Util;
67

@@ -157,7 +158,14 @@ public override ISet<string> SynchronizedTables
157158

158159
public override IDictionary<string, string> FilterMap
159160
{
160-
get { return Superclass.FilterMap; }
161+
get {
162+
var superclassFilters = Superclass.FilterMap;
163+
var subclassFilters = base.FilterMap;
164+
165+
return superclassFilters.Union(
166+
subclassFilters
167+
).ToDictionary(k => k.Key, v => v.Value);
168+
}
161169
}
162170

163171
public override IDictionary<EntityMode, string> TuplizerMap

src/NHibernate/nhibernate-mapping.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,7 @@
676676
<xs:element ref="idbag" />
677677
<xs:element ref="array" />
678678
<xs:element ref="primitive-array" />
679+
<xs:element ref="filter" />
679680
</xs:choice>
680681
<xs:element ref="joined-subclass" minOccurs="0" maxOccurs="unbounded" />
681682
<xs:element ref="loader" minOccurs="0" />
@@ -1353,6 +1354,7 @@
13531354
<xs:element ref="idbag" />
13541355
<xs:element ref="array" />
13551356
<xs:element ref="primitive-array" />
1357+
<xs:element ref="filter" />
13561358
</xs:choice>
13571359
<xs:element ref="join" minOccurs="0" maxOccurs="unbounded" />
13581360
<xs:element ref="subclass" minOccurs="0" maxOccurs="unbounded" />

0 commit comments

Comments
 (0)