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