|
From: <fab...@us...> - 2010-08-06 22:29:28
|
Revision: 5119
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5119&view=rev
Author: fabiomaulo
Date: 2010-08-06 22:29:22 +0000 (Fri, 06 Aug 2010)
Log Message:
-----------
Fix NH-1836
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/IMultiQuery.cs
trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Entity.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/EntityDTO.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Mappings.hbm.xml
Modified: trunk/nhibernate/src/NHibernate/IMultiQuery.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2010-08-06 19:57:08 UTC (rev 5118)
+++ trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2010-08-06 22:29:22 UTC (rev 5119)
@@ -314,6 +314,9 @@
/// Set a strategy for handling the query results. This can be used to change
/// "shape" of the query result.
/// </summary>
+ /// <remarks>
+ /// The <param name="transformer"/> will be applied after the transformer of each single query.
+ /// </remarks>
IMultiQuery SetResultTransformer(IResultTransformer transformer);
/// <summary>
Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2010-08-06 19:57:08 UTC (rev 5118)
+++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2010-08-06 22:29:22 UTC (rev 5119)
@@ -410,45 +410,52 @@
protected virtual IList GetResultList(IList results)
{
- for (int i = 0, len = results.Count; i < len; ++i)
+ var multiqueryHolderInstatiator = GetMultiQueryHolderInstatiator();
+ int len = results.Count;
+ for (int i = 0; i < len; ++i)
{
- IList subList = (IList)results[i];
- QueryParameters parameter = Parameters[i];
- HolderInstantiator holderInstantiator = GetHolderInstantiator(parameter);
- if (holderInstantiator.IsRequired)
- {
- for (int j = 0; j < subList.Count; j++)
- {
- object[] row = subList[j] as object[] ?? new[] { subList[j] };
- subList[j] = holderInstantiator.Instantiate(row);
- }
-
- IResultTransformer transformer =
- holderInstantiator.ResultTransformer;
- if (transformer != null)
- {
- results[i] = transformer.TransformList(subList);
- }
- }
+ // First use the transformer of each query transformig each row and then the list
+ results[i] = GetTransformedResults((IList)results[i], GetQueryHolderInstantiator(i));
+ // then use the MultiQueryTransformer (if it has some sense...) using, as source, the transformed result.
+ results[i] = GetTransformedResults((IList)results[i], multiqueryHolderInstatiator);
}
return results;
}
- private HolderInstantiator GetHolderInstantiator(QueryParameters parameter)
+ private IList GetTransformedResults(IList source, HolderInstantiator holderInstantiator)
{
- //if multi query has result transformer, then this will override IQuery transformations
- if (resultTransformer != null)
+ if (!holderInstantiator.IsRequired)
{
- return new HolderInstantiator(resultTransformer, null);
+ return source;
}
- if (parameter.ResultTransformer != null)
+ for (int j = 0; j < source.Count; j++)
{
- return new HolderInstantiator(parameter.ResultTransformer, null);
+ object[] row = source[j] as object[] ?? new[] { source[j] };
+ source[j] = holderInstantiator.Instantiate(row);
}
- return HolderInstantiator.NoopInstantiator;
+
+ return holderInstantiator.ResultTransformer.TransformList(source);
}
+ private HolderInstantiator GetQueryHolderInstantiator(int queryPosition)
+ {
+ // TODO : we need a test to check the behavior when the query has a 'new' istead a trasformer
+ // we should take the HolderInstantiator directly from QueryTranslator... taking care with Parameters.
+ return Parameters[queryPosition].ResultTransformer != null ?
+ new HolderInstantiator(Parameters[queryPosition].ResultTransformer, translators[queryPosition].ReturnAliases)
+ : HolderInstantiator.NoopInstantiator;
+ }
+ private HolderInstantiator GetMultiQueryHolderInstatiator()
+ {
+ return HasMultiQueryResultTrasformer() ? new HolderInstantiator(resultTransformer, null) : HolderInstantiator.NoopInstantiator;
+ }
+
+ private bool HasMultiQueryResultTrasformer()
+ {
+ return resultTransformer != null;
+ }
+
protected ArrayList DoList()
{
bool statsEnabled = session.Factory.Statistics.IsStatisticsEnabled;
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2010-08-06 19:57:08 UTC (rev 5118)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2010-08-06 22:29:22 UTC (rev 5119)
@@ -61,6 +61,10 @@
public object TransformTuple(object[] tuple, String[] aliases)
{
+ if (aliases == null)
+ {
+ throw new ArgumentNullException("aliases");
+ }
object result;
try
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Entity.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Entity.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Entity.cs 2010-08-06 22:29:22 UTC (rev 5119)
@@ -0,0 +1,7 @@
+namespace NHibernate.Test.NHSpecificTest.NH1836
+{
+ public class Entity
+ {
+ public virtual int Id { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/EntityDTO.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/EntityDTO.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/EntityDTO.cs 2010-08-06 22:29:22 UTC (rev 5119)
@@ -0,0 +1,7 @@
+namespace NHibernate.Test.NHSpecificTest.NH1836
+{
+ public class EntityDTO
+ {
+ public int EntityId { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Fixture.cs 2010-08-06 22:29:22 UTC (rev 5119)
@@ -0,0 +1,58 @@
+using System.Collections;
+using NHibernate.Transform;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH1836
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
+ {
+ return factory.ConnectionProvider.Driver.SupportsMultipleQueries;
+ }
+
+ protected override void OnSetUp()
+ {
+ base.OnSetUp();
+
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ s.Save(new Entity {Id = 1});
+ t.Commit();
+ }
+ }
+
+ [Test]
+ public void AliasToBeanTransformerShouldApplyCorrectlyToMultiQuery()
+ {
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ IMultiQuery multiQuery = s.CreateMultiQuery()
+ .Add(s.CreateQuery("select entity.Id as EntityId from Entity entity")
+ .SetResultTransformer(Transformers.AliasToBean(typeof(EntityDTO)))
+ );
+
+ IList results = null;
+ Executing.This(() => results = multiQuery.List()).Should().NotThrow();
+ var elementOfFirstResult = ((IList)results[0])[0];
+ elementOfFirstResult.Should().Be.OfType<EntityDTO>().And.ValueOf.EntityId.Should().Be(1);
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ base.OnTearDown();
+
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ s.CreateQuery("delete from System.Object").ExecuteUpdate();
+ t.Commit();
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1836/Mappings.hbm.xml 2010-08-06 22:29:22 UTC (rev 5119)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ namespace="NHibernate.Test.NHSpecificTest.NH1836"
+ assembly="NHibernate.Test">
+ <class name="Entity">
+ <id name="Id">
+ <generator class="assigned" />
+ </id>
+ </class>
+</hibernate-mapping>
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-06 19:57:08 UTC (rev 5118)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-06 22:29:22 UTC (rev 5119)
@@ -447,6 +447,9 @@
<Compile Include="Linq\ReadonlyTestCase.cs" />
<Compile Include="NHSpecificTest\NH1421\AnEntity.cs" />
<Compile Include="NHSpecificTest\NH1421\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH1836\Entity.cs" />
+ <Compile Include="NHSpecificTest\NH1836\EntityDTO.cs" />
+ <Compile Include="NHSpecificTest\NH1836\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2148\BugFixture.cs" />
<Compile Include="NHSpecificTest\NH2148\Domain.cs" />
<Compile Include="NHSpecificTest\NH2245\Fixture.cs" />
@@ -2235,6 +2238,7 @@
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="NHSpecificTest\NH1836\Mappings.hbm.xml" />
<EmbeddedResource Include="TypesTest\DateTimeClass.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1421\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2148\Mappings.hbm.xml" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|