From: <aye...@us...> - 2009-08-14 06:58:09
|
Revision: 4691 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4691&view=rev Author: ayenderahien Date: 2009-08-14 06:57:52 +0000 (Fri, 14 Aug 2009) Log Message: ----------- Fixing NH-1927, will not duplicate filter condition to where clause if it is already on the join clause. Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Fixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Model.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-08-14 05:26:21 UTC (rev 4690) +++ branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-08-14 06:57:52 UTC (rev 4691) @@ -575,7 +575,9 @@ if (enabledFilters.Count > 0) { var manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFilters); - outerjoin.AddCondition(manyToOneFilterFragment); + var joinClauseDoesNotContainsFilterAlready = outerjoin.ToFromFragmentString.IndexOfCaseInsensitive(manyToOneFilterFragment) == -1; + if(joinClauseDoesNotContainsFilterAlready) + outerjoin.AddCondition(manyToOneFilterFragment); } } last = oj; Property changes on: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927 ___________________________________________________________________ Added: svn:mergeinfo + Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Fixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Fixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Fixture.cs 2009-08-14 06:57:52 UTC (rev 4691) @@ -0,0 +1,105 @@ +using System; +using NHibernate.Criterion; +using NHibernate.SqlCommand; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1927 +{ + [TestFixture] + public class Fixture : BugTestCase + { + private static readonly DateTime MAX_DATE = new DateTime(3000, 1, 1); + private static readonly DateTime VALID_DATE = new DateTime(2000, 1, 1); + + protected override void OnSetUp() + { + base.OnSetUp(); + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + var joe = new Customer() {ValidUntil = MAX_DATE}; + session.Save(joe); + + tx.Commit(); + } + } + } + + protected override void OnTearDown() + { + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + session.Delete("from Invoice"); + session.Delete("from Customer"); + tx.Commit(); + } + } + base.OnTearDown(); + } + + private delegate Customer QueryFactoryFunc(ISession session); + + private void TestQuery(QueryFactoryFunc queryFactoryFunc) + { + // test without filter + using (ISession session = OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + Assert.That(queryFactoryFunc(session), Is.Not.Null, "failed with filter off"); + tx.Commit(); + } + + // test with the validity filter + using (ISession session = OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + session.EnableFilter("validity").SetParameter("date", VALID_DATE); + Assert.That(queryFactoryFunc(session), Is.Not.Null, "failed with filter on"); + tx.Commit(); + } + + } + + [Test] + public void CriteriaWithEagerFetch() + { + TestQuery(s => s.CreateCriteria(typeof (Customer)) + .SetFetchMode("Invoices", FetchMode.Eager) + .UniqueResult<Customer>() + ); + } + + [Test] + public void CriteriaWithoutEagerFetch() + { + TestQuery(s => s + .CreateCriteria(typeof(Customer)) + .UniqueResult<Customer>() + ); + } + + [Test] + public void HqlWithEagerFetch() + { + TestQuery(s => s.CreateQuery(@" + select c + from Customer c + left join fetch c.Invoices" + ) + .UniqueResult<Customer>()); + } + + [Test] + public void HqlWithoutEagerFetch() + { + TestQuery(s => s.CreateQuery(@" + select c + from Customer c" + ) + .UniqueResult<Customer>()); + } + } +} Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Mappings.hbm.xml 2009-08-14 06:57:52 UTC (rev 4691) @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1927"> + + <class name="Customer" > + <id name="ID" type="Int32"> + <generator class="hilo" /> + </id> + + <set name="Invoices" inverse="true" lazy="true" > + <key column="CustomerID"/> + <one-to-many class="Invoice"/> + <filter name="validity" condition="ValidUntil > :date" /> + </set> + + <property name="ValidUntil" type="DateTime" /> + <filter name="validity" condition="ValidUntil > :date" /> + </class> + + <class name="Invoice"> + <id name="ID" type="Int32"> + <generator class="hilo" /> + </id> + + <property name="ValidUntil" type="DateTime" /> + <many-to-one name="Customer" column="CustomerID" class="Customer"/> + <filter name="validity" condition="ValidUntil > :date" /> + </class> + + <filter-def name="validity"> + <filter-param name="date" type="DateTime"/> + </filter-def> +</hibernate-mapping> Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Model.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Model.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1927/Model.cs 2009-08-14 06:57:52 UTC (rev 4691) @@ -0,0 +1,19 @@ +using System; +using Iesi.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1927 +{ + public class Customer + { + public virtual int ID { get; private set; } + public virtual ISet<Invoice> Invoices { get; set; } + public virtual DateTime ValidUntil { get; set; } + } + + public class Invoice + { + public virtual int ID { get; private set; } + public virtual DateTime ValidUntil { get; set; } + public virtual Customer Customer { get; set; } + } +} Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-08-14 05:26:21 UTC (rev 4690) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-08-14 06:57:52 UTC (rev 4691) @@ -359,6 +359,10 @@ <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagPartialNameFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\Something.cs" /> + <Compile Include="NHSpecificTest\NH1919\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1919\Model.cs" /> + <Compile Include="NHSpecificTest\NH1927\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1927\Model.cs" /> <Compile Include="NHSpecificTest\NH1928\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1928\Model.cs" /> <Compile Include="NHSpecificTest\NH1044\Domain.cs" /> @@ -1966,6 +1970,8 @@ <EmbeddedResource Include="Bytecode\Lightweight\ProductLine.hbm.xml" /> <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1919\Mappings.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH1927\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1928\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1914\Mappings.hbm.xml" /> <EmbeddedResource Include="IdTest\AssignedClass.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |