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