Skip to content

Add cached boxed boolean values to BooleanType #3230

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions src/NHibernate.Test/Async/TypesTest/BooleanTypeFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
//------------------------------------------------------------------------------


using System;
using System.Data.Common;
using NHibernate.Engine;
using NHibernate.Type;
using NSubstitute;
using NUnit.Framework;

namespace NHibernate.Test.TypesTest
Expand All @@ -21,10 +23,7 @@ namespace NHibernate.Test.TypesTest
[TestFixture]
public class BooleanTypeFixtureAsync : TypeFixtureBase
{
protected override string TypeName
{
get { return "Boolean"; }
}
protected override string TypeName => "Boolean";

[Test]
public async Task ReadWriteAsync()
Expand All @@ -48,4 +47,4 @@ public async Task ReadWriteAsync()
s.Close();
}
}
}
}
73 changes: 66 additions & 7 deletions src/NHibernate.Test/TypesTest/BooleanTypeFixture.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Data.Common;
using NHibernate.Engine;
using NHibernate.Type;
using NSubstitute;
using NUnit.Framework;

namespace NHibernate.Test.TypesTest
Expand All @@ -10,10 +12,7 @@ namespace NHibernate.Test.TypesTest
[TestFixture]
public class BooleanTypeFixture : TypeFixtureBase
{
protected override string TypeName
{
get { return "Boolean"; }
}
protected override string TypeName => "Boolean";

/// <summary>
/// Verify Equals will correctly determine when the property
Expand All @@ -22,7 +21,7 @@ protected override string TypeName
[Test]
public void Equals()
{
BooleanType type = (BooleanType) NHibernateUtil.Boolean;
BooleanType type = NHibernateUtil.Boolean;

Assert.IsTrue(type.IsEqual(true, true));
Assert.IsTrue(type.IsEqual(false, false));
Expand Down Expand Up @@ -50,5 +49,65 @@ public void ReadWrite()
s.Flush();
s.Close();
}

[Theory]
public void GetByIndex(bool expected)
{
const int index0 = 0;
const int index1 = 1;
BooleanType type = NHibernateUtil.Boolean;
var session = Substitute.For<ISessionImplementor>();
var reader = Substitute.For<DbDataReader>();
reader[index0].Returns(expected);
reader[index1].Returns(expected);

var result0 = type.Get(reader, index0, session);
var result1 = type.Get(reader, index1, session);

Assert.AreEqual(expected, (bool) result0);
Assert.AreSame(result0, result1);
}

[Theory]
public void GetByName(bool expected)
{
const string name0 = "name0";
const string name1 = "name1";
BooleanType type = NHibernateUtil.Boolean;
var session = Substitute.For<ISessionImplementor>();
var reader = Substitute.For<DbDataReader>();
reader[name0].Returns(expected);
reader[name1].Returns(expected);

var result0 = type.Get(reader, name0, session);
var result1 = type.Get(reader, name1, session);

Assert.AreEqual(expected, (bool) result0);
Assert.AreSame(result0, result1);
}

[Test]
public void DefaultValue()
{
BooleanType type = NHibernateUtil.Boolean;

var result0 = type.DefaultValue;
var result1 = type.DefaultValue;

Assert.IsFalse((bool) result0);
Assert.AreSame(result0, result1);
}

[Theory]
public void StringToObject(bool expected)
{
BooleanType type = NHibernateUtil.Boolean;

var result0 = type.StringToObject(expected.ToString());
var result1 = type.StringToObject(expected.ToString());

Assert.AreEqual(expected, result0);
Assert.AreSame(result0, result1);
}
}
}
}
71 changes: 71 additions & 0 deletions src/NHibernate.Test/TypesTest/CharBooleanTypeFixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System.Data.Common;
using NHibernate.Engine;
using NHibernate.SqlTypes;
using NHibernate.Type;
using NSubstitute;
using NUnit.Framework;

namespace NHibernate.Test.TypesTest
{
[TestFixture]
public sealed class CharBooleanTypeFixture
{
[Theory]
public void GetByIndex(bool expected)
{
const int index0 = 0;
const int index1 = 1;
CharBooleanType type =new CharBooleanTypeStub();
var session = Substitute.For<ISessionImplementor>();
var reader = Substitute.For<DbDataReader>();
reader[index0].Returns(expected.ToString());
reader[index1].Returns(expected.ToString());

var result0 = type.Get(reader, index0, session);
var result1 = type.Get(reader, index1, session);

Assert.AreEqual(expected, (bool) result0);
Assert.AreSame(result0, result1);
}

[Theory]
public void GetByName(bool value)
{
const string name = "0";
const int index = 0;
object expected = value;
CharBooleanType type = Substitute.ForPartsOf<CharBooleanTypeStub>();
var session = Substitute.For<ISessionImplementor>();
var reader = Substitute.For<DbDataReader>();
reader.GetOrdinal(name).Returns(index);
type.Get(reader, index, Arg.Any<ISessionImplementor>()).Returns(expected);

var result = type.Get(reader, name, session);

Assert.AreSame(expected, result);
}

[Theory]
public void StringToObject(bool expected)
{
CharBooleanType type = new CharBooleanTypeStub();

var result0 = type.StringToObject(expected.ToString());
var result1 = type.StringToObject(expected.ToString());

Assert.AreEqual(expected, result0);
Assert.AreSame(result0, result1);
}

public class CharBooleanTypeStub : CharBooleanType
{
public CharBooleanTypeStub() : base(new AnsiStringFixedLengthSqlType())
{
}

protected override string TrueString => true.ToString();

protected override string FalseString => false.ToString();
}
}
}
36 changes: 17 additions & 19 deletions src/NHibernate/Type/BooleanType.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Data;
using System.Data.Common;
using System.Runtime.CompilerServices;
using NHibernate.Engine;
using NHibernate.SqlTypes;

Expand All @@ -13,6 +14,9 @@ namespace NHibernate.Type
[Serializable]
public class BooleanType : PrimitiveType, IDiscriminatorType
{
protected static readonly object TrueObject = true;
protected static readonly object FalseObject = false;

/// <summary>
/// Initialize a new instance of the BooleanType
/// </summary>
Expand All @@ -36,38 +40,26 @@ public BooleanType(AnsiStringFixedLengthSqlType sqlType) : base(sqlType)

public override object Get(DbDataReader rs, int index, ISessionImplementor session)
{
return Convert.ToBoolean(rs[index]);
return GetBooleanAsObject(Convert.ToBoolean(rs[index]));
}

public override object Get(DbDataReader rs, string name, ISessionImplementor session)
{
return Convert.ToBoolean(rs[name]);
return GetBooleanAsObject(Convert.ToBoolean(rs[name]));
}

public override System.Type PrimitiveClass
{
get { return typeof(bool); }
}
public override System.Type PrimitiveClass => typeof(bool);

public override System.Type ReturnedClass
{
get { return typeof(bool); }
}
public override System.Type ReturnedClass => typeof(bool);

public override void Set(DbCommand cmd, object value, int index, ISessionImplementor session)
{
cmd.Parameters[index].Value = (bool) value;
}

public override string Name
{
get { return "Boolean"; }
}
public override string Name => "Boolean";

public override object DefaultValue
{
get { return false; }
}
public override object DefaultValue => FalseObject;

public override string ObjectToSQLString(object value, Dialect.Dialect dialect)
{
Expand All @@ -89,7 +81,13 @@ public virtual object StringToObject(string xml)
[Obsolete("This method has no more usages and will be removed in a future version.")]
public override object FromStringValue(string xml)
{
return bool.Parse(xml);
return GetBooleanAsObject(bool.Parse(xml));
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static object GetBooleanAsObject(bool value)
{
return value ? TrueObject : FalseObject;
}
}
}
7 changes: 3 additions & 4 deletions src/NHibernate/Type/CharBooleanType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Data.Common;
using NHibernate.Engine;
using NHibernate.SqlTypes;
using NHibernate.Util;

namespace NHibernate.Type
{
Expand Down Expand Up @@ -37,7 +36,7 @@ public override object Get(DbDataReader rs, int index, ISessionImplementor sessi
}
else
{
return code.Equals(TrueString, StringComparison.InvariantCultureIgnoreCase);
return GetBooleanAsObject(code.Equals(TrueString, StringComparison.InvariantCultureIgnoreCase));
}
}

Expand Down Expand Up @@ -68,11 +67,11 @@ public override object StringToObject(String xml)
{
if (string.Equals(TrueString, xml, StringComparison.InvariantCultureIgnoreCase))
{
return true;
return TrueObject;
}
else if (string.Equals(FalseString, xml, StringComparison.InvariantCultureIgnoreCase))
{
return false;
return FalseObject;
}
else
{
Expand Down