From: <fab...@us...> - 2009-04-02 04:26:40
|
Revision: 4173 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4173&view=rev Author: fabiomaulo Date: 2009-04-02 04:26:33 +0000 (Thu, 02 Apr 2009) Log Message: ----------- Additional tests about QueryCache Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-01 19:02:59 UTC (rev 4172) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-02 04:26:33 UTC (rev 4173) @@ -969,6 +969,7 @@ <Compile Include="QueryTest\PositionalParametersFixture.cs" /> <Compile Include="QueryTest\QueryParametersFixture.cs" /> <Compile Include="ReflectionOptimizerTest\LcgFixture.cs" /> + <Compile Include="SecondLevelCacheTest\QueryCacheFixture.cs" /> <Compile Include="SqlTest\Custom\CustomSQLSupportTest.cs" /> <Compile Include="SqlTest\Custom\CustomStoredProcSupportTest.cs" /> <Compile Include="SqlTest\Custom\MySQL\MySQLTest.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs 2009-04-01 19:02:59 UTC (rev 4172) +++ trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs 2009-04-02 04:26:33 UTC (rev 4173) @@ -4,6 +4,7 @@ { private int id; private string name; + private string description= string.Empty; public AnotherItem() { @@ -26,5 +27,11 @@ get { return name; } set { name = value; } } + + public virtual string Description + { + get { return description; } + set { description = value; } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml 2009-04-01 19:02:59 UTC (rev 4172) +++ trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml 2009-04-02 04:26:33 UTC (rev 4173) @@ -24,5 +24,10 @@ <generator class="assigned"/> </id> <property name="Name"/> + <property name="Description"/> </class> + + <query name="Stat" cacheable="true" read-only ="true" cache-region="Statistics"> + select ai.Name, count(*) from AnotherItem ai group by ai.Name + </query> </hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs 2009-04-02 04:26:33 UTC (rev 4173) @@ -0,0 +1,318 @@ +using System; +using System.Collections; +using System.Threading; +using NHibernate.Stat; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; +using NHibernate.Transform; + +namespace NHibernate.Test.SecondLevelCacheTests +{ + [TestFixture] + public class ScalarQueryFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] { "SecondLevelCacheTest.Item.hbm.xml" }; } + } + + protected override void Configure(Cfg.Configuration configuration) + { + configuration.SetProperty(Cfg.Environment.GenerateStatistics, "true"); + } + + public void FillDb(int startId) + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + for (int i = startId; i < startId + 10; i++) + { + s.Save(new AnotherItem { Id = i, Name = (i / 2).ToString() }); + } + tx.Commit(); + } + } + + public void CleanUp() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from AnotherItem"); + tx.Commit(); + } + } + + [Test] + public void ShouldHitCacheUsingNamedQueryWithProjection() + { + FillDb(1); + sessions.Statistics.Clear(); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.GetNamedQuery("Stat").List(); + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCachePutCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(0)); + + sessions.Statistics.Clear(); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.GetNamedQuery("Stat").List(); + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(0)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(1)); + + sessions.Statistics.LogSummary(); + CleanUp(); + } + + [Test] + public void ShouldHitCacheUsingQueryWithProjection() + { + FillDb(1); + sessions.Statistics.Clear(); + + int resultCount; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + resultCount = + s.CreateQuery("select ai.Name, count(*) from AnotherItem ai group by ai.Name").SetCacheable(true).SetCacheRegion( + "Statistics").List().Count; + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCachePutCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(0)); + + sessions.Statistics.Clear(); + + int secondResultCount; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + secondResultCount = s.CreateQuery("select ai.Name, count(*) from AnotherItem ai group by ai.Name") + .SetCacheable(true).SetCacheRegion("Statistics").List().Count; + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(0)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(1)); + Assert.That(secondResultCount, Is.EqualTo(resultCount)); + + sessions.Statistics.LogSummary(); + CleanUp(); + } + + [Test] + public void QueryCacheInvalidation() + { + sessions.EvictQueries(); + sessions.Statistics.Clear(); + + const string queryString = "from Item i where i.Name='widget'"; + + object savedId = CreateItem(queryString); + + QueryStatistics qs = sessions.Statistics.GetQueryStatistics(queryString); + EntityStatistics es = sessions.Statistics.GetEntityStatistics(typeof(Item).FullName); + + Thread.Sleep(200); + + IList result; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(0)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(1)); + Assert.That(es.FetchCount, Is.EqualTo(0)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(NHibernateUtil.IsInitialized(result[0])); + var i = (Item)result[0]; + i.Name = "Widget"; + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(2)); + Assert.That(qs.CacheMissCount, Is.EqualTo(2)); + Assert.That(es.FetchCount, Is.EqualTo(0)); + + Thread.Sleep(200); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + + var i = s.Get<Item>(savedId); + Assert.That(i.Name, Is.EqualTo("Widget")); + + s.Delete(i); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(2)); + Assert.That(qs.CacheMissCount, Is.EqualTo(3)); + Assert.That(qs.CachePutCount, Is.EqualTo(3)); + Assert.That(qs.ExecutionCount, Is.EqualTo(3)); + Assert.That(es.FetchCount, Is.EqualTo(0)); //check that it was being cached + } + + private object CreateItem(string queryString) + { + object savedId; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + var i = new Item { Name = "widget" }; + savedId = s.Save(i); + tx.Commit(); + } + return savedId; + } + + [Test] + public void SimpleProjections() + { + var transformer = new CustomTrasformer(); + sessions.EvictQueries(); + sessions.Statistics.Clear(); + + const string queryString = "select i.Name, i.Description from AnotherItem i where i.Name='widget'"; + + object savedId; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + var i = new AnotherItem { Name = "widget" }; + savedId = s.Save(i); + tx.Commit(); + } + + QueryStatistics qs = sessions.Statistics.GetQueryStatistics(queryString); + EntityStatistics es = sessions.Statistics.GetEntityStatistics(typeof(AnotherItem).FullName); + + Thread.Sleep(200); + + IList result; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(0)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(1)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).SetResultTransformer(transformer).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(1), "hit count should not go up since we are adding a resulttransformer"); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).SetResultTransformer(transformer).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(2), "hit count should go up since we are using the same resulttransformer"); + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + var i = s.Get<AnotherItem>(savedId); + i.Name = "Widget"; + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(3)); + Assert.That(qs.CacheMissCount, Is.EqualTo(3)); + + Thread.Sleep(200); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + + var i = s.Get<AnotherItem>(savedId); + Assert.That(i.Name, Is.EqualTo("Widget")); + + s.Delete(i); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(3)); + Assert.That(qs.CacheMissCount, Is.EqualTo(4)); + Assert.That(qs.CachePutCount, Is.EqualTo(4)); + Assert.That(qs.ExecutionCount, Is.EqualTo(4)); + Assert.That(es.FetchCount, Is.EqualTo(0)); //check that it was being cached + } + + public class CustomTrasformer: IResultTransformer + { + public object TransformTuple(object[] tuple, string[] aliases) + { + return new AnotherItem {Name = tuple[0].ToString(), Description = tuple[1].ToString()}; + } + + public IList TransformList(IList collection) + { + 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. |