From: <ric...@us...> - 2009-09-30 13:56:20
|
Revision: 4734 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4734&view=rev Author: ricbrown Date: 2009-09-30 13:56:12 +0000 (Wed, 30 Sep 2009) Log Message: ----------- Added UniqueResult and Futures to IQueryOver. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/IQueryOver.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryOverFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-09-30 10:29:35 UTC (rev 4733) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-09-30 13:56:12 UTC (rev 4734) @@ -258,6 +258,36 @@ return _criteria.List<U>(); } + public T UniqueResult() + { + return _criteria.UniqueResult<T>(); + } + + public U UniqueResult<U>() + { + return _criteria.UniqueResult<U>(); + } + + IEnumerable<T> Future() + { + return _criteria.Future<T>(); + } + + IEnumerable<U> Future<U>() + { + return _criteria.Future<U>(); + } + + IFutureValue<T> FutureValue() + { + return _criteria.FutureValue<T>(); + } + + IFutureValue<U> FutureValue<U>() + { + return _criteria.FutureValue<U>(); + } + /// <summary> /// Get an executable instance of <c>IQueryOver<T></c>, /// to actually run the query.</summary> @@ -400,6 +430,24 @@ IList<U> IQueryOver<T>.List<U>() { return List<U>(); } + T IQueryOver<T>.UniqueResult() + { return UniqueResult(); } + + U IQueryOver<T>.UniqueResult<U>() + { return UniqueResult<U>(); } + + IEnumerable<T> IQueryOver<T>.Future() + { return Future(); } + + IEnumerable<U> IQueryOver<T>.Future<U>() + { return Future<U>(); } + + IFutureValue<T> IQueryOver<T>.FutureValue() + { return FutureValue(); } + + IFutureValue<U> IQueryOver<T>.FutureValue<U>() + { return FutureValue<U>(); } + } } Modified: trunk/nhibernate/src/NHibernate/IQueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-09-30 10:29:35 UTC (rev 4733) +++ trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-09-30 13:56:12 UTC (rev 4734) @@ -259,6 +259,49 @@ /// <returns>The list filled with the results.</returns> IList<U> List<U>(); + /// <summary> + /// Convenience method to return a single instance that matches + /// the query, or null if the query returns no results. + /// </summary> + /// <returns>the single result or <see langword="null" /></returns> + /// <exception cref="HibernateException"> + /// If there is more than one matching result + /// </exception> + T UniqueResult(); + + /// <summary> + /// Override type of <see cref="UniqueResult()" />. + /// </summary> + U UniqueResult<U>(); + + /// <summary> + /// Get a enumerable that when enumerated will execute + /// a batch of queries in a single database roundtrip + /// </summary> + IEnumerable<T> Future(); + + /// <summary> + /// Get a enumerable that when enumerated will execute + /// a batch of queries in a single database roundtrip + /// </summary> + IEnumerable<U> Future<U>(); + + /// <summary> + /// Get an IFutureValue instance, whose value can be retrieved through + /// its Value property. The query is not executed until the Value property + /// is retrieved, which will execute other Future queries as well in a + /// single roundtrip + /// </summary> + IFutureValue<T> FutureValue(); + + /// <summary> + /// Get an IFutureValue instance, whose value can be retrieved through + /// its Value property. The query is not executed until the Value property + /// is retrieved, which will execute other Future queries as well in a + /// single roundtrip + /// </summary> + IFutureValue<U> FutureValue<U>(); + } } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2009-09-30 10:29:35 UTC (rev 4733) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2009-09-30 13:56:12 UTC (rev 4734) @@ -145,6 +145,36 @@ } } + [Test] + public void UniqueResult() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.Save(new Person() { Name = "test person 1", Age = 20 }); + t.Commit(); + } + + using (ISession s = OpenSession()) + { + Person actual = + s.QueryOver<Person>() + .UniqueResult(); + + Assert.That(actual.Name, Is.EqualTo("test person 1")); + } + + using (ISession s = OpenSession()) + { + string actual = + s.QueryOver<Person>() + .Select(p => p.Name) + .UniqueResult<string>(); + + Assert.That(actual, Is.EqualTo("test person 1")); + } + } + } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryOverFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryOverFixture.cs 2009-09-30 13:56:12 UTC (rev 4734) @@ -0,0 +1,132 @@ +using NHibernate.Criterion; +using NHibernate.Impl; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + [TestFixture] + public class FutureQueryOverFixture : FutureFixture + { + + protected override void OnSetUp() + { + base.OnSetUp(); + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(new Person()); + tx.Commit(); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from Person"); + tx.Commit(); + } + } + + [Test] + public void CanUseFutureCriteria() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons10 = s.QueryOver<Person>() + .Take(10) + .Future(); + var persons5 = s.QueryOver<Person>() + .Select(p => p.Id) + .Take(5) + .Future<int>(); + + using (var logSpy = new SqlLogSpy()) + { + int actualPersons5Count = 0; + foreach (var person in persons5) + actualPersons5Count++; + + int actualPersons10Count = 0; + foreach (var person in persons10) + actualPersons10Count++; + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + + Assert.That(actualPersons5Count, Is.EqualTo(1)); + Assert.That(actualPersons10Count, Is.EqualTo(1)); + } + } + } + + [Test] + public void TwoFuturesRunInTwoRoundTrips() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + using (var logSpy = new SqlLogSpy()) + { + var persons10 = s.QueryOver<Person>() + .Take(10) + .Future(); + + foreach (var person in persons10) { } // fire first future round-trip + + var persons5 = s.QueryOver<Person>() + .Select(p => p.Id) + .Take(5) + .Future<int>(); + + foreach (var person in persons5) { } // fire second future round-trip + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(2, events.Length); + } + } + } + + [Test] + public void CanCombineSingleFutureValueWithEnumerableFutures() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons = s.QueryOver<Person>() + .Take(10) + .Future(); + + var personIds = s.QueryOver<Person>() + .Select(p => p.Id) + .FutureValue<int>(); + + var singlePerson = s.QueryOver<Person>() + .FutureValue(); + + using (var logSpy = new SqlLogSpy()) + { + Person singlePersonValue = singlePerson.Value; + int personId = personIds.Value; + + foreach (var person in persons) + { + + } + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + + Assert.That(singlePersonValue, Is.Not.Null); + Assert.That(personId, Is.Not.EqualTo(0)); + } + } + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-09-30 10:29:35 UTC (rev 4733) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-09-30 13:56:12 UTC (rev 4734) @@ -390,6 +390,7 @@ <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagPartialNameFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\Something.cs" /> + <Compile Include="NHSpecificTest\Futures\FutureQueryOverFixture.cs" /> <Compile Include="NHSpecificTest\NH1922\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1922\Model.cs" /> <Compile Include="NHSpecificTest\NH1927\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |