|
From: <aye...@us...> - 2009-01-19 13:40:49
|
Revision: 3998
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3998&view=rev
Author: ayenderahien
Date: 2009-01-19 13:40:38 +0000 (Mon, 19 Jan 2009)
Log Message:
-----------
Adding support for ICriteria.Future<T>()
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs
trunk/nhibernate/src/NHibernate/ICriteria.cs
trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs
trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs
trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs
trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs
Modified: trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -283,5 +283,7 @@
/// <summary> Execute a HQL update or delete query</summary>
int ExecuteUpdate(string query, QueryParameters queryParameters);
+
+ FutureCriteriaBatch FutureCriteriaBatch { get; }
}
}
Modified: trunk/nhibernate/src/NHibernate/ICriteria.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/ICriteria.cs 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/ICriteria.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -245,6 +245,14 @@
/// </exception>
object UniqueResult();
+ /// <summary>
+ /// Get a enumerable that when enumerated will execute
+ /// a batch of queries in a single database roundtrip
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns></returns>
+ IEnumerable<T> Future<T>();
+
#region NHibernate specific
/// <summary>
Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -128,8 +128,9 @@
public abstract IDbConnection Connection { get; }
public abstract int ExecuteNativeUpdate(NativeSQLQuerySpecification specification, QueryParameters queryParameters);
public abstract int ExecuteUpdate(string query, QueryParameters queryParameters);
+ public abstract FutureCriteriaBatch FutureCriteriaBatch { get; }
- public virtual IQuery GetNamedQuery(string queryName)
+ public virtual IQuery GetNamedQuery(string queryName)
{
CheckAndUpdateSessionStatus();
NamedQueryDefinition nqd = factory.GetNamedQuery(queryName);
Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -371,7 +371,13 @@
return new Subcriteria(this, this, associationPath, alias, joinType);
}
- public object UniqueResult()
+ public IEnumerable<T> Future<T>()
+ {
+ session.FutureCriteriaBatch.Add(this);
+ return session.FutureCriteriaBatch.GetEnumerator<T>();
+ }
+
+ public object UniqueResult()
{
return AbstractQueryImpl.UniqueElement(List());
}
@@ -681,7 +687,12 @@
return root.List();
}
- public void List(IList results)
+ public IEnumerable<T> Future<T>()
+ {
+ return root.Future<T>();
+ }
+
+ public void List(IList results)
{
root.List(results);
}
Added: trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -0,0 +1,88 @@
+using System.Collections;
+using System.Collections.Generic;
+
+namespace NHibernate.Impl
+{
+ public class FutureCriteriaBatch
+ {
+ private readonly List<ICriteria> criterias = new List<ICriteria>();
+ private int index;
+ private IList results;
+ private readonly ISession session;
+
+ public FutureCriteriaBatch(ISession session)
+ {
+ this.session = session;
+ }
+
+ public IList Results
+ {
+ get
+ {
+ if (results == null)
+ {
+ var multiCriteria = session.CreateMultiCriteria();
+ foreach (var crit in criterias)
+ {
+ multiCriteria.Add(crit);
+ }
+ results = multiCriteria.List();
+ }
+ return results;
+ }
+ }
+
+ public void Add(ICriteria criteria)
+ {
+ criterias.Add(criteria);
+ index = criterias.Count - 1;
+ }
+
+ public IEnumerable<T> GetEnumerator<T>()
+ {
+ int currentIndex = index;
+ return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]);
+ }
+
+ #region Nested type: DelayedEnumerator
+
+ private class DelayedEnumerator<T> : IEnumerable<T>
+ {
+ public delegate IList GetResult();
+
+ private readonly GetResult result;
+
+ public DelayedEnumerator(GetResult result)
+ {
+ this.result = result;
+ }
+
+ public IEnumerable<T> Enumerable
+ {
+ get
+ {
+ foreach (T item in result())
+ {
+ yield return item;
+ }
+ }
+ }
+
+ #region IEnumerable<T> Members
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return ((IEnumerable) Enumerable).GetEnumerator();
+ }
+
+ public IEnumerator<T> GetEnumerator()
+ {
+ return Enumerable.GetEnumerator();
+ }
+
+ #endregion
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -49,6 +49,8 @@
[NonSerialized] private readonly EntityMode entityMode = EntityMode.Poco;
+ [NonSerialized] private FutureCriteriaBatch futureCriteriaBatch;
+
[NonSerialized]
private readonly EventListeners listeners;
@@ -248,6 +250,16 @@
CheckAndUpdateSessionStatus();
}
+ public override FutureCriteriaBatch FutureCriteriaBatch
+ {
+ get
+ {
+ if (futureCriteriaBatch == null)
+ futureCriteriaBatch = new FutureCriteriaBatch(this);
+ return futureCriteriaBatch;
+ }
+ }
+
/// <summary></summary>
public override IBatcher Batcher
{
@@ -2212,6 +2224,7 @@
return result;
}
+
public override IEntityPersister GetEntityPersister(string entityName, object obj)
{
CheckAndUpdateSessionStatus();
Modified: trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -813,7 +813,12 @@
return result;
}
- public override IEntityPersister GetEntityPersister(string entityName, object obj)
+ public override FutureCriteriaBatch FutureCriteriaBatch
+ {
+ get { throw new System.NotSupportedException("future queries are not supported for stateless session"); }
+ }
+
+ public override IEntityPersister GetEntityPersister(string entityName, object obj)
{
CheckAndUpdateSessionStatus();
if (entityName == null)
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-01-19 13:40:38 UTC (rev 3998)
@@ -2,7 +2,7 @@
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProductVersion>9.0.21022</ProductVersion>
+ <ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{5909BFE7-93CF-4E5F-BE22-6293368AF01D}</ProjectGuid>
<OutputType>Library</OutputType>
@@ -456,6 +456,7 @@
<Compile Include="Exceptions\SqlStateExtracter.cs" />
<Compile Include="Exceptions\TemplatedViolatedConstraintNameExtracter.cs" />
<Compile Include="Id\SelectGenerator.cs" />
+ <Compile Include="Impl\FutureCriteriaBatch.cs" />
<Compile Include="Properties\BackFieldStrategy.cs" />
<Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" />
<Compile Include="Bytecode\IAccessOptimizer.cs" />
Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures
___________________________________________________________________
Added: bugtraq:url
+ http://jira.nhibernate.org/browse/%BUGID%
Added: bugtraq:logregex
+ NH-\d+
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Fixture.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -0,0 +1,58 @@
+using NHibernate.Impl;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.Futures
+{
+ using System.Collections;
+
+ [TestFixture]
+ public class Fixture : TestCase
+ {
+
+ 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");
+ }
+
+ var persons10 = s.CreateCriteria(typeof(Person))
+ .SetMaxResults(10)
+ .Future<Person>();
+ var persons5 = s.CreateCriteria(typeof(Person))
+ .SetMaxResults(5)
+ .Future<int>();
+
+ using (var logSpy = new SqlLogSpy())
+ {
+ foreach (var person in persons5)
+ {
+
+ }
+
+ foreach (var person in persons10)
+ {
+
+ }
+
+ var events = logSpy.Appender.GetEvents();
+ Assert.AreEqual(1, events.Length);
+ }
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml 2009-01-19 13:40:38 UTC (rev 3998)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ namespace="NHibernate.Test.NHSpecificTest.Futures"
+ assembly="NHibernate.Test">
+
+ <class name="Person">
+ <id name="Id">
+ <generator class="native"/>
+ </id>
+ <many-to-one name="Parent" />
+ <list name="Children" cascade="all">
+ <key column="parent_id" />
+ <index column="child_index" />
+ <one-to-many class="Person" />
+ </list>
+ <list name="Friends" cascade="save-update">
+ <key column="friend_id" />
+ <index column="friend_index" />
+ <one-to-many class="Person" />
+ </list>
+ </class>
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs 2009-01-19 13:40:38 UTC (rev 3998)
@@ -0,0 +1,36 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.Futures
+{
+ public class Person
+ {
+ private IList<Person> children = new List<Person>();
+ private IList<Person> friends = new List<Person>();
+ private int id;
+ private Person parent;
+
+ public virtual Person Parent
+ {
+ get { return parent; }
+ set { parent = value; }
+ }
+
+ public virtual IList<Person> Friends
+ {
+ get { return friends; }
+ set { friends = value; }
+ }
+
+ public virtual IList<Person> Children
+ {
+ get { return children; }
+ set { children = value; }
+ }
+
+ public virtual int Id
+ {
+ get { return id; }
+ set { id = value; }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-01-18 19:57:19 UTC (rev 3997)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-01-19 13:40:38 UTC (rev 3998)
@@ -2,7 +2,7 @@
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProductVersion>9.0.21022</ProductVersion>
+ <ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{7AEE5B37-C552-4E59-9B6F-88755BCB5070}</ProjectGuid>
<OutputType>Library</OutputType>
@@ -373,6 +373,8 @@
<Compile Include="NHSpecificTest\BasicTimeFixture.cs" />
<Compile Include="NHSpecificTest\BugTestCase.cs" />
<Compile Include="NHSpecificTest\CollectionFixture.cs" />
+ <Compile Include="NHSpecificTest\Futures\Fixture.cs" />
+ <Compile Include="NHSpecificTest\Futures\Person.cs" />
<Compile Include="NHSpecificTest\NH1274ExportExclude\Home.cs" />
<Compile Include="NHSpecificTest\NH1274ExportExclude\NH1274ExportExcludeFixture.cs" />
<Compile Include="NHSpecificTest\NH1274ExportExclude\Person.cs" />
@@ -1602,6 +1604,7 @@
<EmbeddedResource Include="Cascade\JobBatch.hbm.xml" />
<EmbeddedResource Include="Deletetransient\Person.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="NHSpecificTest\Futures\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1643\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1640\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1584\Mappings.hbm.xml" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|