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