From: <fab...@us...> - 2011-05-30 16:50:36
|
Revision: 5887 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5887&view=rev Author: fabiomaulo Date: 2011-05-30 16:50:30 +0000 (Mon, 30 May 2011) Log Message: ----------- Fix NH-2328, NH-2741 (thanks to Andrei Alecu, patch applied with modifications) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs trunk/nhibernate/src/NHibernate/Type/MetaType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs 2011-05-30 16:33:17 UTC (rev 5886) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/BinaryLogicOperatorNode.cs 2011-05-30 16:50:30 UTC (rev 5887) @@ -6,6 +6,7 @@ using NHibernate.Param; using NHibernate.SqlCommand; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Hql.Ast.ANTLR.Tree { @@ -50,7 +51,7 @@ { throw new SemanticException( "right-hand operand of a binary operator was null" ); } - + ProcessMetaTypeDiscriminatorIfNecessary(lhs, rhs); IType lhsType = ExtractDataType( lhs ); IType rhsType = ExtractDataType( rhs ); @@ -265,5 +266,40 @@ return type; } + + private void ProcessMetaTypeDiscriminatorIfNecessary(IASTNode lhs, IASTNode rhs) + { + // this method inserts the discriminator value for the rhs node so that .class queries on <any> mappings work with the class name + var lhsNode = lhs as SqlNode; + var rhsNode = rhs as SqlNode; + if (lhsNode == null || rhsNode == null) + { + return; + } + if (rhsNode.Text == null) + { + var lhsNodeMetaType = lhsNode.DataType as MetaType; + if (lhsNodeMetaType != null) + { + string className = SessionFactoryHelper.GetImportedClassName(rhsNode.OriginalText); + + object discriminatorValue = lhsNodeMetaType.GetMetaValue(TypeNameParser.Parse(className).Type); + rhsNode.Text = discriminatorValue.ToString(); + return; + } + } + if (lhsNode.Text == null) + { + var rhsNodeMetaType = rhsNode.DataType as MetaType; + if (rhsNodeMetaType != null) + { + string className = SessionFactoryHelper.GetImportedClassName(lhsNode.OriginalText); + + object discriminatorValue = rhsNodeMetaType.GetMetaValue(TypeNameParser.Parse(className).Type); + lhsNode.Text = discriminatorValue.ToString(); + return; + } + } + } } } Modified: trunk/nhibernate/src/NHibernate/Type/MetaType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/MetaType.cs 2011-05-30 16:33:17 UTC (rev 5886) +++ trunk/nhibernate/src/NHibernate/Type/MetaType.cs 2011-05-30 16:50:30 UTC (rev 5887) @@ -117,5 +117,9 @@ return (string)value; //value is the entity name } + internal object GetMetaValue(string className) + { + return keys[className]; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs 2011-05-30 16:33:17 UTC (rev 5886) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs 2011-05-30 16:50:30 UTC (rev 5887) @@ -56,7 +56,6 @@ } [Test] - [Ignore("VisitTypeBinaryExpression generates HQL tree with string constant, but DB has a number")] public void AnyIs_Linq() { using (ISession s = OpenSession()) @@ -72,18 +71,31 @@ } [Test] - [Description("Is this right? - the HQL translation should turn the class-string to an int, not the user?")] - public void AnyIs_HqlRequiresNumberIn() + public void AnyIs_HqlWorksWithClassNameInTheRight() { using (ISession s = OpenSession()) { var boxes = - s.CreateQuery("from ToyBox t where t.Shape.class = 2") + s.CreateQuery("from ToyBox t where t.Shape.class = Square") .List<ToyBox>(); Assert.That(boxes.Count, Is.EqualTo(1)); Assert.That(boxes[0].Name, Is.EqualTo("Box2")); } } + + [Test] + public void AnyIs_HqlWorksWithClassNameInTheLeft() + { + using (ISession s = OpenSession()) + { + var boxes = + s.CreateQuery("from ToyBox t where Square = t.Shape.class") + .List<ToyBox>(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |