From: <ste...@us...> - 2009-10-22 14:59:27
|
Revision: 4795 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4795&view=rev Author: steverstrong Date: 2009-10-22 14:59:17 +0000 (Thu, 22 Oct 2009) Log Message: ----------- Linq modifications to integrate with the HQL Query cache - added missing file from previous commit Added Paths: ----------- trunk/nhibernate/src/NHibernate/Linq/ExpressionKeyVisitor.cs Added: trunk/nhibernate/src/NHibernate/Linq/ExpressionKeyVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ExpressionKeyVisitor.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Linq/ExpressionKeyVisitor.cs 2009-10-22 14:59:17 UTC (rev 4795) @@ -0,0 +1,217 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq.Expressions; +using System.Text; +using Remotion.Data.Linq.Parsing; + +namespace NHibernate.Linq +{ + public class ExpressionKeyVisitor : ExpressionTreeVisitor + { + private readonly IDictionary<ConstantExpression, NamedParameter> _parameters; + readonly StringBuilder _string = new StringBuilder(); + + private ExpressionKeyVisitor(IDictionary<ConstantExpression, NamedParameter> parameters) + { + _parameters = parameters; + } + + public static string Visit(Expression expression, IDictionary<ConstantExpression, NamedParameter> parameters) + { + var visitor = new ExpressionKeyVisitor(parameters); + + visitor.VisitExpression(expression); + + return visitor.ToString(); + } + + public override string ToString() + { + return _string.ToString(); + } + + protected override Expression VisitBinaryExpression(BinaryExpression expression) + { + if (expression.Method != null) + { + _string.Append(expression.Method.DeclaringType.Name); + _string.Append("."); + _string.Append(expression.Method.Name); + } + else + { + _string.Append(expression.NodeType); + } + + _string.Append("("); + + VisitExpression(expression.Left); + _string.Append(", "); + VisitExpression(expression.Right); + + _string.Append(")"); + + return expression; + } + + protected override Expression VisitConditionalExpression(ConditionalExpression expression) + { + VisitExpression(expression.Test); + _string.Append(" ? "); + VisitExpression(expression.IfTrue); + _string.Append(" : "); + VisitExpression(expression.IfFalse); + + return expression; + } + + protected override Expression VisitConstantExpression(ConstantExpression expression) + { + NamedParameter param; + + if (_parameters.TryGetValue(expression, out param)) + { + _string.Append(param.Name); + } + else + { + _string.Append(expression.Value); + } + + return base.VisitConstantExpression(expression); + } + + protected override ElementInit VisitElementInit(ElementInit elementInit) + { + return base.VisitElementInit(elementInit); + } + + protected override ReadOnlyCollection<T> VisitExpressionList<T>(ReadOnlyCollection<T> expressions) + { + if (expressions.Count > 0) + { + VisitExpression(expressions[0]); + + for (var i = 1; i < expressions.Count; i++) + { + _string.Append(", "); + VisitExpression(expressions[i]); + } + } + + return expressions; + } + + protected override Expression VisitInvocationExpression(InvocationExpression expression) + { + return base.VisitInvocationExpression(expression); + } + + protected override Expression VisitLambdaExpression(LambdaExpression expression) + { + _string.Append('('); + VisitExpressionList(expression.Parameters); + _string.Append(") => ("); + VisitExpression(expression.Body); + _string.Append(')'); + + return expression; + } + + protected override Expression VisitListInitExpression(ListInitExpression expression) + { + return base.VisitListInitExpression(expression); + } + + protected override MemberBinding VisitMemberAssignment(MemberAssignment memberAssigment) + { + return base.VisitMemberAssignment(memberAssigment); + } + + protected override MemberBinding VisitMemberBinding(MemberBinding memberBinding) + { + return base.VisitMemberBinding(memberBinding); + } + + protected override Expression VisitMemberExpression(MemberExpression expression) + { + base.VisitMemberExpression(expression); + + _string.Append('.'); + _string.Append(expression.Member.Name); + + return expression; + } + + protected override Expression VisitMemberInitExpression(MemberInitExpression expression) + { + return base.VisitMemberInitExpression(expression); + } + + protected override MemberBinding VisitMemberListBinding(MemberListBinding listBinding) + { + return base.VisitMemberListBinding(listBinding); + } + + protected override MemberBinding VisitMemberMemberBinding(MemberMemberBinding binding) + { + return base.VisitMemberMemberBinding(binding); + } + + protected override Expression VisitMethodCallExpression(MethodCallExpression expression) + { + VisitExpression(expression.Object); + _string.Append('.'); + _string.Append(expression.Method.Name); + _string.Append('('); + VisitExpressionList(expression.Arguments); + _string.Append(')'); + + return expression; + } + + protected override Expression VisitNewArrayExpression(NewArrayExpression expression) + { + return base.VisitNewArrayExpression(expression); + } + + protected override Expression VisitNewExpression(NewExpression expression) + { + _string.Append("new "); + _string.Append(expression.Constructor.DeclaringType.Name); + _string.Append('('); + VisitExpressionList(expression.Arguments); + _string.Append(')'); + + return expression; + } + + protected override Expression VisitParameterExpression(ParameterExpression expression) + { + _string.Append(expression.Name); + + return expression; + } + + protected override Expression VisitTypeBinaryExpression(TypeBinaryExpression expression) + { + return base.VisitTypeBinaryExpression(expression); + } + + protected override Expression VisitUnaryExpression(UnaryExpression expression) + { + _string.Append(expression.NodeType); + _string.Append('('); + VisitExpression(expression.Operand); + _string.Append(')'); + + return expression; + } + + protected override Expression VisitUnknownExpression(Expression expression) + { + return base.VisitUnknownExpression(expression); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |