From: <fab...@us...> - 2010-09-01 18:39:50
|
Revision: 5177 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5177&view=rev Author: fabiomaulo Date: 2010-09-01 18:39:43 +0000 (Wed, 01 Sep 2010) Log Message: ----------- additional tests of NH-2029 (does not fail) Modified Paths: -------------- trunk/nhibernate/doc/reference/modules/filters.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs Modified: trunk/nhibernate/doc/reference/modules/filters.xml =================================================================== --- trunk/nhibernate/doc/reference/modules/filters.xml 2010-09-01 17:44:35 UTC (rev 5176) +++ trunk/nhibernate/doc/reference/modules/filters.xml 2010-09-01 18:39:43 UTC (rev 5177) @@ -124,6 +124,14 @@ the operator. </para> + <para> + Default all filter definitions are applied to <literal><many-to-one/></literal> and + <literal><one-to-one/></literal> elements. You can turn off this behaviour by + using <literal>use-many-to-one</literal> attribute on <literal><filter-def/></literal> + element. + </para> + <programlisting><![CDATA[<filter-def name="effectiveDate" use-many-to-one="false"/>]]></programlisting> + </sect1> </chapter> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs 2010-09-01 17:44:35 UTC (rev 5176) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs 2010-09-01 18:39:43 UTC (rev 5177) @@ -16,12 +16,14 @@ private static IList<Parent> joinGraphUsingCriteria(ISession s) { - return s.CreateCriteria(typeof (Parent)).SetFetchMode("Child", FetchMode.Join).List<Parent>(); + return s.CreateCriteria(typeof(Parent)).SetFetchMode("Child", FetchMode.Join).List<Parent>(); } private static Parent createParent() { - return new Parent {Child = new Child()}; + var ret = new Parent { Child = new Child() }; + ret.Address = new Address { Parent = ret }; + return ret; } private static void enableFilters(ISession s) @@ -95,39 +97,125 @@ } } - [Test] - public void VerifyQueryWithWhereClause() - { - using (ISession s = OpenSession()) - { - using (ITransaction tx = s.BeginTransaction()) - { - var p = createParent(); - p.ParentString = "a"; - p.Child.ChildString = "b"; - s.Save(p); - tx.Commit(); - } - } - IList<Parent> resCriteria; - IList<Parent> resHql; - using (ISession s = OpenSession()) - { - enableFilters(s); - resCriteria = s.CreateCriteria(typeof(Parent), "p") - .CreateCriteria("Child", "c") - .SetFetchMode("Child", FetchMode.Join) - .Add(Restrictions.Eq("p.ParentString", "a")) - .Add(Restrictions.Eq("c.ChildString", "b")) - .List<Parent>(); - resHql = s.CreateQuery(@"select p from Parent p + [Test] + public void VerifyQueryWithWhereClause() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + var p = createParent(); + p.ParentString = "a"; + p.Child.ChildString = "b"; + s.Save(p); + tx.Commit(); + } + } + IList<Parent> resCriteria; + IList<Parent> resHql; + using (ISession s = OpenSession()) + { + enableFilters(s); + resCriteria = s.CreateCriteria(typeof(Parent), "p") + .CreateCriteria("Child", "c") + .SetFetchMode("Child", FetchMode.Join) + .Add(Restrictions.Eq("p.ParentString", "a")) + .Add(Restrictions.Eq("c.ChildString", "b")) + .List<Parent>(); + resHql = s.CreateQuery(@"select p from Parent p join fetch p.Child c where p.ParentString='a' and c.ChildString='b'").List<Parent>(); - } - Assert.AreEqual(1, resCriteria.Count); - Assert.IsNotNull(resCriteria[0].Child); - Assert.AreEqual(1, resHql.Count); - Assert.IsNotNull(resHql[0].Child); - } + } + Assert.AreEqual(1, resCriteria.Count); + Assert.IsNotNull(resCriteria[0].Child); + Assert.AreEqual(1, resHql.Count); + Assert.IsNotNull(resHql[0].Child); + } + + [Test] + public void VerifyAlwaysFiltersOnPropertyRef() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + Parent p = createParent(); + s.Save(p); + tx.Commit(); + } + } + + using (ISession s = OpenSession()) + { + enableFilters(s); + IList<Parent> resCriteria = joinGraphUsingCriteria(s); + IList<Parent> resHql = joinGraphUsingHql(s); + + Assert.IsNotNull(resCriteria[0].Address); + Assert.IsNotNull(resHql[0].Address); + } + } + + [Test] + public void ExplicitFiltersOnCollectionsShouldBeActive() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + Parent p = createParent(); + p.Children = new List<Child> + { + new Child {IsActive = true}, + new Child {IsActive = false}, + new Child {IsActive = true} + }; + s.Save(p); + tx.Commit(); + } + } + + using (ISession s = OpenSession()) + { + IFilter f = s.EnableFilter("active"); + f.SetParameter("active", 1); + IList<Parent> resCriteria = joinGraphUsingCriteria(s); + IList<Parent> resHql = joinGraphUsingHql(s); + + Assert.AreEqual(2, resCriteria[0].Children.Count); + Assert.AreEqual(2, resHql[0].Children.Count); + } + } + + [Test] + public void ExplicitFiltersOnCollectionsShouldBeActiveWithEagerLoad() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + Parent p = createParent(); + p.Children = new List<Child> + { + new Child {IsActive = true}, + new Child {IsActive = false}, + new Child {IsActive = true} + }; + s.Save(p); + tx.Commit(); + } + } + + using (ISession s = OpenSession()) + { + IFilter f = s.EnableFilter("active"); + f.SetParameter("active", 1); + IList<Parent> resCriteria = s.CreateCriteria(typeof(Parent)).SetFetchMode("Children", FetchMode.Join).List<Parent>(); + IList<Parent> resHql = s.CreateQuery("select p from Parent p join fetch p.Children").List<Parent>(); + + Assert.AreEqual(2, resCriteria[0].Children.Count); + Assert.AreEqual(2, resHql[0].Children.Count); + } + } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml 2010-09-01 17:44:35 UTC (rev 5176) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml 2010-09-01 18:39:43 UTC (rev 5177) @@ -10,6 +10,12 @@ <many-to-one name="Child" class="Child" cascade="all" not-null="true"/> <property name="ParentString"/> + <one-to-one name="Address" property-ref="Parent" cascade="all"/> + <bag name="Children" cascade="all"> + <key column="Parent" /> + <one-to-many class="Child"/> + <filter name="active" condition=":active = IsActive"/> + </bag> </class> <class name="Child"> @@ -20,13 +26,28 @@ <property name="Always"/> <property name="ChildString"/> <filter name="activeChild" condition=":active = IsActive" /> + <filter name="active" condition=":active = IsActive" /> <filter name="alwaysValid" condition=":always = Always" /> </class> + + <class name="Address"> + <id name="Id"> + <generator class="guid.comb"/> + </id> + <property name="IsActive"/> + <many-to-one name="Parent" /> + <filter name="active" condition=":active = IsActive" /> + </class> + <filter-def name="activeChild" use-many-to-one="false"> <filter-param name="active" type="int"/> </filter-def> + <filter-def name="active" use-many-to-one="false"> + <filter-param name="active" type="int"/> + </filter-def> + <filter-def name="alwaysValid"> <filter-param name="always" type="int"/> </filter-def> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs 2010-09-01 17:44:35 UTC (rev 5176) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs 2010-09-01 18:39:43 UTC (rev 5177) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace NHibernate.Test.NHSpecificTest.ManyToOneFilters20Behaviour { @@ -6,7 +7,9 @@ { public virtual Guid Id { get; set; } public virtual Child Child { get; set; } - public virtual string ParentString { get; set; } + public virtual Address Address { get; set; } + public virtual IList<Child> Children { get; set; } + public virtual string ParentString { get; set; } } public class Child @@ -19,6 +22,13 @@ public virtual Guid Id { get; set; } public virtual bool IsActive { get; set; } public virtual bool Always { get; set; } - public virtual string ChildString { get; set; } + public virtual string ChildString { get; set; } } + + public class Address + { + public virtual Guid Id { get; set; } + public virtual Parent Parent { get; set; } + public virtual bool IsActive { get; set; } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |