Skip to content

Commit e4b4b33

Browse files
committed
NH-2839 - Fix cast issue when Boolean is implemented by IEnhancedUserType
1 parent e28ac9f commit e4b4b33

File tree

3 files changed

+165
-24
lines changed

3 files changed

+165
-24
lines changed
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
using System;
2+
using System.Data;
3+
using System.Linq;
4+
using NHibernate.Cfg.MappingSchema;
5+
using NHibernate.Linq;
6+
using NHibernate.Mapping.ByCode;
7+
using NHibernate.SqlTypes;
8+
using NHibernate.UserTypes;
9+
using NUnit.Framework;
10+
11+
namespace NHibernate.Test.NHSpecificTest.NH2839
12+
{
13+
class Entity
14+
{
15+
public virtual Guid Id { get; set; }
16+
public virtual string Name { get; set; }
17+
public virtual bool IsActive { get; set; }
18+
}
19+
20+
public class MyBooleanType : IEnhancedUserType
21+
{
22+
public SqlType[] SqlTypes
23+
{
24+
get { return new[] {SqlTypeFactory.Int32}; }
25+
}
26+
27+
public System.Type ReturnedType
28+
{
29+
get { return typeof (bool); }
30+
}
31+
32+
public bool Equals(object x, object y)
33+
{
34+
if (x == y) return true;
35+
36+
if (x is bool && y is bool)
37+
return (bool) x == (bool) y;
38+
return false;
39+
}
40+
41+
public int GetHashCode(object x)
42+
{
43+
return x.GetHashCode();
44+
}
45+
46+
public object NullSafeGet(IDataReader rs, string[] names, object owner)
47+
{
48+
var ordinal = rs.GetOrdinal(names[0]);
49+
if (rs.IsDBNull(ordinal))
50+
return false;
51+
return rs.GetInt32(ordinal) == 1;
52+
}
53+
54+
public void NullSafeSet(IDbCommand cmd, object value, int index)
55+
{
56+
((IDbDataParameter) cmd.Parameters[index]).Value = ((bool) value) ? 1 : -1;
57+
}
58+
59+
public object DeepCopy(object value)
60+
{
61+
return (bool)value;
62+
}
63+
64+
public bool IsMutable
65+
{
66+
get { return false; }
67+
}
68+
69+
public object Replace(object original, object target, object owner)
70+
{
71+
return original;
72+
}
73+
74+
public object Assemble(object cached, object owner)
75+
{
76+
return cached;
77+
}
78+
79+
public object Disassemble(object value)
80+
{
81+
return value;
82+
}
83+
84+
public object FromXMLString(string xml)
85+
{
86+
return xml;
87+
}
88+
89+
public string ObjectToSQLString(object value)
90+
{
91+
return ((bool) value) ? "1" : "-1";
92+
}
93+
94+
public string ToXMLString(object value)
95+
{
96+
return ((bool)value) ? "1" : "-1";
97+
}
98+
}
99+
100+
public class FixtureByCode : TestCaseMappingByCode
101+
{
102+
protected override HbmMapping GetMappings()
103+
{
104+
var mapper = new ModelMapper();
105+
mapper.Class<Entity>(rc =>
106+
{
107+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
108+
rc.Property(x => x.Name);
109+
rc.Property(x => x.IsActive, pm=>pm.Type<MyBooleanType>());
110+
});
111+
112+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
113+
}
114+
115+
protected override void OnSetUp()
116+
{
117+
using (ISession session = OpenSession())
118+
using (ITransaction transaction = session.BeginTransaction())
119+
{
120+
var e1 = new Entity { Name = "Bob", IsActive = true};
121+
session.Save(e1);
122+
123+
var e2 = new Entity { Name = "Sally",IsActive = false};
124+
session.Save(e2);
125+
126+
session.Flush();
127+
transaction.Commit();
128+
}
129+
}
130+
131+
protected override void OnTearDown()
132+
{
133+
using (ISession session = OpenSession())
134+
using (ITransaction transaction = session.BeginTransaction())
135+
{
136+
session.Delete("from System.Object");
137+
138+
session.Flush();
139+
transaction.Commit();
140+
}
141+
}
142+
143+
[Test]
144+
public void YourTestName()
145+
{
146+
using (ISession session = OpenSession())
147+
using (session.BeginTransaction())
148+
{
149+
var result = from e in session.Query<Entity>()
150+
where e.IsActive
151+
select e;
152+
153+
Assert.AreEqual(1, result.ToList().Count);
154+
}
155+
}
156+
}
157+
}

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,7 @@
717717
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Fixture.cs" />
718718
<Compile Include="Linq\ByMethod\DistinctTests.cs" />
719719
<Compile Include="Component\Basic\ComponentWithUniqueConstraintTests.cs" />
720+
<Compile Include="NHSpecificTest\NH2839\FixtureByCode.cs" />
720721
<Compile Include="NHSpecificTest\NH3564\FixtureByCode.cs" />
721722
<Compile Include="NHSpecificTest\NH3583\Entity.cs" />
722723
<Compile Include="NHSpecificTest\NH3583\AutoFlushFixture.cs" />

src/NHibernate/Hql/Ast/ANTLR/Tree/BooleanLiteralNode.cs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,32 @@ namespace NHibernate.Hql.Ast.ANTLR.Tree
1212
[CLSCompliant(false)]
1313
public class BooleanLiteralNode : LiteralNode, IExpectedTypeAwareNode
1414
{
15-
private IType _expectedType;
16-
1715
public BooleanLiteralNode(IToken token) : base(token)
1816
{
1917
}
2018

2119
public override IType DataType
2220
{
23-
get
24-
{
25-
return _expectedType ?? NHibernateUtil.Boolean;
26-
}
27-
set
28-
{
29-
base.DataType = value;
30-
}
21+
get { return ExpectedType ?? NHibernateUtil.Boolean; }
22+
set { base.DataType = value; }
3123
}
3224

33-
private BooleanType GetTypeInternal()
25+
private ILiteralType TypeAsLiteralType()
3426
{
35-
return ( BooleanType ) DataType;
27+
return (ILiteralType) DataType;
3628
}
3729

3830
private bool GetValue() {
39-
return Type == HqlSqlWalker.TRUE ? true : false;
31+
return Type == HqlSqlWalker.TRUE;
4032
}
4133

42-
/**
43-
* Expected-types really only pertinent here for boolean literals...
44-
*
45-
* @param expectedType
46-
*/
47-
public IType ExpectedType
48-
{
49-
get { return _expectedType; }
50-
set { _expectedType = value; }
51-
}
34+
public IType ExpectedType { get; set; }
5235

5336
public override SqlString RenderText(ISessionFactoryImplementor sessionFactory)
5437
{
5538
try
5639
{
57-
return new SqlString(GetTypeInternal().ObjectToSQLString( GetValue(), sessionFactory.Dialect ));
40+
return new SqlString(TypeAsLiteralType().ObjectToSQLString( GetValue(), sessionFactory.Dialect ));
5841
}
5942
catch( Exception t )
6043
{

0 commit comments

Comments
 (0)