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