From: <ric...@us...> - 2010-10-10 07:47:23
|
Revision: 5243 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5243&view=rev Author: ricbrown Date: 2010-10-10 07:47:16 +0000 (Sun, 10 Oct 2010) Log Message: ----------- Partial Fix NH-2328 (Linq query on <Any/> fails): Fixed for QueryOver Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -425,7 +425,7 @@ if (expression is TypeBinaryExpression) { TypeBinaryExpression typeBinaryExpression = (TypeBinaryExpression)expression; - return Restrictions.Eq(ClassMember(typeBinaryExpression.Expression), typeBinaryExpression.TypeOperand); + return Restrictions.Eq(ClassMember(typeBinaryExpression.Expression), typeBinaryExpression.TypeOperand.FullName); } throw new Exception("Could not determine member type from " + expression.NodeType + ", " + expression.ToString() + ", " + expression.GetType()); Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -210,6 +210,78 @@ } [Test] + public void IsType() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + var father1 = new Person() { Name = "Father 1" }; + var father2 = new CustomPerson() { Name = "Father 2" }; + + var person1 = new Person() { Name = "Person 1", Father = father2 }; + var person2 = new CustomPerson() { Name = "Person 2", Father = father1 }; + + s.Save(father1); + s.Save(father2); + + s.Save(person1); + s.Save(person2); + + t.Commit(); + } + + using (ISession s = OpenSession()) + { + var actual = + s.QueryOver<Person>() + .Where(p => p is CustomPerson) + .And(p => p.Father != null) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 2")); + } + + using (ISession s = OpenSession()) + { + var actual = + s.QueryOver<Person>() + .Where(p => p.GetType() == typeof(CustomPerson)) + .And(p => p.Father != null) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 2")); + } + + using (ISession s = OpenSession()) + { + Person f = null; + var actual = + s.QueryOver<Person>() + .JoinAlias(p => p.Father, () => f) + .Where(() => f is CustomPerson) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 1")); + } + + using (ISession s = OpenSession()) + { + Person f = null; + var actual = + s.QueryOver<Person>() + .JoinAlias(p => p.Father, () => f) + .Where(() => f.GetType() == typeof(CustomPerson)) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 1")); + } + } + + [Test] public void SubCriteria() { using (ISession s = OpenSession()) Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml 2010-10-10 07:47:16 UTC (rev 5243) @@ -7,13 +7,16 @@ <id name="Id"> <generator class="native"/> </id> + <discriminator type="string" /> <property name="Name" /> <property name="Age" /> <property name="Blood" /> + <many-to-one name="Father" class="Person" /> <bag name="Children" inverse="true" cascade="all-delete-orphan"> <key column="Parent" /> <one-to-many class="Child" /> </bag> + <subclass name="CustomPerson" /> </class> <class name="Child"> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -28,7 +28,7 @@ .Add(Restrictions.Lt("Age", 50)) .Add(Restrictions.Le("Age", 49)) .Add(Restrictions.Eq("class", typeof(Person))) - .Add(Restrictions.Eq("class", typeof(Person))); + .Add(Restrictions.Eq("class", typeof(Person).FullName)); IQueryOver<Person> actual = CreateTestQueryOver<Person>() @@ -187,7 +187,7 @@ .Add(Restrictions.Lt("personAlias.Age", 50)) .Add(Restrictions.Le("personAlias.Age", 49)) .Add(Restrictions.Eq("personAlias.class", typeof(Person))) - .Add(Restrictions.Eq("personAlias.class", typeof(Person))); + .Add(Restrictions.Eq("personAlias.class", typeof(Person).FullName)); Person personAlias = null; IQueryOver<Person> actual = Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -0,0 +1,89 @@ +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2328 +{ + [TestFixture] + public class Fixture : BugTestCase + { + 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 void AnyIs_QueryOver() + { + using (ISession s = OpenSession()) + { + var boxes = + s.QueryOver<ToyBox>() + .Where(t => t.Shape is Square) + .List(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } + + [Test] + [Ignore("VisitTypeBinaryExpression generates HQL tree with string constant, but DB has a number")] + public void AnyIs_Linq() + { + using (ISession s = OpenSession()) + { + var boxes = + (from t in s.Query<ToyBox>() + where t.Shape is Square + select t).ToList(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } + + [Test] + [Description("Is this right? - the HQL translation should turn the class-string to an int, not the user?")] + public void AnyIs_HqlRequiresNumberIn() + { + using (ISession s = OpenSession()) + { + var boxes = + s.CreateQuery("from ToyBox t where t.Shape.class = 2") + .List<ToyBox>(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml 2010-10-10 07:47:16 UTC (rev 5243) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2328"> + + <class name="ToyBox"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Name" /> + <any name="Shape" id-type="int" meta-type="int"> + <meta-value value="1" class="Circle"/> + <meta-value value="2" class="Square"/> + <column name="s_object_id" /> + <column name="object_id" /> + </any> + </class> + + <class name="Square"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + + <class name="Circle"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -0,0 +1,23 @@ +namespace NHibernate.Test.NHSpecificTest.NH2328 +{ + public class ToyBox + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual IShape Shape { get; set; } + } + + public interface IShape + { + } + + public class Circle : IShape + { + public virtual int Id { get; set; } + } + + public class Square : IShape + { + public virtual int Id { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-10 07:47:16 UTC (rev 5243) @@ -519,6 +519,8 @@ <Compile Include="NHSpecificTest\NH2324\CompositeUserType.cs" /> <Compile Include="NHSpecificTest\NH2324\Entity.cs" /> <Compile Include="NHSpecificTest\NH2324\BulkUpdateWithCustomCompositeType.cs" /> + <Compile Include="NHSpecificTest\NH2328\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2328\Model.cs" /> <Compile Include="NHSpecificTest\NH2331\Forum.cs" /> <Compile Include="NHSpecificTest\NH2331\MemberGroup.cs" /> <Compile Include="NHSpecificTest\NH2331\Nh2331Test.cs" /> @@ -2326,6 +2328,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2328\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2313\Mappings.hbm.xml" /> <EmbeddedResource Include="TypesTest\UriClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameWithFullName\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |