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