From: <dav...@us...> - 2009-04-13 16:41:57
|
Revision: 4176 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4176&view=rev Author: davybrion Date: 2009-04-13 16:41:52 +0000 (Mon, 13 Apr 2009) Log Message: ----------- NH-1737: Make Future<T> fall back to regular List<T> implementation if the current RDBMS does not support query batching Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -828,7 +828,12 @@ public IEnumerable<T> Future<T>() { - session.FutureQueryBatch.Add(this); + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return List<T>(); + } + + session.FutureQueryBatch.Add(this); return session.FutureQueryBatch.GetEnumerator<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -379,6 +379,11 @@ public IEnumerable<T> Future<T>() { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return List<T>(); + } + session.FutureCriteriaBatch.Add(this); return session.FutureCriteriaBatch.GetEnumerator<T>(); } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -0,0 +1,63 @@ +using System; +using System.Collections; + +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Driver; + +using NUnit.Framework; + +using Environment=NHibernate.Cfg.Environment; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + public class TestDriver : SqlClientDriver + { + public override bool SupportsMultipleQueries + { + get { return false; } + } + } + + /// <summary> + /// I've restricted this fixture to MsSql and am using a Driver which derives from SqlClientDriver to + /// return false for the SupportsMultipleQueries property. This is purely to test the way NHibernate + /// will behave when the driver that's being used does not support multiple queries... so even though + /// the test is restricted to MsSql, it's only relevant for databases that don't support multiple queries + /// but this way it's just much easier to test this + /// </summary> + [TestFixture] + public class FallbackFixture : FutureFixture + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + protected override void Configure(Configuration configuration) + { + configuration.Properties[Environment.ConnectionDriver] = "NHibernate.Test.NHSpecificTest.Futures.TestDriver, NHibernate.Test"; + base.Configure(configuration); + } + + [Test] + public void CriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + { + using (var session = sessions.OpenSession()) + { + var results = session.CreateCriteria<Person>().Future<Person>(); + results.GetEnumerator().MoveNext(); + } + } + + [Test] + public void QueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + { + using (var session = sessions.OpenSession()) + { + var results = session.CreateQuery("from Person").Future<Person>(); + results.GetEnumerator().MoveNext(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -4,32 +4,15 @@ namespace NHibernate.Test.NHSpecificTest.Futures { - using System.Collections; - [TestFixture] - public class FutureCriteriaFixture : TestCase + public class FutureCriteriaFixture : FutureFixture { - - protected override IList Mappings - { - get { return new string[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - [Test] public void CanUseFutureCriteria() { using (var s = sessions.OpenSession()) { - if(((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons10 = s.CreateCriteria(typeof(Person)) .SetMaxResults(10) @@ -56,16 +39,12 @@ } } - [Test] + [Test] public void TwoFuturesRunInTwoRoundTrips() { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); using (var logSpy = new SqlLogSpy()) { @@ -92,11 +71,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons = s.CreateCriteria(typeof(Person)) .SetMaxResults(10) @@ -120,5 +95,5 @@ } } } - } + } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -0,0 +1,30 @@ +using System.Collections; + +using NHibernate.Impl; + +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + public abstract class FutureFixture : TestCase + { + protected override IList Mappings + { + get { return new[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } + } + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected void IgnoreThisTestIfMultipleQueriesArentSupportedByDriver() + { + if (((SessionFactoryImpl)sessions) + .ConnectionProvider.Driver.SupportsMultipleQueries == false) + { + Assert.Ignore("Not applicable for dialects that do not support multiple queries"); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -6,29 +6,14 @@ using System.Collections; [TestFixture] - public class FutureQueryFixture : TestCase + public class FutureQueryFixture : FutureFixture { - - protected override IList Mappings - { - get { return new string[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - [Test] public void CanUseFutureQuery() { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons10 = s.CreateQuery("from Person") .SetMaxResults(10) @@ -60,11 +45,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); using (var logSpy = new SqlLogSpy()) { @@ -91,11 +72,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons = s.CreateQuery("from Person") .SetMaxResults(10) Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-13 16:41:52 UTC (rev 4176) @@ -295,6 +295,8 @@ <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> + <Compile Include="NHSpecificTest\Futures\FallbackFixture.cs" /> + <Compile Include="NHSpecificTest\Futures\FutureFixture.cs" /> <Compile Include="NHSpecificTest\NH1635\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1635\ForumMessage.cs" /> <Compile Include="NHSpecificTest\NH1635\ForumThread.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |