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