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