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