From: <dav...@us...> - 2009-04-19 15:06:54
|
Revision: 4190 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4190&view=rev Author: davybrion Date: 2009-04-19 15:06:48 +0000 (Sun, 19 Apr 2009) Log Message: ----------- refactored duplicate code from FutureQueryBatch and FutureCriteriaBatch into a new FutureBatch base class Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs Added: trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs 2009-04-19 15:06:48 UTC (rev 4190) @@ -0,0 +1,77 @@ +using System.Collections; +using System.Collections.Generic; + +namespace NHibernate.Impl +{ + public abstract class FutureBatch<TQueryApproach, TMultiApproach> + { + private readonly List<TQueryApproach> queries = new List<TQueryApproach>(); + private readonly IList<System.Type> resultTypes = new List<System.Type>(); + private int index; + private IList results; + + protected readonly SessionImpl session; + + protected FutureBatch(ISession session) + { + this.session = (SessionImpl)session; + } + + public IList Results + { + get + { + if (results == null) + { + GetResults(); + } + return results; + } + } + + public void Add<TResult>(TQueryApproach query) + { + queries.Add(query); + resultTypes.Add(typeof(TResult)); + index = queries.Count - 1; + } + + public void Add(TQueryApproach query) + { + Add<object>(query); + } + + public IFutureValue<TResult> GetFutureValue<TResult>() + { + int currentIndex = index; + return new FutureValue<TResult>(() => GetCurrentResult<TResult>(currentIndex)); + } + + public IEnumerable<TResult> GetEnumerator<TResult>() + { + int currentIndex = index; + return new DelayedEnumerator<TResult>(() => GetCurrentResult<TResult>(currentIndex)); + } + + private void GetResults() + { + var multiApproach = CreateMultiApproach(); + for (int i = 0; i < queries.Count; i++) + { + AddTo(multiApproach, queries[i], resultTypes[i]); + } + results = GetResultsFrom(multiApproach); + ClearCurrentFutureBatch(); + } + + private IList<TResult> GetCurrentResult<TResult>(int currentIndex) + { + return (IList<TResult>)Results[currentIndex]; + } + + protected abstract TMultiApproach CreateMultiApproach(); + protected abstract void AddTo(TMultiApproach multiApproach, TQueryApproach query, System.Type resultType); + protected abstract IList GetResultsFrom(TMultiApproach multiApproach); + protected abstract void ClearCurrentFutureBatch(); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) +++ trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-19 15:06:48 UTC (rev 4190) @@ -1,62 +1,29 @@ using System.Collections; -using System.Collections.Generic; namespace NHibernate.Impl { - public class FutureCriteriaBatch + public class FutureCriteriaBatch : FutureBatch<ICriteria, IMultiCriteria> { - private readonly List<ICriteria> criterias = new List<ICriteria>(); - private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + public FutureCriteriaBatch(ISession session) : base(session) {} - private int index; - private IList results; - private readonly ISession session; - - public FutureCriteriaBatch(ISession session) + protected override IMultiCriteria CreateMultiApproach() { - this.session = session; + return session.CreateMultiCriteria(); } - public IList Results + protected override void AddTo(IMultiCriteria multiApproach, ICriteria query, System.Type resultType) { - get - { - if (results == null) - { - var multiCriteria = session.CreateMultiCriteria(); - for (int i = 0; i < criterias.Count; i++) - { - multiCriteria.Add(resultCollectionGenericType[i], criterias[i]); - } - results = multiCriteria.List(); - ((SessionImpl)session).FutureCriteriaBatch = null; - } - return results; - } + multiApproach.Add(resultType, query); } - public void Add<T>(ICriteria criteria) + protected override IList GetResultsFrom(IMultiCriteria multiApproach) { - criterias.Add(criteria); - resultCollectionGenericType.Add(typeof(T)); - index = criterias.Count - 1; + return multiApproach.List(); } - public void Add(ICriteria criteria) + protected override void ClearCurrentFutureBatch() { - Add<object>(criteria); + session.FutureCriteriaBatch = null; } - - public IFutureValue<T> GetFutureValue<T>() - { - int currentIndex = index; - return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); - } - - public IEnumerable<T> GetEnumerator<T>() - { - int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); - } } } Modified: trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) +++ trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-19 15:06:48 UTC (rev 4190) @@ -1,62 +1,29 @@ using System.Collections; -using System.Collections.Generic; namespace NHibernate.Impl { - public class FutureQueryBatch + public class FutureQueryBatch : FutureBatch<IQuery, IMultiQuery> { - private readonly List<IQuery> queries = new List<IQuery>(); - private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + public FutureQueryBatch(ISession session) : base(session) {} - private int index; - private IList results; - private readonly ISession session; + protected override IMultiQuery CreateMultiApproach() + { + return session.CreateMultiQuery(); + } - public FutureQueryBatch(ISession session) - { - this.session = session; - } + protected override void AddTo(IMultiQuery multiApproach, IQuery query, System.Type resultType) + { + multiApproach.Add(resultType, query); + } - public IList Results - { - get - { - if (results == null) - { - var multiQuery = session.CreateMultiQuery(); - for (int i = 0; i < queries.Count; i++) - { - multiQuery.Add(resultCollectionGenericType[i], queries[i]); - } - results = multiQuery.List(); - ((SessionImpl)session).FutureQueryBatch = null; - } - return results; - } - } + protected override IList GetResultsFrom(IMultiQuery multiApproach) + { + return multiApproach.List(); + } - public void Add<T>(IQuery query) - { - queries.Add(query); - resultCollectionGenericType.Add(typeof(T)); - index = queries.Count - 1; + protected override void ClearCurrentFutureBatch() + { + session.FutureQueryBatch = null; } - - public void Add(IQuery query) - { - Add<object>(query); - } - - public IFutureValue<T> GetFutureValue<T>() - { - int currentIndex = index; - return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); - } - - public IEnumerable<T> GetEnumerator<T>() - { - int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); - } } } Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-18 14:15:48 UTC (rev 4189) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-19 15:06:48 UTC (rev 4190) @@ -480,6 +480,7 @@ <Compile Include="Id\SequenceIdentityGenerator.cs" /> <Compile Include="IFutureValue.cs" /> <Compile Include="Impl\DelayedEnumerator.cs" /> + <Compile Include="Impl\FutureBatch.cs" /> <Compile Include="Impl\FutureQueryBatch.cs" /> <Compile Include="Impl\FutureCriteriaBatch.cs" /> <Compile Include="Impl\FutureValue.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |