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 values; private readonly IDictionary keys; @@ -96,9 +97,15 @@ public override bool[] ToColumnNullness(object value, IMapping mapping) return baseType.ToColumnNullness(value, mapping); } - internal object GetMetaValue(string className) + string IMetaType.GetMetaValue(string className, Dialect.Dialect dialect) { - return keys[className]; + var raw = keys[className]; + if (baseType is ILiteralType literalType) + { + return literalType.ObjectToSQLString(raw, dialect); + } + + return raw?.ToString(); } } }