From: <te...@us...> - 2008-10-21 18:49:46
|
Revision: 3871 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3871&view=rev Author: tehlike Date: 2008-10-21 18:49:38 +0000 (Tue, 21 Oct 2008) Log Message: ----------- Fixes the problem with Caching Criteria with ResultTransformer set(Fix NH-1090) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -151,7 +151,16 @@ CriteriaImpl critImp = criteriaQueries[i] as CriteriaImpl; if(critImp==null || critImp.ResultTransformer==null) continue; - results[i] = critImp.ResultTransformer.TransformList((IList)results[i]); + ArrayList resultForOneCriteria = ((ArrayList) results[i]); + for (int j = 0; j < resultForOneCriteria.Count; j++) + { + if (!(critImp.ResultTransformer is RootEntityResultTransformer)) + { + object[] itemsForOneRow = (object[]) resultForOneCriteria[j]; + resultForOneCriteria[j] = critImp.ResultTransformer.TransformTuple(itemsForOneRow, new string[] {}); + } + } + critImp.ResultTransformer.TransformList(resultForOneCriteria); } } return results; Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Data; @@ -28,7 +29,7 @@ private readonly string[] userAliases; public CriteriaLoader(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, - string rootEntityName, IDictionary<string, IFilter> enabledFilters) + string rootEntityName, IDictionary<string, IFilter> enabledFilters) : base(factory, enabledFilters) { translator = new CriteriaQueryTranslator(factory, rootCriteria, rootEntityName, CriteriaQueryTranslator.RootSqlAlias); @@ -74,10 +75,9 @@ } protected override object GetResultColumnOrRow(object[] row, IResultTransformer resultTransformer, IDataReader rs, - ISessionImplementor session) + ISessionImplementor session) { object[] result; - string[] aliases; if (translator.HasProjection) { @@ -96,11 +96,15 @@ result = row; aliases = userAliases; } - return translator.RootCriteria.ResultTransformer.TransformTuple(result, aliases); + if (translator.RootCriteria.ResultTransformer is RootEntityResultTransformer) + return row[row.Length-1]; + else + return result; } + private string[] aliases; protected override SqlString ApplyLocks(SqlString sqlSelectString, IDictionary<string, LockMode> lockModes, - Dialect.Dialect dialect) + Dialect.Dialect dialect) { if (lockModes == null || lockModes.Count == 0) { @@ -115,7 +119,7 @@ LockMode lockMode; if (lockModes.TryGetValue(drivingSqlAliases[i], out lockMode)) { - ILockable drivingPersister = (ILockable) EntityPersisters[i]; + ILockable drivingPersister = (ILockable)EntityPersisters[i]; string rootSqlAlias = drivingPersister.GetRootTableAlias(drivingSqlAliases[i]); aliasedLockModes[rootSqlAlias] = lockMode; if (keyColumnNames != null) @@ -151,7 +155,15 @@ protected override IList GetResultList(IList results, IResultTransformer resultTransformer) { - return translator.RootCriteria.ResultTransformer.TransformList(results); + if (!(resultTransformer is RootEntityResultTransformer)) + { + for (int i = 0; i < results.Count; i++) + { + object[] row = (object[]) results[i]; + results[i] = resultTransformer.TransformTuple(row, aliases); + } + } + return resultTransformer.TransformList(results); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -62,7 +62,7 @@ } [CLSCompliant(false)] // TODO: Why does this cause a problem in 1.1 - public string RootSQLAlias + public string RootSQLAlias { get { return rootSQLAlias; } } Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090 ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs (from rev 3854, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,194 @@ +using System.Collections; +using log4net.Core; +using NHibernate.AdoNet; +using NHibernate.Cfg; +using NHibernate.Criterion; +using NHibernate.Driver; +using NHibernate.Stat; +using NUnit.Framework; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + using (ISession s = OpenSession()) + using (ITransaction tran = s.BeginTransaction()) + { + MainClass m = new MainClass(); + m.Description = "description1"; + m.Title = "title1"; + + MainClass m2 = new MainClass(); + m2.Description = "description2"; + m2.Title = "title2"; + s.Save(m); + s.Save(m2); + tran.Commit(); + } + } + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + using (ITransaction tran = s.BeginTransaction()) + { + s.Delete("from MainClass"); + tran.Commit(); + } + + + } + [Test] + public void CriteriaCanCacheSingleResultSingleProperty() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof (MainClass)); + criteria.Add(Restrictions.Eq("Title", "title1")); + criteria.SetProjection(Projections.Property("Description")); + criteria.SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + string result = (string)criteria.UniqueResult(); + Assert.AreEqual("description1", result); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + string newResult = (string)criteria.UniqueResult(); + Assert.AreEqual("description1", newResult); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + [Test] + public void CriteriaCanCacheSingleResulMultipleProperty() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(MainClass)); + criteria.Add(Restrictions.Eq("Title", "title1")); + criteria.SetProjection(Projections.ProjectionList() + .Add(Projections.Property("Description")) + .Add(Projections.Property("Title"))); + criteria.SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + object[] result = (object[])criteria.UniqueResult(); + Assert.AreEqual("description1", result[0]); + Assert.AreEqual("title1", result[1]); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + object[] newResult = (object[])criteria.UniqueResult(); + Assert.AreEqual("description1", newResult[0]); + Assert.AreEqual("title1", newResult[1]); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + + + [Test] + public void CriteriaCanCacheEntity() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using(ISession session=OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof (MainClass)); + criteria.SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList results = criteria.List(); + Assert.AreEqual(2,results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results = criteria.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + + [Test] + public void CriteriaCanCacheTransformedResult() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(MainClass)) + .SetProjection( + Projections.ProjectionList() + .Add(Projections.Property("Title")) + .Add(Projections.Property("Description"))) + .SetResultTransformer(new TupleToPropertyResultTransformer(typeof(MainClassWithoutId),"Title","Description")) + .SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList<MainClassWithoutId> results=criteria.List<MainClassWithoutId>(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results = criteria.List<MainClassWithoutId>(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(2,results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + [Test] + public void HqlCanCacheEntity() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + IQuery query = session.CreateQuery("from MainClass") + .SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + [Test] + public void HqlCanCacheTransformedResult() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + IQuery query = session.CreateQuery("select m.Title,m.Description from MainClass m") + .SetResultTransformer(new TupleToPropertyResultTransformer(typeof (MainClassWithoutId), "Title", "Description")) + .SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs (from rev 3854, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1144/Classes.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + public class MainClass + { + private int id; + private string description; + private string title; + + public virtual int Id + { + get { return id; } + set { id = value; } + } + + public virtual string Description + { + get { return description; } + set { description = value; } + } + public virtual string Title + { + get { return title; } + set { title = value; } + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + public class MainClassWithoutId + { + public string Title { get; set; } + public string Description { get; set; } + } +} Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml (from rev 3854, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1144/Mappings.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1090"> + + <class name="MainClass"> + <id name="Id" type="int"> + <generator class="native" /> + </id> + <property name="Title" type="string" length="50"/> + <property name="Description" type="string" length="50"/> + </class> + +</hibernate-mapping> \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,52 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using NHibernate.Transform; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + public class TupleToPropertyResultTransformer : IResultTransformer + { + private System.Type result; + private PropertyInfo[] properties; + + public TupleToPropertyResultTransformer(System.Type result, params string[] names) + { + this.result = result; + List<PropertyInfo> props = new List<PropertyInfo>(); + foreach (string name in names) + { + props.Add(result.GetProperty(name)); + } + properties = props.ToArray(); + } + + public object TransformTuple(object[] tuple, string[] aliases) + { + object instance = Activator.CreateInstance(result); + for (int i = 0; i < tuple.Length; i++) + { + properties[i].SetValue(instance, tuple[i], null); + } + return instance; + } + + public System.Collections.IList TransformList(IList collection) + { + return collection; + } + + public override int GetHashCode() + { + return 1234; + } + + public override bool Equals(object obj) + { + return true; + } + } + +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-21 18:49:38 UTC (rev 3871) @@ -380,6 +380,10 @@ <Compile Include="NHSpecificTest\NH1033\Reptile.cs" /> <Compile Include="NHSpecificTest\NH1077\A.cs" /> <Compile Include="NHSpecificTest\NH1077\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1090\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1090\MainClass.cs" /> + <Compile Include="NHSpecificTest\NH1090\MainClassDescriptionOnly.cs" /> + <Compile Include="NHSpecificTest\NH1090\TuppleToPropertyResultTransformer.cs" /> <Compile Include="NHSpecificTest\NH1098\FilterParameterOrderFixture.cs" /> <Compile Include="NHSpecificTest\NH1098\Model.cs" /> <Compile Include="NHSpecificTest\NH1101\Domain.cs" /> @@ -1509,6 +1513,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1090\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH662\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1495\Mappings.hbm.xml" /> <EmbeddedResource Include="ProjectionFixtures\Mapping.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -146,7 +146,7 @@ firstQueryResults.Add(4); IList secondQueryResults = (IList)cachedQuery[1]; - secondQueryResults[0] = 2; + secondQueryResults[0] = new object[]{2}; using (ISession s = sessions.OpenSession()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |