|
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.
|