From: <ric...@us...> - 2011-06-04 19:19:19
|
Revision: 5908 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5908&view=rev Author: ricbrown Date: 2011-06-04 19:19:12 +0000 (Sat, 04 Jun 2011) Log Message: ----------- NH-2662: Casting a joined alias in QueryOver loses alias context and looks for property on QueryOver root Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-06-04 15:54:40 UTC (rev 5907) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-06-04 19:19:12 UTC (rev 5908) @@ -212,6 +212,10 @@ return FindMemberExpression(memberExpression.Expression) + "." + memberExpression.Member.Name; } + else if (memberExpression.Expression.NodeType == ExpressionType.Convert) + { + return (FindMemberExpression(memberExpression.Expression) + "." + memberExpression.Member.Name).TrimStart('.'); + } else { return memberExpression.Member.Name; @@ -244,6 +248,9 @@ throw new Exception("Unrecognised method call in expression " + expression.ToString()); } + if (expression is ParameterExpression) + return ""; + throw new Exception("Could not determine member from " + expression.ToString()); } @@ -322,26 +329,11 @@ if (memberExpression.Expression == null) return false; // it's a member of a static class - if (memberExpression.Expression.NodeType == ExpressionType.Parameter) + if (IsMemberExpression(memberExpression.Expression)) return true; - if (IsNullableOfT(memberExpression.Member.DeclaringType)) - { - // it's a Nullable<T>, so ignore any .Value - if (memberExpression.Member.Name == "Value") - return IsMemberExpression(memberExpression.Expression); - } - - if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess) - { - if (IsMemberExpression(memberExpression.Expression)) - return true; - - // if the member has a null value, it was an alias - return EvaluatesToNull(memberExpression.Expression); - } - - return IsMemberExpression(memberExpression.Expression); + // if the member has a null value, it was an alias + return EvaluatesToNull(memberExpression.Expression); } if (expression is UnaryExpression) Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs 2011-06-04 15:54:40 UTC (rev 5907) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFixture.cs 2011-06-04 19:19:12 UTC (rev 5908) @@ -25,6 +25,14 @@ } [Test] + public void TestFindMemberExpressionReferenceCast() + { + Expression<Func<Person, string>> e = (Person p) => ((CustomPerson)p).MiddleName; + string property = ExpressionProcessor.FindMemberProjection(e.Body).ToString(); + Assert.AreEqual("MiddleName", property); + } + + [Test] public void TestFindMemberExpressionReferenceAlias() { Person personAlias = null; @@ -34,6 +42,15 @@ } [Test] + public void TestFindMemberExpressionReferenceCastAlias() + { + Person personAlias = null; + Expression<Func<string>> e = () => ((CustomPerson)personAlias).MiddleName; + string property = ExpressionProcessor.FindMemberProjection(e.Body).ToString(); + Assert.AreEqual("personAlias.MiddleName", property); + } + + [Test] public void TestFindMemberExpressionComponent() { Expression<Func<Person, string>> e = (Person p) => p.Father.Name; @@ -157,17 +174,19 @@ { var children = new List<Child> { new Child { Nickname = "test nickname" } }; Person person = - new Person() + new CustomPerson() { Name = "test name", + MiddleName = "test middle name", NullableAge = 4, Children = children, }; Assert.That(Projection(() => person.Name), Is.EqualTo("test name")); + Assert.That(Projection(() => ((CustomPerson)person).MiddleName), Is.EqualTo("test middle name")); Assert.That(Projection(() => "test name"), Is.EqualTo("test name")); Assert.That(Projection(() => person.NullableAge.Value), Is.EqualTo(4)); - Assert.That(Projection(() => person.GetType()), Is.EqualTo(typeof(Person))); + Assert.That(Projection(() => person.GetType()), Is.EqualTo(typeof(CustomPerson))); Assert.That(Projection(() => person.Children.First().Nickname), Is.EqualTo("test nickname")); Assert.That(Projection(() => children[0].Nickname), Is.EqualTo("test nickname")); } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs 2011-06-04 15:54:40 UTC (rev 5907) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs 2011-06-04 19:19:12 UTC (rev 5908) @@ -50,7 +50,10 @@ } - public class CustomPerson : Person { } + public class CustomPerson : Person + { + public virtual string MiddleName { get; set; } + } public class Child { Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:number + true Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Domain.cs 2011-06-04 19:19:12 UTC (rev 5908) @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2662 +{ + public class Customer + { + public virtual Guid Id + { + get; + protected set; + } + public virtual Order Order + { + get; + set; + } + } + + public class Order + { + public virtual Guid Id + { + get; + protected set; + } + + public virtual DateTime OrderDate + { + get; + set; + } + } + + public class PizzaOrder: Order + { + public virtual string PizzaName + { + get; + set; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Fixture.cs 2011-06-04 19:19:12 UTC (rev 5908) @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2662 +{ + public class Fixture : BugTestCase + { + [Test] + public void WhenCastAliasInQueryOverThenDoNotThrow() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var customer = new Customer + { + Order = new PizzaOrder { OrderDate = DateTime.Now, PizzaName = "Margarita" } + }; + + var customer2 = new Customer + { + Order = new Order { OrderDate = DateTime.Now.AddDays(1) } + }; + + session.Save(customer); + session.Save(customer2); + session.Flush(); + + Executing.This( + () => + { + var temp = session.Query<Customer>().Select( + c => new {c.Id, c.Order.OrderDate, ((PizzaOrder)c.Order).PizzaName }) + .ToArray(); + + foreach (var item in temp) { Trace.WriteLine(item.PizzaName);} + }) + .Should().NotThrow(); + + Executing.This( + () => + { + Order orderAlias = null; + + var results = + session.QueryOver<Customer>() + .Left.JoinAlias(o => o.Order, () => orderAlias) + .OrderBy(() => orderAlias.OrderDate).Asc + .SelectList(list => + list + .Select(o => o.Id) + .Select(() => orderAlias.OrderDate) + .Select(() => ((PizzaOrder) orderAlias).PizzaName)) + .List<object[]>(); + + Assert.That(results.Count, Is.EqualTo(2)); + Assert.That(results[0][2], Is.EqualTo("Margarita")); + + }).Should().NotThrow(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2662/Mappings.hbm.xml 2011-06-04 19:19:12 UTC (rev 5908) @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2662"> + + <class name="Customer"> + <id name="Id"> + <generator class="guid" /> + </id> + + <many-to-one name="Order" class="Order" column="OrderId" cascade="save-update" /> + + </class> + + <class name="Order" table="Orders"> + <id name="Id"> + <generator class="guid" /> + </id> + + <property name="OrderDate" /> + + <joined-subclass name="PizzaOrder" table="Pizzas"> + <key column="OrderId" /> + <property name="PizzaName" /> + </joined-subclass> + + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-06-04 15:54:40 UTC (rev 5907) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-06-04 19:19:12 UTC (rev 5908) @@ -847,6 +847,8 @@ <Compile Include="NHSpecificTest\NH2632\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2660And2661\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH2660And2661\Test.cs" /> + <Compile Include="NHSpecificTest\NH2662\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2662\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2673\Blog.cs" /> <Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" /> <Compile Include="NHSpecificTest\NH2691\Domain.cs" /> @@ -2712,6 +2714,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2662\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2703\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2736\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2721\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |