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