From: <fab...@us...> - 2011-04-08 05:24:55
|
Revision: 5637 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5637&view=rev Author: fabiomaulo Date: 2011-04-08 05:24:48 +0000 (Fri, 08 Apr 2011) Log Message: ----------- Minor refactoring (class renaming thinking in NH-2611) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Linq/DefaultQueryProvider.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs Copied: trunk/nhibernate/src/NHibernate/Linq/DefaultQueryProvider.cs (from rev 5634, trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/DefaultQueryProvider.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Linq/DefaultQueryProvider.cs 2011-04-08 05:24:48 UTC (rev 5637) @@ -0,0 +1,177 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using NHibernate.Engine; +using NHibernate.Impl; +using NHibernate.Type; + +namespace NHibernate.Linq +{ + public class DefaultQueryProvider : IQueryProvider + { + private readonly ISessionImplementor _session; + + public DefaultQueryProvider(ISessionImplementor session) + { + _session = session; + } + + public object Execute(Expression expression) + { + IQuery query; + NhLinqExpression nhQuery; + NhLinqExpression nhLinqExpression = PrepareQuery(expression, out query, out nhQuery); + + return ExecuteQuery(nhLinqExpression, query, nhQuery); + } + + public object ExecuteFuture(Expression expression) + { + IQuery query; + NhLinqExpression nhQuery; + NhLinqExpression nhLinqExpression = PrepareQuery(expression, out query, out nhQuery); + return ExecuteFutureQuery(nhLinqExpression, query, nhQuery); + } + + private NhLinqExpression PrepareQuery(Expression expression, out IQuery query, out NhLinqExpression nhQuery) + { + var nhLinqExpression = new NhLinqExpression(expression); + + query = _session.CreateQuery(nhLinqExpression); + + nhQuery = query.As<ExpressionQueryImpl>().QueryExpression.As<NhLinqExpression>(); + + SetParameters(query, nhLinqExpression.ParameterValuesByName); + SetResultTransformerAndAdditionalCriteria(query, nhQuery, nhLinqExpression.ParameterValuesByName); + return nhLinqExpression; + } + + private object ExecuteFutureQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) + { + MethodInfo method; + if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) + { + method = typeof (IQuery).GetMethod("Future").MakeGenericMethod(nhQuery.Type); + } + else + { + method = typeof(IQuery).GetMethod("FutureValue").MakeGenericMethod(nhQuery.Type); + } + + var result = method.Invoke(query, new object[0]); + + + + if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) + { + ((IDelayedValue) result).ExecuteOnEval = nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer; + } + + return result; + + } + + private object ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) + { + var results = query.List(); + + if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) + { + try + { + return nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer.DynamicInvoke(results.AsQueryable()); + } + catch (TargetInvocationException e) + { + throw e.InnerException; + } + } + + if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) + { + return results.AsQueryable(); + } + + return results[0]; + } + + public TResult Execute<TResult>(Expression expression) + { + return (TResult) Execute(expression); + } + + public IQueryable CreateQuery(Expression expression) + { + var m = ReflectionHelper.GetMethodDefinition((DefaultQueryProvider p) => p.CreateQuery<object>(null)).MakeGenericMethod(expression.Type.GetGenericArguments()[0]); + + return (IQueryable) m.Invoke(this, new[] {expression}); + } + + public IQueryable<T> CreateQuery<T>(Expression expression) + { + return new NhQueryable<T>(this, expression); + } + + static void SetParameters(IQuery query, IDictionary<string, Tuple<object, IType>> parameters) + { + foreach (var parameterName in query.NamedParameters) + { + var param = parameters[parameterName]; + + if (param.First == null) + { + if (typeof(ICollection).IsAssignableFrom(param.Second.ReturnedClass)) + { + query.SetParameterList(parameterName, null, param.Second); + } + else + { + query.SetParameter(parameterName, null, param.Second); + } + } + else + { + if (param.First is ICollection) + { + query.SetParameterList(parameterName, (ICollection) param.First); + } + else if (param.Second != null) + { + query.SetParameter(parameterName, param.First, param.Second); + } + else + { + query.SetParameter(parameterName, param.First); + } + } + } + } + + public void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLinqExpression nhExpression, IDictionary<string, Tuple<object, IType>> parameters) + { + query.SetResultTransformer(nhExpression.ExpressionToHqlTranslationResults.ResultTransformer); + + foreach (var criteria in nhExpression.ExpressionToHqlTranslationResults.AdditionalCriteria) + { + criteria(query, parameters); + } + } + } + + public class Tuple<T1, T2> + { + public T1 First { get; set; } + public T2 Second { get; set; } + + } + + public class Tuple<T1, T2, T3> + { + public T1 First { get; set; } + public T2 Second { get; set; } + public T3 Third { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-04-08 05:11:33 UTC (rev 5636) +++ trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-04-08 05:24:48 UTC (rev 5637) @@ -53,7 +53,7 @@ throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); - var future = ((NhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); + var future = ((DefaultQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); return (IEnumerable<T>)future; } @@ -63,7 +63,7 @@ if (nhQueryable == null) throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); - var future = ((NhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); + var future = ((DefaultQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); if(future is DelayedEnumerator<T>) { return new FutureValue<T>(() => ((IEnumerable<T>) future)); Deleted: trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2011-04-08 05:11:33 UTC (rev 5636) +++ trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2011-04-08 05:24:48 UTC (rev 5637) @@ -1,177 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using NHibernate.Engine; -using NHibernate.Impl; -using NHibernate.Type; - -namespace NHibernate.Linq -{ - public class NhQueryProvider : IQueryProvider - { - private readonly ISessionImplementor _session; - - public NhQueryProvider(ISessionImplementor session) - { - _session = session; - } - - public object Execute(Expression expression) - { - IQuery query; - NhLinqExpression nhQuery; - NhLinqExpression nhLinqExpression = PrepareQuery(expression, out query, out nhQuery); - - return ExecuteQuery(nhLinqExpression, query, nhQuery); - } - - public object ExecuteFuture(Expression expression) - { - IQuery query; - NhLinqExpression nhQuery; - NhLinqExpression nhLinqExpression = PrepareQuery(expression, out query, out nhQuery); - return ExecuteFutureQuery(nhLinqExpression, query, nhQuery); - } - - private NhLinqExpression PrepareQuery(Expression expression, out IQuery query, out NhLinqExpression nhQuery) - { - var nhLinqExpression = new NhLinqExpression(expression); - - query = _session.CreateQuery(nhLinqExpression); - - nhQuery = query.As<ExpressionQueryImpl>().QueryExpression.As<NhLinqExpression>(); - - SetParameters(query, nhLinqExpression.ParameterValuesByName); - SetResultTransformerAndAdditionalCriteria(query, nhQuery, nhLinqExpression.ParameterValuesByName); - return nhLinqExpression; - } - - private object ExecuteFutureQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) - { - MethodInfo method; - if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) - { - method = typeof (IQuery).GetMethod("Future").MakeGenericMethod(nhQuery.Type); - } - else - { - method = typeof(IQuery).GetMethod("FutureValue").MakeGenericMethod(nhQuery.Type); - } - - var result = method.Invoke(query, new object[0]); - - - - if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) - { - ((IDelayedValue) result).ExecuteOnEval = nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer; - } - - return result; - - } - - private object ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) - { - var results = query.List(); - - if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) - { - try - { - return nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer.DynamicInvoke(results.AsQueryable()); - } - catch (TargetInvocationException e) - { - throw e.InnerException; - } - } - - if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) - { - return results.AsQueryable(); - } - - return results[0]; - } - - public TResult Execute<TResult>(Expression expression) - { - return (TResult) Execute(expression); - } - - public IQueryable CreateQuery(Expression expression) - { - var m = ReflectionHelper.GetMethodDefinition((NhQueryProvider p) => p.CreateQuery<object>(null)).MakeGenericMethod(expression.Type.GetGenericArguments()[0]); - - return (IQueryable) m.Invoke(this, new[] {expression}); - } - - public IQueryable<T> CreateQuery<T>(Expression expression) - { - return new NhQueryable<T>(this, expression); - } - - static void SetParameters(IQuery query, IDictionary<string, Tuple<object, IType>> parameters) - { - foreach (var parameterName in query.NamedParameters) - { - var param = parameters[parameterName]; - - if (param.First == null) - { - if (typeof(ICollection).IsAssignableFrom(param.Second.ReturnedClass)) - { - query.SetParameterList(parameterName, null, param.Second); - } - else - { - query.SetParameter(parameterName, null, param.Second); - } - } - else - { - if (param.First is ICollection) - { - query.SetParameterList(parameterName, (ICollection) param.First); - } - else if (param.Second != null) - { - query.SetParameter(parameterName, param.First, param.Second); - } - else - { - query.SetParameter(parameterName, param.First); - } - } - } - } - - public void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLinqExpression nhExpression, IDictionary<string, Tuple<object, IType>> parameters) - { - query.SetResultTransformer(nhExpression.ExpressionToHqlTranslationResults.ResultTransformer); - - foreach (var criteria in nhExpression.ExpressionToHqlTranslationResults.AdditionalCriteria) - { - criteria(query, parameters); - } - } - } - - public class Tuple<T1, T2> - { - public T1 First { get; set; } - public T2 Second { get; set; } - - } - - public class Tuple<T1, T2, T3> - { - public T1 First { get; set; } - public T2 Second { get; set; } - public T3 Third { get; set; } - } -} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs 2011-04-08 05:11:33 UTC (rev 5636) +++ trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs 2011-04-08 05:24:48 UTC (rev 5637) @@ -12,7 +12,7 @@ { // This constructor is called by our users, create a new IQueryExecutor. public NhQueryable(ISessionImplementor session) - : base(new NhQueryProvider(session)) + : base(new DefaultQueryProvider(session)) { } Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-08 05:11:33 UTC (rev 5636) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-08 05:24:48 UTC (rev 5637) @@ -933,7 +933,7 @@ <Compile Include="Linq\Visitors\ExpressionParameterVisitor.cs" /> <Compile Include="Linq\NhLinqExpression.cs" /> <Compile Include="Linq\NhLinqExpressionReturnType.cs" /> - <Compile Include="Linq\NhQueryProvider.cs" /> + <Compile Include="Linq\DefaultQueryProvider.cs" /> <Compile Include="Linq\Visitors\ExpressionKeyVisitor.cs" /> <Compile Include="Linq\GroupBy\GroupByAggregateDetectionVisitor.cs" /> <Compile Include="Linq\GroupBy\AggregatingGroupByRewriter.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |