|
From: <ste...@us...> - 2010-05-27 14:18:14
|
Revision: 4984
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4984&view=rev
Author: steverstrong
Date: 2010-05-27 14:18:07 +0000 (Thu, 27 May 2010)
Log Message:
-----------
Added support for queries such as "from c in db.Customers.Cacheable() select c"
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs
trunk/nhibernate/src/NHibernate.Test/Linq/QueryCacheableTests.cs
Modified: trunk/nhibernate/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs 2010-05-27 10:11:44 UTC (rev 4983)
+++ trunk/nhibernate/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs 2010-05-27 14:18:07 UTC (rev 4984)
@@ -8,17 +8,43 @@
{
public class QueryReferenceExpressionFlattener : NhExpressionTreeVisitor
{
- private QueryReferenceExpressionFlattener()
+ private readonly QueryModel _model;
+
+ private QueryReferenceExpressionFlattener(QueryModel model)
{
+ _model = model;
}
- public static void ReWrite(QueryModel model)
+ public static void ReWrite(QueryModel model)
{
- var visitor = new QueryReferenceExpressionFlattener();
+ var visitor = new QueryReferenceExpressionFlattener(model);
model.TransformExpressions(visitor.VisitExpression);
}
- protected override Expression VisitQuerySourceReferenceExpression(QuerySourceReferenceExpression expression)
+ protected override Expression VisitSubQueryExpression(SubQueryExpression subQuery)
+ {
+ if ((subQuery.QueryModel.BodyClauses.Count == 0) &&
+ ((subQuery.QueryModel.ResultOperators.Count == 0) || (subQuery.QueryModel.ResultOperators.Count == 1 && subQuery.QueryModel.ResultOperators[0] is CacheableResultOperator))
+ )
+ {
+ var selectQuerySource =
+ subQuery.QueryModel.SelectClause.Selector as QuerySourceReferenceExpression;
+
+ if (selectQuerySource != null && selectQuerySource.ReferencedQuerySource == subQuery.QueryModel.MainFromClause)
+ {
+ if (subQuery.QueryModel.ResultOperators.Count == 1)
+ {
+ _model.ResultOperators.Add(subQuery.QueryModel.ResultOperators[0]);
+ }
+
+ return subQuery.QueryModel.MainFromClause.FromExpression;
+ }
+ }
+
+ return base.VisitSubQueryExpression(subQuery);
+ }
+
+ protected override Expression VisitQuerySourceReferenceExpression(QuerySourceReferenceExpression expression)
{
var fromClauseBase = expression.ReferencedQuerySource as FromClauseBase;
@@ -28,10 +54,8 @@
{
return fromClauseBase.FromExpression;
}
- else
- {
- return base.VisitQuerySourceReferenceExpression(expression);
- }
+
+ return base.VisitQuerySourceReferenceExpression(expression);
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/Linq/QueryCacheableTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Linq/QueryCacheableTests.cs 2010-05-27 10:11:44 UTC (rev 4983)
+++ trunk/nhibernate/src/NHibernate.Test/Linq/QueryCacheableTests.cs 2010-05-27 14:18:07 UTC (rev 4984)
@@ -50,6 +50,23 @@
}
[Test]
+ public void QueryIsCacheable3()
+ {
+ Sfi.Statistics.Clear();
+ Sfi.QueryCache.Clear();
+
+ var x = (from c in db.Customers.Cacheable()
+ select c).ToList();
+
+ var x2 = (from c in db.Customers
+ select c).ToList();
+
+ Assert.That(Sfi.Statistics.QueryExecutionCount, Is.EqualTo(2));
+ Assert.That(Sfi.Statistics.QueryCachePutCount, Is.EqualTo(1));
+ Assert.That(Sfi.Statistics.QueryCacheHitCount, Is.EqualTo(0));
+ }
+
+ [Test]
public void QueryIsCacheableWithRegion()
{
Sfi.Statistics.Clear();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|