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