diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs
deleted file mode 100644
index ecc820d6547..00000000000
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by AsyncGenerator.
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-
-using System.Linq;
-using NUnit.Framework;
-using NHibernate.Linq;
-
-namespace NHibernate.Test.NHSpecificTest.NH2328
-{
- using System.Threading.Tasks;
- [TestFixture]
- public class FixtureAsync : BugTestCase
- {
- protected override bool AppliesTo(Dialect.Dialect dialect)
- {
- return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator;
- }
-
- protected override void OnSetUp()
- {
- base.OnSetUp();
-
- using (ISession s = OpenSession())
- using (ITransaction t = s.BeginTransaction())
- {
- var circle = new Circle();
- var square = new Square();
-
- s.Save(circle);
- s.Save(square);
-
- s.Save(new ToyBox() { Name = "Box1", Shape = circle });
- s.Save(new ToyBox() { Name = "Box2", Shape = square });
- t.Commit();
- }
- }
-
- protected override void OnTearDown()
- {
- base.OnTearDown();
-
- using (ISession s = OpenSession())
- using (ITransaction t = s.BeginTransaction())
- {
- s.CreateQuery("delete from ToyBox").ExecuteUpdate();
- s.CreateQuery("delete from Circle").ExecuteUpdate();
- s.CreateQuery("delete from Square").ExecuteUpdate();
- t.Commit();
- }
- }
-
- [Test]
- public async Task AnyIs_QueryOverAsync()
- {
- using (ISession s = OpenSession())
- {
- var boxes =
- await (s.QueryOver()
- .Where(t => t.Shape is Square)
- .ListAsync());
-
- Assert.That(boxes.Count, Is.EqualTo(1));
- Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
- }
- }
-
- [Test]
- public async Task AnyIs_LinqAsync()
- {
- using (ISession s = OpenSession())
- {
- var boxes =
- await ((from t in s.Query()
- where t.Shape is Square
- select t).ToListAsync());
-
- Assert.That(boxes.Count, Is.EqualTo(1));
- Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
- }
- }
-
- [Test]
- public async Task AnyIs_HqlWorksWithClassNameInTheRightAsync()
- {
- using (ISession s = OpenSession())
- {
- var boxes =
- await (s.CreateQuery("from ToyBox t where t.Shape.class = Square")
- .ListAsync());
-
- Assert.That(boxes.Count, Is.EqualTo(1));
- Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
- }
- }
-
- [Test]
- public async Task AnyIs_HqlWorksWithClassNameInTheLeftAsync()
- {
- using (ISession s = OpenSession())
- {
- var boxes =
- await (s.CreateQuery("from ToyBox t where Square = t.Shape.class")
- .ListAsync());
-
- Assert.That(boxes.Count, Is.EqualTo(1));
- Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
- }
- }
- }
-}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/Class/ClassMetaTypeFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1774/Class/ClassMetaTypeFixture.cs
new file mode 100644
index 00000000000..6334faf0333
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Class/ClassMetaTypeFixture.cs
@@ -0,0 +1,9 @@
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH1774.Class
+{
+ [TestFixture]
+ public class ClassMetaTypeFixture : FixtureBase
+ {
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/Class/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH1774/Class/Mappings.hbm.xml
new file mode 100644
index 00000000000..06bd0e26ef1
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Class/Mappings.hbm.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1774/FixtureBase.cs
similarity index 51%
rename from src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs
rename to src/NHibernate.Test/NHSpecificTest/GH1774/FixtureBase.cs
index 2ad2d25d5dc..475da5eda2d 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/FixtureBase.cs
@@ -1,10 +1,9 @@
using System.Linq;
using NUnit.Framework;
-namespace NHibernate.Test.NHSpecificTest.NH2328
+namespace NHibernate.Test.NHSpecificTest.GH1774
{
- [TestFixture]
- public class Fixture : BugTestCase
+ public abstract class FixtureBase : BugTestCase
{
protected override bool AppliesTo(Dialect.Dialect dialect)
{
@@ -13,10 +12,8 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
protected override void OnSetUp()
{
- base.OnSetUp();
-
- using (ISession s = OpenSession())
- using (ITransaction t = s.BeginTransaction())
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
{
var circle = new Circle();
var square = new Square();
@@ -24,18 +21,16 @@ protected override void OnSetUp()
s.Save(circle);
s.Save(square);
- s.Save(new ToyBox() { Name = "Box1", Shape = circle });
- s.Save(new ToyBox() { Name = "Box2", Shape = square });
+ s.Save(new ToyBox { Name = "Box1", Shape = circle });
+ s.Save(new ToyBox { Name = "Box2", Shape = square });
t.Commit();
}
}
protected override void OnTearDown()
{
- base.OnTearDown();
-
- using (ISession s = OpenSession())
- using (ITransaction t = s.BeginTransaction())
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
{
s.CreateQuery("delete from ToyBox").ExecuteUpdate();
s.CreateQuery("delete from Circle").ExecuteUpdate();
@@ -47,12 +42,13 @@ protected override void OnTearDown()
[Test]
public void AnyIs_QueryOver()
{
- using (ISession s = OpenSession())
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
{
var boxes =
s.QueryOver()
- .Where(t => t.Shape is Square)
- .List();
+ .Where(t => t.Shape is Square)
+ .List();
Assert.That(boxes.Count, Is.EqualTo(1));
Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
@@ -62,7 +58,8 @@ public void AnyIs_QueryOver()
[Test]
public void AnyIs_Linq()
{
- using (ISession s = OpenSession())
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
{
var boxes =
(from t in s.Query()
@@ -77,11 +74,12 @@ where t.Shape is Square
[Test]
public void AnyIs_HqlWorksWithClassNameInTheRight()
{
- using (ISession s = OpenSession())
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
{
var boxes =
s.CreateQuery("from ToyBox t where t.Shape.class = Square")
- .List();
+ .List();
Assert.That(boxes.Count, Is.EqualTo(1));
Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
@@ -91,11 +89,44 @@ public void AnyIs_HqlWorksWithClassNameInTheRight()
[Test]
public void AnyIs_HqlWorksWithClassNameInTheLeft()
{
- using (ISession s = OpenSession())
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
{
var boxes =
s.CreateQuery("from ToyBox t where Square = t.Shape.class")
- .List();
+ .List();
+
+ Assert.That(boxes.Count, Is.EqualTo(1));
+ Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
+ }
+ }
+
+ [Test]
+ public void AnyIs_HqlWorksWithParameterInTheRight()
+ {
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
+ {
+ var boxes =
+ s.CreateQuery("from ToyBox t where t.Shape.class = :c")
+ .SetParameter("c", typeof(Square).FullName)
+ .List();
+
+ Assert.That(boxes.Count, Is.EqualTo(1));
+ Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
+ }
+ }
+
+ [Test]
+ public void AnyIs_HqlWorksWithParameterInTheLeft()
+ {
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
+ {
+ var boxes =
+ s.CreateQuery("from ToyBox t where :c = t.Shape.class")
+ .SetParameter("c", typeof(Square).FullName)
+ .List();
Assert.That(boxes.Count, Is.EqualTo(1));
Assert.That(boxes[0].Name, Is.EqualTo("Box2"));
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/Implicit/ImplicitMetaTypeFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1774/Implicit/ImplicitMetaTypeFixture.cs
new file mode 100644
index 00000000000..9de12ea4d4b
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Implicit/ImplicitMetaTypeFixture.cs
@@ -0,0 +1,9 @@
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH1774.Implicit
+{
+ [TestFixture, Ignore("Not fixed yet")]
+ public class ImplicitMetaTypeFixture : FixtureBase
+ {
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/Implicit/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH1774/Implicit/Mappings.hbm.xml
new file mode 100644
index 00000000000..33ccece888d
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Implicit/Mappings.hbm.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/Int32/Int32MetaTypeFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1774/Int32/Int32MetaTypeFixture.cs
new file mode 100644
index 00000000000..3254f57d0a4
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Int32/Int32MetaTypeFixture.cs
@@ -0,0 +1,9 @@
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH1774.Int32
+{
+ [TestFixture]
+ public class Int32MetaTypeFixture : FixtureBase
+ {
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH1774/Int32/Mappings.hbm.xml
similarity index 89%
rename from src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml
rename to src/NHibernate.Test/NHSpecificTest/GH1774/Int32/Mappings.hbm.xml
index da0b0aa8315..4ebb7f3ea66 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Int32/Mappings.hbm.xml
@@ -2,7 +2,7 @@
+ namespace="NHibernate.Test.NHSpecificTest.GH1774">
@@ -29,4 +29,4 @@
-
\ No newline at end of file
+
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs b/src/NHibernate.Test/NHSpecificTest/GH1774/Model.cs
similarity index 87%
rename from src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs
rename to src/NHibernate.Test/NHSpecificTest/GH1774/Model.cs
index 48f7c71ff1c..f4e7597cbb2 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/Model.cs
@@ -1,4 +1,4 @@
-namespace NHibernate.Test.NHSpecificTest.NH2328
+namespace NHibernate.Test.NHSpecificTest.GH1774
{
public class ToyBox
{
@@ -20,4 +20,4 @@ public class Square : IShape
{
public virtual int Id { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/String/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH1774/String/Mappings.hbm.xml
new file mode 100644
index 00000000000..cda2d220bcb
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/String/Mappings.hbm.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1774/String/StringMetaTypeFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1774/String/StringMetaTypeFixture.cs
new file mode 100644
index 00000000000..b881ec33f66
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1774/String/StringMetaTypeFixture.cs
@@ -0,0 +1,9 @@
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH1774.String
+{
+ [TestFixture]
+ public class StringMetaTypeFixture : FixtureBase
+ {
+ }
+}
diff --git a/src/NHibernate/Async/Type/MetaType.cs b/src/NHibernate/Async/Type/MetaType.cs
index ec5cea71ab3..ccf271c6763 100644
--- a/src/NHibernate/Async/Type/MetaType.cs
+++ b/src/NHibernate/Async/Type/MetaType.cs
@@ -13,11 +13,13 @@
using System.Data.Common;
using NHibernate.Engine;
using NHibernate.SqlTypes;
+using NHibernate.Util;
namespace NHibernate.Type
{
using System.Threading.Tasks;
using System.Threading;
+
public partial class MetaType : AbstractType
{
diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs
index 5dfb42ca7a9..cd24e0b16bb 100644
--- a/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs
+++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs
@@ -51,6 +51,7 @@ public virtual void Initialize()
{
throw new SemanticException( "right-hand operand of a binary operator was null" );
}
+
ProcessMetaTypeDiscriminatorIfNecessary(lhs, rhs);
IType lhsType = ExtractDataType( lhs );
IType rhsType = ExtractDataType( rhs );
@@ -270,32 +271,34 @@ protected static IType ExtractDataType(IASTNode operand)
private void ProcessMetaTypeDiscriminatorIfNecessary(IASTNode lhs, IASTNode rhs)
{
// this method inserts the discriminator value for the rhs node so that .class queries on mappings work with the class name
- var lhsNode = lhs as SqlNode;
- var rhsNode = rhs as SqlNode;
- if (lhsNode == null || rhsNode == null)
+ if (!(lhs is SqlNode lhsNode) || !(rhs is SqlNode rhsNode))
{
return;
}
- var lhsNodeMetaType = lhsNode.DataType as MetaType;
- if (lhsNodeMetaType != null)
+ if (rhsNode is IdentNode && lhsNode.DataType is IMetaType lhsNodeMetaType)
{
- string className = SessionFactoryHelper.GetImportedClassName(rhsNode.OriginalText);
-
- object discriminatorValue = lhsNodeMetaType.GetMetaValue(TypeNameParser.Parse(className).Type);
- rhsNode.Text = discriminatorValue.ToString();
+ EvaluateType(rhsNode, lhsNodeMetaType);
return;
}
- var rhsNodeMetaType = rhsNode.DataType as MetaType;
- if (rhsNodeMetaType != null)
+ if (lhsNode is IdentNode && rhsNode.DataType is IMetaType rhsNodeMetaType)
{
- string className = SessionFactoryHelper.GetImportedClassName(lhsNode.OriginalText);
-
- object discriminatorValue = rhsNodeMetaType.GetMetaValue(TypeNameParser.Parse(className).Type);
- lhsNode.Text = discriminatorValue.ToString();
- return;
+ EvaluateType(lhsNode, rhsNodeMetaType);
}
}
+
+ private void EvaluateType(SqlNode node, IMetaType metaType)
+ {
+ var sessionFactory = SessionFactoryHelper.Factory;
+
+ var className = sessionFactory.GetImportedClassName(node.OriginalText);
+
+ var discriminatorValue = metaType.GetMetaValue(
+ TypeNameParser.Parse(className).Type,
+ sessionFactory.Dialect);
+
+ node.Text = discriminatorValue;
+ }
}
}
diff --git a/src/NHibernate/Type/ClassMetaType.cs b/src/NHibernate/Type/ClassMetaType.cs
index 248bbccd0ff..7886753ffb2 100644
--- a/src/NHibernate/Type/ClassMetaType.cs
+++ b/src/NHibernate/Type/ClassMetaType.cs
@@ -12,7 +12,7 @@ namespace NHibernate.Type
/// It work like a MetaType where the key is the entity-name it self
///
[Serializable]
- public partial class ClassMetaType : AbstractType
+ public partial class ClassMetaType : AbstractType, IMetaType
{
public override SqlType[] SqlTypes(IMapping mapping)
{
@@ -98,7 +98,12 @@ public override object Replace(object original, object current, ISessionImplemen
public override bool[] ToColumnNullness(object value, IMapping mapping)
{
- throw new NotSupportedException();
+ return NHibernateUtil.String.ToColumnNullness(value, mapping);
+ }
+
+ string IMetaType.GetMetaValue(string className, Dialect.Dialect dialect)
+ {
+ return NHibernateUtil.String.ObjectToSQLString(className, dialect);
}
}
}
diff --git a/src/NHibernate/Type/IMetaType.cs b/src/NHibernate/Type/IMetaType.cs
new file mode 100644
index 00000000000..6796c930476
--- /dev/null
+++ b/src/NHibernate/Type/IMetaType.cs
@@ -0,0 +1,7 @@
+namespace NHibernate.Type
+{
+ interface IMetaType
+ {
+ string GetMetaValue(string className, Dialect.Dialect dialect);
+ }
+}
\ No newline at end of file
diff --git a/src/NHibernate/Type/MetaType.cs b/src/NHibernate/Type/MetaType.cs
index 821d4fccb4c..ef9b62d5198 100644
--- a/src/NHibernate/Type/MetaType.cs
+++ b/src/NHibernate/Type/MetaType.cs
@@ -3,11 +3,12 @@
using System.Data.Common;
using NHibernate.Engine;
using NHibernate.SqlTypes;
+using NHibernate.Util;
namespace NHibernate.Type
{
[Serializable]
- public partial class MetaType : AbstractType
+ public partial class MetaType : AbstractType, IMetaType
{
private readonly IDictionary