From: <fab...@us...> - 2011-05-12 16:27:17
|
Revision: 5811 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5811&view=rev Author: fabiomaulo Date: 2011-05-12 16:27:11 +0000 (Thu, 12 May 2011) Log Message: ----------- Fix NH-2690 NH-2421 NH-2422 thanks to Andrei Alecu Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -515,7 +515,7 @@ ITranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; IList tempResults; - if (resultCollectionGenericType[i] == typeof(object)) + if (resultCollectionGenericType[i] == typeof(object) || parameter.ResultTransformer != null) { tempResults = new ArrayList(); } Modified: trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -4,6 +4,7 @@ using System.Linq.Expressions; using NHibernate.Engine; using NHibernate.Impl; +using Remotion.Linq; namespace NHibernate.Linq { @@ -48,20 +49,20 @@ public static IEnumerable<T> ToFuture<T>(this IQueryable<T> query) { - var nhQueryable = query as NhQueryable<T>; + var nhQueryable = query as QueryableBase<T>; if (nhQueryable == null) - throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); + throw new NotSupportedException("Query needs to be of type QueryableBase<T>"); - var future = ((INhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); + var future = ((INhQueryProvider) nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); return (IEnumerable<T>)future; } public static IFutureValue<T> ToFutureValue<T>(this IQueryable<T> query) { - var nhQueryable = query as NhQueryable<T>; + var nhQueryable = query as QueryableBase<T>; if (nhQueryable == null) - throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); + throw new NotSupportedException("Query needs to be of type QueryableBase<T>"); var future = ((INhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); if(future is DelayedEnumerator<T>) Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -75,6 +75,83 @@ } [Test] + public void CanUseFutureQueryWithAnonymousType() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons = s.Query<Person>() + .Select(p => new {Id = p.Id, Name = p.Name}) + .ToFuture(); + var persons5 = s.Query<Person>() + .Select(p => new { Id = p.Id, Name = p.Name }) + .Take(5) + .ToFuture(); + + using (var logSpy = new SqlLogSpy()) + { + persons5.ToList(); // initialize the enumerable + persons.ToList(); + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + } + } + } + + + + [Test] + public void CanUseFutureFetchQuery() + { + using (var s = sessions.OpenSession()) + using (var tx = s.BeginTransaction()) + { + var p1 = new Person {Name = "Parent"}; + var p2 = new Person {Parent = p1, Name = "Child"}; + p1.Children.Add(p2); + s.Save(p1); + s.Save(p2); + tx.Commit(); + + s.Clear(); // we don't want caching + } + + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons = s.Query<Person>() + .FetchMany(p => p.Children) + .ToFuture(); + var persons10 = s.Query<Person>() + .FetchMany(p => p.Children) + .Take(10) + .ToFuture(); + + + using (var logSpy = new SqlLogSpy()) + { + + Assert.That(persons.Any(x => x.Children.Any()), "No children found"); + Assert.That(persons10.Any(x => x.Children.Any()), "No children found"); + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + } + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from Person"); + tx.Commit(); + } + } + + + [Test] public void TwoFuturesRunInTwoRoundTrips() { using (var s = sessions.OpenSession()) Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2011-05-10 23:09:40 UTC (rev 5810) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2011-05-12 16:27:11 UTC (rev 5811) @@ -503,6 +503,48 @@ } } + [Test] + public void CanGetResultsInAGenericListClass() + { + using (ISession s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + var item1 = new Item() { Id = 1, Name = "test item"}; + var item2 = new Item() { Id = 2, Name = "test child", Parent = item1 }; + s.Save(item1); + s.Save(item2); + + tx.Commit(); + s.Clear(); + } + + + using (ISession s = OpenSession()) + { + + + IQuery getItems = s.CreateQuery("from Item"); + IQuery parents = s.CreateQuery("select Parent from Item"); + + IList results = s.CreateMultiQuery() + .Add(getItems) + .Add<Item>(parents) + .List(); + + Assert.That(results[0], Is.InstanceOf<ArrayList>()); + Assert.That(results[1], Is.InstanceOf<List<Item>>()); + } + + using (ISession s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete("from Item"); + tx.Commit(); + } + } + + + public class ResultTransformerStub : IResultTransformer { private bool _wasTransformTupleCalled; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |