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