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