From: <te...@us...> - 2009-01-27 15:01:23
|
Revision: 4005 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4005&view=rev Author: tehlike Date: 2009-01-27 15:01:15 +0000 (Tue, 27 Jan 2009) Log Message: ----------- Adding Where to Extra Lazy queries. Fix for NH-1627 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Extralazy/Photo.cs Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2009-01-27 04:23:01 UTC (rev 4004) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2009-01-27 15:01:15 UTC (rev 4005) @@ -836,15 +836,25 @@ return frag.ToSqlStringFragment(false); } - + private SqlString AddWhereFragment(SqlString sql) + { + if (!hasWhere) + return sql; + var sqlStringBuilder = new SqlStringBuilder(sql); + sqlStringBuilder.Add(" and ").Add(sqlWhereString); + return sqlStringBuilder.ToSqlString(); + } private SqlString GenerateSelectSizeString(bool isIntegerIndexed) { string selectValue = isIntegerIndexed ? "max(" + IndexColumnNames[0] + ") + 1" : "count(" + ElementColumnNames[0] + ")"; //sets, maps, bags - return - new SqlSimpleSelectBuilder(dialect, factory).SetTableName(TableName).AddWhereFragment(KeyColumnNames, KeyType, "="). - AddColumn(selectValue).ToSqlString(); + + var sqlString=new SqlSimpleSelectBuilder(dialect, factory) + .SetTableName(TableName) + .AddWhereFragment(KeyColumnNames, KeyType, "=") + .AddColumn(selectValue).ToSqlString(); + return AddWhereFragment(sqlString); } private SqlString GenerateDetectRowByIndexString() @@ -855,10 +865,14 @@ } // TODO NH: may be we need something else when Index is mixed with Formula - return - new SqlSimpleSelectBuilder(dialect, factory).SetTableName(TableName).AddWhereFragment(KeyColumnNames, KeyType, "="). - AddWhereFragment(IndexColumnNames, IndexType, "=").AddWhereFragment(indexFormulas, IndexType, "=").AddColumn("1"). - ToSqlString(); + var sqlString= + new SqlSimpleSelectBuilder(dialect, factory) + .SetTableName(TableName) + .AddWhereFragment(KeyColumnNames, KeyType, "=") + .AddWhereFragment(IndexColumnNames, IndexType, "=") + .AddWhereFragment(indexFormulas, IndexType, "=") + .AddColumn("1").ToSqlString(); + return AddWhereFragment(sqlString); } private SqlString GenerateSelectRowByIndexString() @@ -868,18 +882,26 @@ return null; } - return - new SqlSimpleSelectBuilder(dialect, factory).SetTableName(TableName).AddWhereFragment(KeyColumnNames, KeyType, "="). - AddWhereFragment(IndexColumnNames, IndexType, "=").AddWhereFragment(indexFormulas, IndexType, "=").AddColumns( - ElementColumnNames, elementColumnAliases).AddColumns(indexFormulas, indexColumnAliases).ToSqlString(); + var sqlString=new SqlSimpleSelectBuilder(dialect, factory) + .SetTableName(TableName) + .AddWhereFragment(KeyColumnNames, KeyType, "=") + .AddWhereFragment(IndexColumnNames, IndexType, "=") + .AddWhereFragment(indexFormulas, IndexType, "=") + .AddColumns(ElementColumnNames, elementColumnAliases) + .AddColumns(indexFormulas, indexColumnAliases).ToSqlString(); + return AddWhereFragment(sqlString); } private SqlString GenerateDetectRowByElementString() { - return - new SqlSimpleSelectBuilder(dialect, factory).SetTableName(TableName).AddWhereFragment(KeyColumnNames, KeyType, "="). - AddWhereFragment(ElementColumnNames, ElementType, "=").AddWhereFragment(elementFormulas, ElementType, "="). - AddColumn("1").ToSqlString(); + var sqlString= + new SqlSimpleSelectBuilder(dialect, factory) + .SetTableName(TableName) + .AddWhereFragment(KeyColumnNames, KeyType, "=") + .AddWhereFragment(ElementColumnNames, ElementType, "=") + .AddWhereFragment(elementFormulas, ElementType, "=") + .AddColumn("1").ToSqlString(); + return AddWhereFragment(sqlString); } protected virtual SelectFragment GenerateSelectFragment(string alias, string columnSuffix) Modified: trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs 2009-01-27 04:23:01 UTC (rev 4004) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/ExtraLazyFixture.cs 2009-01-27 15:01:15 UTC (rev 4005) @@ -21,7 +21,40 @@ { get { return null; } } + [Test] + public void ExtraLazyWithWhereClause() + { + using(ISession s = OpenSession()) + using(ITransaction t=s.BeginTransaction()) + { + s.CreateSQLQuery("insert into Users (Name,Password) values('gavin','secret')") + .UniqueResult(); + s.CreateSQLQuery("insert into Photos (Title,Owner) values('PRVaaa','gavin')") + .UniqueResult(); + s.CreateSQLQuery("insert into Photos (Title,Owner) values('PUBbbb','gavin')") + .UniqueResult(); + t.Commit(); + } + using(ISession s = OpenSession()) + { + var gavin = s.Get<User>("gavin"); + Assert.AreEqual(1, gavin.Photos.Count); + Assert.IsFalse(NHibernateUtil.IsInitialized(gavin.Documents)); + } + using(ISession s=OpenSession()) + using(ITransaction t=s.BeginTransaction()) + { + s.CreateSQLQuery("delete from Photos") + .UniqueResult(); + s.CreateSQLQuery("delete from Users") + .UniqueResult(); + + t.Commit(); + } + sessions.Evict(typeof(User)); + sessions.Evict(typeof(Photo)); + } [Test] public void OrphanDelete() { Added: trunk/nhibernate/src/NHibernate.Test/Extralazy/Photo.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/Photo.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/Photo.cs 2009-01-27 15:01:15 UTC (rev 4005) @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.Extralazy +{ + public class Photo + { + + protected Photo() {} + public Photo(string title, User owner) + { + this.Title = title; + this.Owner = owner; + } + + public virtual string Title + { + get; set; + } + + public virtual User Owner + { + get; set; + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs 2009-01-27 04:23:01 UTC (rev 4004) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/User.cs 2009-01-27 15:01:15 UTC (rev 4005) @@ -9,6 +9,7 @@ private string password; private IDictionary session = new Hashtable(); private ISet documents = new HashedSet(); + private ISet photos = new HashedSet(); protected User() {} public User(string name, string password) { @@ -39,5 +40,12 @@ get { return documents; } set { documents = value; } } + + + public virtual ISet Photos + { + get { return photos; } + set { photos = value; } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml 2009-01-27 04:23:01 UTC (rev 4004) +++ trunk/nhibernate/src/NHibernate.Test/Extralazy/UserGroup.hbm.xml 2009-01-27 15:01:15 UTC (rev 4005) @@ -25,8 +25,15 @@ <key column="owner"/> <one-to-many class="Document"/> </set> + <set name="Photos" inverse="true" lazy="true" where="Title like 'PRV%'" cascade="all,delete-orphan"> + <key column="owner"/> + <one-to-many class="Photo"/> + </set> </class> - + <class name="Photo" table="photos"> + <id name="Title"/> + <many-to-one name="Owner" not-null="true"/> + </class> <class name="Document" table="documents"> <id name="Title"/> <property name="Content" type="string" length="10000"/> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-01-27 04:23:01 UTC (rev 4004) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-01-27 15:01:15 UTC (rev 4005) @@ -224,6 +224,7 @@ <Compile Include="Extralazy\Document.cs" /> <Compile Include="Extralazy\ExtraLazyFixture.cs" /> <Compile Include="Extralazy\Group.cs" /> + <Compile Include="Extralazy\Photo.cs" /> <Compile Include="Extralazy\SessionAttribute.cs" /> <Compile Include="Extralazy\User.cs" /> <Compile Include="FilterTest\BinaryFiltered.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |