From: <aye...@us...> - 2010-12-27 14:12:30
|
Revision: 5341 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5341&view=rev Author: ayenderahien Date: 2010-12-27 14:12:24 +0000 (Mon, 27 Dec 2010) Log Message: ----------- Fixing an issue where filters would not be considered for extra lazy collection queries Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2010-12-26 15:53:13 UTC (rev 5340) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2010-12-27 14:12:24 UTC (rev 5341) @@ -42,7 +42,6 @@ private readonly SqlCommandInfo sqlInsertRowString; private readonly SqlCommandInfo sqlUpdateRowString; private readonly SqlCommandInfo sqlDeleteRowString; - private readonly SqlString sqlSelectSizeString; private readonly SqlString sqlSelectRowByIndexString; private readonly SqlString sqlDetectRowByIndexString; private readonly SqlString sqlDetectRowByElementString; @@ -478,7 +477,7 @@ deleteAllCheckStyle = ExecuteUpdateResultCheckStyle.None; } - sqlSelectSizeString = GenerateSelectSizeString(collection.IsIndexed && !collection.IsMap); + isCollectionIntegerIndex = collection.IsIndexed && !collection.IsMap; sqlDetectRowByIndexString = GenerateDetectRowByIndexString(); sqlDetectRowByElementString = GenerateDetectRowByElementString(); sqlSelectRowByIndexString = GenerateSelectRowByIndexString(); @@ -840,21 +839,21 @@ { if (!hasWhere) return sql; - var sqlStringBuilder = new SqlStringBuilder(sql); - sqlStringBuilder.Add(" and ").Add(sqlWhereString); - return sqlStringBuilder.ToSqlString(); + return sql.Append(" and ").Append(sqlWhereString); } - private SqlString GenerateSelectSizeString(bool isIntegerIndexed) + + private SqlString GenerateSelectSizeString(ISessionImplementor sessionImplementor) { - string selectValue = isIntegerIndexed + string selectValue = isCollectionIntegerIndex ? "max(" + IndexColumnNames[0] + ") + 1" : "count(" + ElementColumnNames[0] + ")"; //sets, maps, bags - - var sqlString=new SqlSimpleSelectBuilder(dialect, factory) - .SetTableName(TableName) - .AddWhereFragment(KeyColumnNames, KeyType, "=") - .AddColumn(selectValue).ToSqlString(); - return AddWhereFragment(sqlString); + + return new SqlSimpleSelectBuilder(dialect, factory) + .SetTableName(TableName) + .AddWhereFragment(KeyColumnNames, KeyType, "=") + .AddColumn(selectValue) + .ToSqlString() + .Append(FilterFragment(TableName, sessionImplementor.EnabledFilters)); } private SqlString GenerateDetectRowByIndexString() @@ -1507,7 +1506,12 @@ using(new SessionIdLoggingContext(session.SessionId)) try { - IDbCommand st = session.Batcher.PrepareCommand(CommandType.Text, sqlSelectSizeString, KeyType.SqlTypes(factory)); + if(session.EnabledFilters.Count > 0) + { + + } + + IDbCommand st = session.Batcher.PrepareCommand(CommandType.Text, GenerateSelectSizeString(session), KeyType.SqlTypes(factory)); IDataReader rs = null; try { @@ -1524,7 +1528,7 @@ { throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, sqle, "could not retrieve collection size: " - + MessageHelper.InfoString(this, key, Factory), sqlSelectSizeString); + + MessageHelper.InfoString(this, key, Factory), GenerateSelectSizeString(session)); } } @@ -1575,7 +1579,7 @@ { throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, sqle, "could not check row existence: " + MessageHelper.InfoString(this, key, Factory), - sqlSelectSizeString); + GenerateSelectSizeString(session)); } } @@ -1618,7 +1622,7 @@ { throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, sqle, "could not read row: " + MessageHelper.InfoString(this, key, Factory), - sqlSelectSizeString); + GenerateSelectSizeString(session)); } } @@ -2006,8 +2010,9 @@ #region IPostInsertIdentityPersister Members private string identitySelectString; + private bool isCollectionIntegerIndex; - public string IdentitySelectString + public string IdentitySelectString { get { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Domain.cs 2010-12-27 14:12:24 UTC (rev 5341) @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.BagWithLazyExtraAndFilter +{ + public class Env + { + public virtual long Id { get; set; } + public virtual IList<MachineRequest> RequestsFailed { get; set; } + } + + public class MachineRequest + { + public virtual long Id { get; set; } + public virtual int MachineRequestCompletionStatusInt { get; set; } + public virtual long EnvId { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Fixture.cs 2010-12-27 14:12:24 UTC (rev 5341) @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.BagWithLazyExtraAndFilter +{ + [TestFixture] + public class Fixture: BugTestCase + { + [Test] + public void CanUseFilterForLazyExtra() + { + using (var s = OpenSession()) + { + s.BeginTransaction(); + var machineRequest = new MachineRequest { EnvId = 1L, Id = 2L }; + s.Save(new Env + { + Id = 1L, + RequestsFailed = new List<MachineRequest> + { + machineRequest + } + }); + s.Save(machineRequest); + s.Transaction.Commit(); + } + + using (var s = OpenSession()) + { + var env = s.Load<Env>(1L); + Assert.AreEqual(1, env.RequestsFailed.Count); + } + + using (var s = OpenSession()) + { + s.EnableFilter("CurrentOnly"); + var env = s.Load<Env>(1L); + Assert.AreEqual(0, env.RequestsFailed.Count); + } + + using (var s = OpenSession()) + { + s.BeginTransaction(); + s.Delete(s.Load<MachineRequest>(2L)); + s.Delete(s.Load<Env>(1L)); + s.Transaction.Commit(); + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/BagWithLazyExtraAndFilter/Mappings.hbm.xml 2010-12-27 14:12:24 UTC (rev 5341) @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.BagWithLazyExtraAndFilter" + assembly="NHibernate.Test"> + + <class name="Env" table="Envs" discriminator-value="null"> + <id name="Id" type="Int64" unsaved-value="none"> + <generator class="assigned"/> + </id> + <bag name="RequestsFailed" inverse="true" cascade="none" lazy="extra" + optimistic-lock="false" + where="MachineRequestCompletionStatusInt != 1"> + <key column="EnvId"/> + <one-to-many class="MachineRequest"/> + <filter name="CurrentOnly"/> + </bag> + + </class> + + + <class name="MachineRequest" table="MachineRequests" discriminator-value="null"> + <id name="Id" type="Int64" unsaved-value="none"> + <generator class="assigned"/> + </id> + <property name="EnvId"/> + <property name="MachineRequestCompletionStatusInt"/> + </class> + + <filter-def name="CurrentOnly" condition="1 = 0"/> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-26 15:53:13 UTC (rev 5340) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-27 14:12:24 UTC (rev 5341) @@ -457,6 +457,8 @@ <Compile Include="Linq\SumTests.cs" /> <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> + <Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Domain.cs" /> + <Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Fixture.cs" /> <Compile Include="NHSpecificTest\EntityNameAndCompositeId\Fixture.cs" /> <Compile Include="NHSpecificTest\EntityNameWithFullName\Fixture.cs" /> <Compile Include="NHSpecificTest\Futures\LinqFutureFixture.cs" /> @@ -2369,6 +2371,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\BagWithLazyExtraAndFilter\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2470\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2056\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2043\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |