From: <aye...@us...> - 2008-09-25 09:51:42
|
Revision: 3779 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3779&view=rev Author: ayenderahien Date: 2008-09-25 09:50:03 +0000 (Thu, 25 Sep 2008) Log Message: ----------- Better handling resultTransformers on multi criteria and multi queries Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2008-09-20 22:06:36 UTC (rev 3778) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2008-09-25 09:50:03 UTC (rev 3779) @@ -18,8 +18,8 @@ { public class MultiCriteriaImpl : IMultiCriteria { - private static readonly ILog log = LogManager.GetLogger(typeof (MultiCriteriaImpl)); - private readonly IList criteriaQueries = new ArrayList(); + private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl)); + private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>(); private readonly SessionImpl session; private readonly ISessionFactoryImplementor factory; @@ -30,7 +30,7 @@ private readonly List<CriteriaLoader> loaders = new List<CriteriaLoader>(); private readonly Dialect.Dialect dialect; private IList criteriaResults; - private Dictionary<string, int> criteriaResultPositions = new Dictionary<string, int>(); + private readonly Dictionary<string, int> criteriaResultPositions = new Dictionary<string, int>(); private bool isCacheable = false; private bool forceCacheRefresh = false; private string cacheRegion; @@ -114,10 +114,10 @@ IList result = assembler.GetResultFromQueryCache(session, - combinedParameters, - querySpaces, - queryCache, - key); + combinedParameters, + querySpaces, + queryCache, + key); if (result == null) { @@ -139,11 +139,21 @@ { if (resultTransformer != null) { - for (int i = 0, len = results.Count; i < len; ++i) + for (int i = 0; i < results.Count; i++) { results[i] = resultTransformer.TransformList((IList)results[i]); } } + else + { + for (int i = 0; i < results.Count; i++) + { + var critImp = criteriaQueries[i] as CriteriaImpl; + if(critImp==null || critImp.ResultTransformer==null) + continue; + results[i] = critImp.ResultTransformer.TransformList((IList)results[i]); + } + } return results; } @@ -200,11 +210,11 @@ Loader.Loader.Advance(reader, selection); } int count; - for (count = 0; count < maxRows && reader.Read(); count++) + for (count = 0; count < maxRows && reader.Read(); count++) { object o = loader.GetRowFromResultSet(reader, session, queryParameters, loader.GetLockModes(queryParameters.LockModes), - null, hydratedObjects[i], keys, false); + null, hydratedObjects[i], keys, false); if (createSubselects[i]) { subselectResultKeys[i].Add(keys); @@ -307,7 +317,7 @@ { for (int i = 0; i < loaders.Count; i++) { - QueryParameters parameter = parameters[i]; + QueryParameters parameter = parameters[i]; RowSelection selection = parameter.RowSelection; if (Loader.Loader.UseLimit(selection, dialect) && dialect.BindLimitParametersFirst) { @@ -326,7 +336,8 @@ public IMultiCriteria Add(string key, ICriteria criteria) { ThrowIfKeyAlreadyExists(key); - criteriaResultPositions.Add(key, criteriaQueries.Add(criteria)); + criteriaQueries.Add(criteria); + criteriaResultPositions.Add(key, criteriaQueries.Count - 1); return this; } @@ -341,7 +352,8 @@ public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria) { ThrowIfKeyAlreadyExists(key); - criteriaResultPositions.Add(key, criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session))); + criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session)); + criteriaResultPositions.Add(key, criteriaQueries.Count-1); return this; } @@ -399,8 +411,8 @@ positionalParameterTypes.AddRange(queryParameters.PositionalParameterTypes); positionalParameterValues.AddRange(queryParameters.PositionalParameterValues); } - combinedQueryParameters.PositionalParameterTypes = (IType[]) positionalParameterTypes.ToArray(typeof (IType)); - combinedQueryParameters.PositionalParameterValues = (object[]) positionalParameterValues.ToArray(typeof (object)); + combinedQueryParameters.PositionalParameterTypes = (IType[])positionalParameterTypes.ToArray(typeof(IType)); + combinedQueryParameters.PositionalParameterValues = (object[])positionalParameterValues.ToArray(typeof(object)); return combinedQueryParameters; } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2008-09-20 22:06:36 UTC (rev 3778) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2008-09-25 09:50:03 UTC (rev 3779) @@ -396,9 +396,9 @@ protected virtual IList GetResultList(IList results) { - for (int i = 0, len = results.Count; i < len; ++i) + for (int i = 0, len = results.Count; i < len; ++i) { - IList subList = (IList)results[i]; + IList subList = (IList)results[i]; QueryParameters parameter = Parameters[i]; HolderInstantiator holderInstantiator = GetHolderInstantiator(parameter); if (holderInstantiator.IsRequired) @@ -406,13 +406,16 @@ for (int j = 0; j < subList.Count; j++) { object[] row = subList[j] as object[]; - if(row!=null) //if the result is array - subList[j] = holderInstantiator.Instantiate(row); + if (row == null) + row = new object[] { subList[j] }; + subList[j] = holderInstantiator.Instantiate(row); } - if (holderInstantiator.ResultTransformer != null) + IResultTransformer transformer = + holderInstantiator.ResultTransformer; + if (transformer != null) { - results[i] = holderInstantiator.ResultTransformer.TransformList(subList); + results[i] = transformer.TransformList(subList); } } } @@ -426,7 +429,7 @@ { return new HolderInstantiator(resultTransformer, null); } - if (parameter.ResultTransformer!=null) + if (parameter.ResultTransformer != null) { return new HolderInstantiator(parameter.ResultTransformer, null); } @@ -783,7 +786,7 @@ } return false; } - + private void ThrowIfKeyAlreadyExists(string key) { if (criteriaResultPositions.ContainsKey(key)) Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2008-09-20 22:06:36 UTC (rev 3778) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2008-09-25 09:50:03 UTC (rev 3779) @@ -9,6 +9,8 @@ namespace NHibernate.Test.QueryTest { + using Transform; + [TestFixture] public class MultipleQueriesFixture : TestCase { @@ -417,5 +419,104 @@ } } + + [Test] + public void ExecutingCriteriaThroughMultiQueryTransformsResults() + { + CreateItems(); + + using (ISession session = OpenSession()) + { + ResultTransformerStub transformer = new ResultTransformerStub(); + IQuery criteria = session.CreateQuery("from Item") + .SetResultTransformer(transformer); + session.CreateMultiQuery() + .Add(criteria) + .List(); + + Assert.IsTrue(transformer.WasTransformTupleCalled, "Transform Tuple was not called"); + Assert.IsTrue(transformer.WasTransformListCalled, "Transform List was not called"); + } + + RemoveAllItems(); + } + + [Test] + public void ExecutingCriteriaThroughMultiQueryTransformsResults_When_setting_on_multi_query_directly() + { + CreateItems(); + + using (ISession session = OpenSession()) + { + ResultTransformerStub transformer = new ResultTransformerStub(); + IQuery query = session.CreateQuery("from Item"); + session.CreateMultiQuery() + .Add(query) + .SetResultTransformer(transformer) + .List(); + + Assert.IsTrue(transformer.WasTransformTupleCalled, "Transform Tuple was not called"); + Assert.IsTrue(transformer.WasTransformListCalled, "Transform List was not called"); + } + + RemoveAllItems(); + } + + + [Test] + public void ExecutingCriteriaThroughMultiCriteriaTransformsResults() + { + CreateItems(); + + using (ISession session = OpenSession()) + { + ResultTransformerStub transformer = new ResultTransformerStub(); + ICriteria criteria = session.CreateCriteria(typeof(Item)) + .SetResultTransformer(transformer); + IMultiCriteria multiCriteria = session.CreateMultiCriteria() + .Add(criteria); + multiCriteria.List(); + + Assert.IsTrue(transformer.WasTransformTupleCalled, "Transform Tuple was not called"); + Assert.IsTrue(transformer.WasTransformListCalled,"Transform List was not called"); + } + + RemoveAllItems(); + } + + public class ResultTransformerStub : IResultTransformer + { + private bool _wasTransformTupleCalled; + private bool _wasTransformListCalled; + + public bool WasTransformTupleCalled + { + get { return _wasTransformTupleCalled; } + } + + public bool WasTransformListCalled + { + get { return _wasTransformListCalled; } + } + + public ResultTransformerStub() + { + _wasTransformTupleCalled = false; + _wasTransformListCalled = false; + } + + public object TransformTuple(object[] tuple, string[]aliases) + { + _wasTransformTupleCalled = true; + return tuple; + } + + public IList TransformList(IList collection) + { + _wasTransformListCalled = true; + return collection; + } + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |