Skip to content

Commit 147ede4

Browse files
committed
Merge fix for NH-3641 (pull request #283).
2 parents 54c80b4 + f56c975 commit 147ede4

File tree

5 files changed

+110
-4
lines changed

5 files changed

+110
-4
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+

2+
namespace NHibernate.Test.NHSpecificTest.NH3641
3+
{
4+
public interface IEntity
5+
{
6+
int Id { get; set; }
7+
bool Flag { get; set; }
8+
Entity ChildConcrete { get; set; }
9+
IEntity ChildInterface { get; set; }
10+
}
11+
12+
public class Entity : IEntity
13+
{
14+
public virtual int Id { get; set; }
15+
public virtual bool Flag { get; set; }
16+
public virtual Entity ChildConcrete { get; set; }
17+
public virtual IEntity ChildInterface { get; set; }
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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.NH3641">
5+
6+
<class name="Entity" table="Entity" lazy="true">
7+
<id name="Id" access="property" column="Id" type="Int32" unsaved-value="0">
8+
<generator class="assigned" />
9+
</id>
10+
11+
<property name="Flag" type="Boolean">
12+
<column name="Flag" not-null="true" />
13+
</property>
14+
15+
<many-to-one name="ChildConcrete" access="property" class="Entity" column="ChildConcreteId" lazy="proxy" />
16+
<many-to-one name="ChildInterface" access="property" class="Entity" column="ChildInterfaceId" lazy="proxy" />
17+
</class>
18+
19+
</hibernate-mapping>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using System.Linq;
2+
using NHibernate.Linq;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.NHSpecificTest.NH3641
6+
{
7+
public class TestFixture : BugTestCase
8+
{
9+
protected override void OnSetUp()
10+
{
11+
using (var session = OpenSession())
12+
using (var tx = session.BeginTransaction())
13+
{
14+
var child = new Entity {Id = 1, Flag = true};
15+
var parent = new Entity {Id = 2, ChildInterface = child, ChildConcrete = child};
16+
17+
session.Save(child);
18+
session.Save(parent);
19+
20+
tx.Commit();
21+
}
22+
}
23+
24+
protected override void OnTearDown()
25+
{
26+
using (var session = OpenSession())
27+
using (var tx = session.BeginTransaction())
28+
{
29+
DeleteAll<Entity>(session);
30+
tx.Commit();
31+
}
32+
}
33+
34+
private static void DeleteAll<T>(ISession session)
35+
{
36+
session.CreateQuery("delete from " + typeof (T).Name).ExecuteUpdate();
37+
}
38+
39+
[Test]
40+
public void TrueOrChildPropertyConcrete()
41+
{
42+
using (var session = OpenSession())
43+
{
44+
var result = session.Query<IEntity>()
45+
.Where(x => x.ChildConcrete == null || x.ChildConcrete.Flag)
46+
.ToList();
47+
Assert.That(result, Has.Count.EqualTo(2));
48+
}
49+
}
50+
51+
[Test]
52+
public void TrueOrChildPropertyInterface()
53+
{
54+
using (var session = OpenSession())
55+
{
56+
var result = session.Query<IEntity>()
57+
.Where(x => x.ChildInterface == null || ((Entity) x.ChildInterface).Flag)
58+
.ToList();
59+
Assert.That(result, Has.Count.EqualTo(2));
60+
}
61+
}
62+
}
63+
}

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,6 +1059,8 @@
10591059
<Compile Include="NHSpecificTest\NH3145\Model.cs" />
10601060
<Compile Include="NHSpecificTest\NH2860\ClassA.cs" />
10611061
<Compile Include="NHSpecificTest\NH2860\SampleTest.cs" />
1062+
<Compile Include="NHSpecificTest\NH3641\Domain.cs" />
1063+
<Compile Include="NHSpecificTest\NH3641\TestFixture.cs" />
10621064
<Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" />
10631065
<Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" />
10641066
<Compile Include="NHSpecificTest\Properties\Model.cs" />
@@ -2913,6 +2915,7 @@
29132915
<EmbeddedResource Include="NHSpecificTest\NH3614\Mappings.hbm.xml" />
29142916
<EmbeddedResource Include="NHSpecificTest\NH3505\Mappings.hbm.xml" />
29152917
<EmbeddedResource Include="NHSpecificTest\NH3428\Mappings.hbm.xml" />
2918+
<EmbeddedResource Include="NHSpecificTest\NH3641\Mappings.hbm.xml" />
29162919
<EmbeddedResource Include="NHSpecificTest\NH3408\Mappings.hbm.xml" />
29172920
<EmbeddedResource Include="NHSpecificTest\NH2408\Mappings.hbm.xml" />
29182921
<EmbeddedResource Include="NHSpecificTest\NH2297\MappingsNames.hbm.xml" />

src/NHibernate/Linq/ReWriters/AddJoinsReWriter.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Linq;
2+
using NHibernate.Engine;
13
using NHibernate.Linq.Visitors;
24
using Remotion.Linq;
35
using Remotion.Linq.Clauses;
@@ -12,12 +14,12 @@ internal interface IIsEntityDecider
1214

1315
public class AddJoinsReWriter : QueryModelVisitorBase, IIsEntityDecider
1416
{
15-
private readonly ISessionFactory _sessionFactory;
17+
private readonly ISessionFactoryImplementor _sessionFactory;
1618
private readonly SelectJoinDetector _selectJoinDetector;
1719
private readonly ResultOperatorAndOrderByJoinDetector _resultOperatorAndOrderByJoinDetector;
1820
private readonly WhereJoinDetector _whereJoinDetector;
1921

20-
private AddJoinsReWriter(ISessionFactory sessionFactory, QueryModel queryModel)
22+
private AddJoinsReWriter(ISessionFactoryImplementor sessionFactory, QueryModel queryModel)
2123
{
2224
_sessionFactory = sessionFactory;
2325
var joiner = new Joiner(queryModel);
@@ -26,7 +28,7 @@ private AddJoinsReWriter(ISessionFactory sessionFactory, QueryModel queryModel)
2628
_whereJoinDetector = new WhereJoinDetector(this, joiner);
2729
}
2830

29-
public static void ReWrite(QueryModel queryModel, ISessionFactory sessionFactory)
31+
public static void ReWrite(QueryModel queryModel, ISessionFactoryImplementor sessionFactory)
3032
{
3133
new AddJoinsReWriter(sessionFactory, queryModel).VisitQueryModel(queryModel);
3234
}
@@ -53,7 +55,7 @@ public override void VisitWhereClause(WhereClause whereClause, QueryModel queryM
5355

5456
public bool IsEntity(System.Type type)
5557
{
56-
return _sessionFactory.GetClassMetadata(type) != null;
58+
return _sessionFactory.GetImplementors(type.FullName).Any();
5759
}
5860

5961
public bool IsIdentifier(System.Type type, string propertyName)

0 commit comments

Comments
 (0)