|
From: <ste...@us...> - 2009-11-25 20:17:08
|
Revision: 4858
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4858&view=rev
Author: steverstrong
Date: 2009-11-25 20:16:50 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
Added additional Linq tests and upgraded to latest re-linq trunk
Modified Paths:
--------------
trunk/nhibernate/lib/net/3.5/Remotion.Data.Linq.dll
trunk/nhibernate/lib/net/3.5/Remotion.Interfaces.dll
trunk/nhibernate/lib/net/3.5/Remotion.dll
trunk/nhibernate/src/NHibernate/IQueryExpression.cs
trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs
trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs
trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs
trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs
trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs
trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs
trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs
trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs
trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs
trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs
trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs
Modified: trunk/nhibernate/lib/net/3.5/Remotion.Data.Linq.dll
===================================================================
(Binary files differ)
Modified: trunk/nhibernate/lib/net/3.5/Remotion.Interfaces.dll
===================================================================
(Binary files differ)
Modified: trunk/nhibernate/lib/net/3.5/Remotion.dll
===================================================================
(Binary files differ)
Modified: trunk/nhibernate/src/NHibernate/IQueryExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/IQueryExpression.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/IQueryExpression.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -11,6 +11,5 @@
string Key { get; }
System.Type Type { get; }
IList<NamedParameterDescriptor> ParameterDescriptors { get; }
- void SetQueryPropertiesPriorToExecute(IQuery impl);
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -258,8 +258,8 @@
using (new SessionIdLoggingContext(SessionId))
{
CheckAndUpdateSessionStatus();
- HQLQueryPlan queryPlan = GetHQLQueryPlan(queryExpression, false);
- QueryImpl query = new QueryImpl(queryPlan.QueryExpression,
+ var queryPlan = GetHQLQueryPlan(queryExpression, false);
+ var query = new ExpressionQueryImpl(queryPlan.QueryExpression,
this,
queryPlan.ParameterMetadata
);
Added: trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -0,0 +1,72 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NHibernate.Engine;
+using NHibernate.Engine.Query;
+
+namespace NHibernate.Impl
+{
+ class ExpressionQueryImpl : AbstractQueryImpl
+ {
+ private readonly Dictionary<string, LockMode> _lockModes = new Dictionary<string, LockMode>(2);
+
+ public IQueryExpression QueryExpression { get; private set; }
+
+ public ExpressionQueryImpl(IQueryExpression queryExpression, ISessionImplementor session, ParameterMetadata parameterMetadata)
+ : base(queryExpression.Key, FlushMode.Unspecified, session, parameterMetadata)
+ {
+ QueryExpression = queryExpression;
+ }
+
+ public override IQuery SetLockMode(string alias, LockMode lockMode)
+ {
+ _lockModes[alias] = lockMode;
+ return this;
+ }
+
+ protected internal override IDictionary<string, LockMode> LockModes
+ {
+ get { return _lockModes; }
+ }
+
+ public override int ExecuteUpdate()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IEnumerable Enumerable()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IEnumerable<T> Enumerable<T>()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IList List()
+ {
+ VerifyParameters();
+ IDictionary<string, TypedValue> namedParams = NamedParams;
+ Before();
+ try
+ {
+ return Session.List(QueryExpression, GetQueryParameters(namedParams));
+ }
+ finally
+ {
+ After();
+ }
+ }
+
+ public override void List(IList results)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IList<T> List<T>()
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -13,7 +13,6 @@
public class QueryImpl : AbstractQueryImpl
{
private readonly Dictionary<string, LockMode> lockModes = new Dictionary<string, LockMode>(2);
- private readonly IQueryExpression _queryExpression;
public QueryImpl(string queryString, FlushMode flushMode, ISessionImplementor session, ParameterMetadata parameterMetadata)
: base(queryString, flushMode, session, parameterMetadata)
@@ -25,12 +24,6 @@
{
}
- public QueryImpl(IQueryExpression queryExpression, ISessionImplementor session, ParameterMetadata parameterMetadata)
- : base(queryExpression.Key, FlushMode.Unspecified, session, parameterMetadata)
- {
- _queryExpression = queryExpression;
- }
-
public override IEnumerable Enumerable()
{
VerifyParameters();
@@ -68,15 +61,7 @@
Before();
try
{
- if (_queryExpression == null)
- {
- return Session.List(ExpandParameterLists(namedParams), GetQueryParameters(namedParams));
- }
- else
- {
- _queryExpression.SetQueryPropertiesPriorToExecute(this);
- return Session.List(_queryExpression, GetQueryParameters(namedParams));
- }
+ return Session.List(ExpandParameterLists(namedParams), GetQueryParameters(namedParams));
}
finally
{
Added: trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using NHibernate.Hql.Ast;
+
+namespace NHibernate.Linq
+{
+ public class ExpressionToHqlTranslationResults
+ {
+ public HqlQuery Statement { get; private set; }
+ public ResultTransformer ResultTransformer { get; private set; }
+ public List<Action<IQuery, IDictionary<string, object>>> AdditionalCriteria { get; private set; }
+
+ public ExpressionToHqlTranslationResults(HqlQuery statement, IList<LambdaExpression> itemTransformers, IList<LambdaExpression> listTransformers, List<Action<IQuery, IDictionary<string, object>>> additionalCriteria)
+ {
+ Statement = statement;
+
+ var itemTransformer = MergeLambdas(itemTransformers);
+ var listTransformer = MergeLambdas(listTransformers);
+
+ if (itemTransformer != null || listTransformer != null)
+ {
+ ResultTransformer = new ResultTransformer(itemTransformer, listTransformer);
+ }
+
+ AdditionalCriteria = additionalCriteria;
+ }
+
+ private static LambdaExpression MergeLambdas(IList<LambdaExpression> transformations)
+ {
+ if (transformations == null || transformations.Count == 0)
+ {
+ return null;
+ }
+
+ var listTransformLambda = transformations[0];
+
+ for (int i = 1; i < transformations.Count; i++)
+ {
+ var invoked = Expression.Invoke(transformations[i], listTransformLambda.Body);
+
+ listTransformLambda = Expression.Lambda(invoked, listTransformLambda.Parameters.ToArray());
+ }
+
+ return listTransformLambda;
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -6,6 +6,7 @@
using NHibernate.Hql.Ast.ANTLR.Tree;
using NHibernate.Linq.ResultOperators;
using NHibernate.Linq.Visitors;
+using Remotion.Data.Linq;
using Remotion.Data.Linq.Clauses;
using Remotion.Data.Linq.Clauses.StreamedData;
using Remotion.Data.Linq.Parsing.ExpressionTreeVisitors;
@@ -16,24 +17,20 @@
{
public class NhLinqExpression : IQueryExpression
{
- private static readonly MethodCallExpressionNodeTypeRegistry MethodCallRegistry =
- MethodCallExpressionNodeTypeRegistry.CreateDefault();
+ public string Key { get; private set; }
- static NhLinqExpression()
- {
- MethodCallRegistry.Register(
- new[]
- {
- MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object>(null, null))),
- MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object, object>(null, null, null)))
- },
- typeof (AggregateExpressionNode));
- }
+ public System.Type Type { get; private set; }
+ public IList<NamedParameterDescriptor> ParameterDescriptors { get; private set; }
+ public NhLinqExpressionReturnType ReturnType { get; private set; }
+
+ public IDictionary<string, object> ParameterValuesByName { get; private set; }
+
+ public ExpressionToHqlTranslationResults ExpressionToHqlTranslationResults { get; private set; }
+
private readonly Expression _expression;
- private CommandData _commandData;
- private readonly IDictionary<ConstantExpression, NamedParameter> _queryParameters;
+ private readonly IDictionary<ConstantExpression, NamedParameter> _constantToParameterMap;
public NhLinqExpression(Expression expression)
{
@@ -41,13 +38,13 @@
_expression = NameUnNamedParameters.Visit(_expression);
- _queryParameters = ExpressionParameterVisitor.Visit(_expression);
- ParameterValuesByName = _queryParameters.Values.ToDictionary(p => p.Name, p => p.Value);
+ _constantToParameterMap = ExpressionParameterVisitor.Visit(_expression);
- Key = ExpressionKeyVisitor.Visit(_expression, _queryParameters);
- Type = _expression.Type;
+ ParameterValuesByName = _constantToParameterMap.Values.ToDictionary(p => p.Name, p => p.Value);
- ParameterValues = _queryParameters.Values;
+ Key = ExpressionKeyVisitor.Visit(_expression, _constantToParameterMap);
+
+ Type = _expression.Type;
// Note - re-linq handles return types via the GetOutputDataInfo method, and allows for SingleOrDefault here for the ChoiceResultOperator...
ReturnType = NhLinqExpressionReturnType.Scalar;
@@ -64,34 +61,38 @@
var requiredHqlParameters = new List<NamedParameterDescriptor>();
// TODO - can we cache any of this?
- var queryModel = new QueryParser(new ExpressionTreeParser(MethodCallRegistry)).GetParsedQuery(_expression);
+ var queryModel = NhRelinqQueryParser.Parse(_expression);
- _commandData = QueryModelVisitor.GenerateHqlQuery(queryModel, _queryParameters, requiredHqlParameters);
+ ExpressionToHqlTranslationResults = QueryModelVisitor.GenerateHqlQuery(queryModel, _constantToParameterMap, requiredHqlParameters);
ParameterDescriptors = requiredHqlParameters.AsReadOnly();
- return _commandData.Statement.AstNode;
+ return ExpressionToHqlTranslationResults.Statement.AstNode;
}
+ }
- public string Key { get; private set; }
+ public static class NhRelinqQueryParser
+ {
+ public static readonly MethodCallExpressionNodeTypeRegistry MethodCallRegistry =
+ MethodCallExpressionNodeTypeRegistry.CreateDefault();
- public IList<NamedParameterDescriptor> ParameterDescriptors { get; private set; }
+ static NhRelinqQueryParser()
+ {
+ MethodCallRegistry.Register(
+ new[]
+ {
+ MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object>(null, null))),
+ MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object, object>(null, null, null)))
+ },
+ typeof (AggregateExpressionNode));
+ }
- public ICollection<NamedParameter> ParameterValues { get; private set; }
+ public static QueryModel Parse(Expression expression)
+ {
+ return new QueryParser(new ExpressionTreeParser(MethodCallRegistry)).GetParsedQuery(expression);
+ }
+ }
- public NhLinqExpressionReturnType ReturnType { get; private set; }
-
- public System.Type Type { get; private set; }
-
- public IDictionary<string, object> ParameterValuesByName { get; private set; }
-
- public void SetQueryPropertiesPriorToExecute(IQuery impl)
- {
- _commandData.SetResultTransformer(impl);
- _commandData.AddAdditionalCriteria(impl);
- }
- }
-
public class NameUnNamedParameters : NhExpressionTreeVisitor
{
public static Expression Visit(Expression expression)
Modified: trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
+using NHibernate.Impl;
namespace NHibernate.Linq
{
@@ -21,6 +22,7 @@
var query = _session.CreateQuery(nhLinqExpression);
SetParameters(query, nhLinqExpression.ParameterValuesByName);
+ SetResultTransformerAndAdditionalCriteria(query, nhLinqExpression.ParameterValuesByName);
var results = query.List();
@@ -56,5 +58,19 @@
query.SetParameter(parameterName, parameters[parameterName]);
}
}
+
+ public void SetResultTransformerAndAdditionalCriteria(IQuery query, IDictionary<string, object> parameters)
+ {
+ var queryImpl = (ExpressionQueryImpl) query;
+
+ var nhExpression = (NhLinqExpression) queryImpl.QueryExpression;
+
+ query.SetResultTransformer(nhExpression.ExpressionToHqlTranslationResults.ResultTransformer);
+
+ foreach (var criteria in nhExpression.ExpressionToHqlTranslationResults.AdditionalCriteria)
+ {
+ criteria(query, parameters);
+ }
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -0,0 +1,36 @@
+using System;
+using System.Linq;
+using Remotion.Data.Linq;
+using Remotion.Data.Linq.Clauses;
+using Remotion.Data.Linq.Clauses.ResultOperators;
+
+namespace NHibernate.Linq.ReWriters
+{
+ public class RemoveUnnecessaryBodyOperators : QueryModelVisitorBase
+ {
+ private RemoveUnnecessaryBodyOperators()
+ {
+ }
+
+ public static void ReWrite(QueryModel queryModel)
+ {
+ var rewriter = new RemoveUnnecessaryBodyOperators();
+
+ rewriter.VisitQueryModel(queryModel);
+ }
+
+ public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index)
+ {
+ if (resultOperator is CountResultOperator)
+ {
+ // For count operators, we can remove any order-by result operators
+ foreach (var orderby in queryModel.BodyClauses.Where(bc => bc is OrderByClause).ToList())
+ {
+ queryModel.BodyClauses.Remove(orderby);
+ }
+ }
+
+ base.VisitResultOperator(resultOperator, queryModel, index);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -15,12 +15,12 @@
/// </summary>
public class ExpressionKeyVisitor : ExpressionTreeVisitor
{
- private readonly IDictionary<ConstantExpression, NamedParameter> _parameters;
+ private readonly IDictionary<ConstantExpression, NamedParameter> _constantToParameterMap;
readonly StringBuilder _string = new StringBuilder();
- private ExpressionKeyVisitor(IDictionary<ConstantExpression, NamedParameter> parameters)
+ private ExpressionKeyVisitor(IDictionary<ConstantExpression, NamedParameter> constantToParameterMap)
{
- _parameters = parameters;
+ _constantToParameterMap = constantToParameterMap;
}
public static string Visit(Expression expression, IDictionary<ConstantExpression, NamedParameter> parameters)
@@ -76,7 +76,7 @@
{
NamedParameter param;
- if (_parameters.TryGetValue(expression, out param))
+ if (_constantToParameterMap.TryGetValue(expression, out param))
{
_string.Append(param.Name);
}
Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -353,7 +353,7 @@
protected HqlTreeNode VisitSubQueryExpression(SubQueryExpression expression)
{
- CommandData query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters);
+ ExpressionToHqlTranslationResults query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters);
return query.Statement;
}
Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -18,8 +18,11 @@
{
public class QueryModelVisitor : QueryModelVisitorBase
{
- public static CommandData GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters)
+ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters)
{
+ // Remove unnecessary body operators
+ RemoveUnnecessaryBodyOperators.ReWrite(queryModel);
+
// Merge aggregating result operators (distinct, count, sum etc) into the select clause
MergeAggregatingResultsRewriter.ReWrite(queryModel);
@@ -41,12 +44,12 @@
var visitor = new QueryModelVisitor(parameters, requiredHqlParameters);
visitor.VisitQueryModel(queryModel);
- return visitor.GetHqlCommand();
+ return visitor.GetTranslation();
}
private readonly HqlTreeBuilder _hqlTreeBuilder;
- private readonly List<Action<IQuery>> _additionalCriteria = new List<Action<IQuery>>();
+ private readonly List<Action<IQuery, IDictionary<string, object>>> _additionalCriteria = new List<Action<IQuery, IDictionary<string, object>>>();
private readonly List<LambdaExpression> _listTransformers = new List<LambdaExpression>();
private readonly List<LambdaExpression> _itemTransformers = new List<LambdaExpression>();
@@ -66,7 +69,8 @@
_requiredHqlParameters = requiredHqlParameters;
_hqlTreeBuilder = new HqlTreeBuilder();
}
- public CommandData GetHqlCommand()
+
+ public ExpressionToHqlTranslationResults GetTranslation()
{
HqlSelectFrom selectFrom = _hqlTreeBuilder.SelectFrom();
@@ -104,10 +108,10 @@
query.AddChild(_orderByClause);
}
- return new CommandData(query,
- _itemTransformers,
- _listTransformers,
- _additionalCriteria);
+ return new ExpressionToHqlTranslationResults(query,
+ _itemTransformers,
+ _listTransformers,
+ _additionalCriteria);
}
private HqlBooleanExpression MergeWhereClauses()
@@ -297,14 +301,34 @@
private void ProcessTakeOperator(TakeResultOperator resultOperator)
{
- _additionalCriteria.Add(q => q.SetMaxResults(resultOperator.GetConstantCount()));
+ NamedParameter parameterName;
+
+ // TODO - very similar to ProcessSkip, plus want to investigate the scenario in the "else"
+ // clause to see if it is valid
+ if (_parameters.TryGetValue(resultOperator.Count as ConstantExpression, out parameterName))
+ {
+ _additionalCriteria.Add((q, p) => q.SetMaxResults((int) p[parameterName.Name]));
+ }
+ else
+ {
+ _additionalCriteria.Add((q, p) => q.SetMaxResults(resultOperator.GetConstantCount()));
+ }
}
private void ProcessSkipOperator(SkipResultOperator resultOperator)
{
- _additionalCriteria.Add(q => q.SetFirstResult(resultOperator.GetConstantCount()));
- }
+ NamedParameter parameterName;
+ if (_parameters.TryGetValue(resultOperator.Count as ConstantExpression, out parameterName))
+ {
+ _additionalCriteria.Add((q, p) => q.SetFirstResult((int)p[parameterName.Name]));
+ }
+ else
+ {
+ _additionalCriteria.Add((q, p) => q.SetFirstResult(resultOperator.GetConstantCount()));
+ }
+ }
+
private void ProcessNonAggregatingGroupBy(NonAggregatingGroupBy resultOperator, QueryModel model)
{
var tSource = model.SelectClause.Selector.Type;
@@ -394,7 +418,7 @@
private void ProcessFirstOperator()
{
- _additionalCriteria.Add(q => q.SetMaxResults(1));
+ _additionalCriteria.Add((q, p) => q.SetMaxResults(1));
}
private static bool CanBeEvaluatedInHqlSelectStatement(Expression expression)
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-25 20:16:50 UTC (rev 4858)
@@ -586,6 +586,7 @@
<Compile Include="Linq\Expressions\NhMaxExpression.cs" />
<Compile Include="Linq\Expressions\NhMinExpression.cs" />
<Compile Include="Linq\Expressions\NhSumExpression.cs" />
+ <Compile Include="Impl\ExpressionQueryImpl.cs" />
<Compile Include="Linq\Visitors\IHqlExpressionVisitor.cs" />
<Compile Include="Linq\GroupJoin\IsAggregatingResults.cs" />
<Compile Include="Linq\GroupJoin\GroupJoinAggregateDetectionVisitor.cs" />
@@ -602,6 +603,7 @@
<Compile Include="Linq\Functions\DateTimeGenerator.cs" />
<Compile Include="Linq\Functions\StringGenerator.cs" />
<Compile Include="Linq\Functions\QueryableGenerator.cs" />
+ <Compile Include="Linq\ReWriters\RemoveUnnecessaryBodyOperators.cs" />
<Compile Include="Linq\Visitors\SwapQuerySourceVisitor.cs" />
<Compile Include="Linq\Visitors\EqualityHqlGenerator.cs" />
<Compile Include="Linq\Visitors\ExpressionParameterVisitor.cs" />
@@ -613,7 +615,7 @@
<Compile Include="Linq\GroupBy\AggregatingGroupByRewriter.cs" />
<Compile Include="Linq\GroupJoin\AggregatingGroupJoinRewriter.cs" />
<Compile Include="Linq\ResultOperators\ClientSideTransformOperator.cs" />
- <Compile Include="Linq\CommandData.cs" />
+ <Compile Include="Linq\ExpressionToHqlTranslationResults.cs" />
<Compile Include="Linq\EnumerableHelper.cs" />
<Compile Include="Linq\GroupBy\GroupBySelectClauseRewriter.cs" />
<Compile Include="Linq\Visitors\GroupByKeySelectorVisitor.cs" />
Modified: trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -4,10 +4,10 @@
namespace NHibernate.Test.Linq
{
[TestFixture]
- [Ignore]
public class MethodCallTests : LinqTestCase
{
[Test]
+ [Ignore("Waiting for re-linq support")]
public void CanExecuteAny()
{
bool result = db.Users.Any();
@@ -15,7 +15,8 @@
}
[Test]
- public void CanExecuteAnyWithArguments()
+ [Ignore("Waiting for re-linq support")]
+ public void CanExecuteAnyWithArguments()
{
bool result = db.Users.Any(u => u.Name == "user-does-not-exist");
Assert.IsFalse(result);
Modified: trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -1,5 +1,7 @@
using System;
using System.Linq;
+using System.Linq.Expressions;
+using NHibernate.Test.Linq.Entities;
using NUnit.Framework;
namespace NHibernate.Test.Linq
@@ -29,5 +31,71 @@
Console.WriteLine(count);
}
+
+ [Category("From NHUser list")]
+ [Test(Description = "Telerik grid example, http://www.telerik.com/community/forums/aspnet-mvc/grid/grid-and-nhibernate-linq.aspx")]
+ public void TelerikGridWhereClause()
+ {
+ Expression<Func<Customer, bool>> filter = c => c.ContactName.ToLower().StartsWith("a");
+ IQueryable<Customer> value = db.Customers;
+
+ var results = value.Where(filter).ToList();
+
+ Assert.IsFalse(results.Where(c => !c.ContactName.ToLower().StartsWith("a")).Any());
+ }
+
+ [Category("From NHUser list")]
+ [Test(Description = "Predicated count on a child list")]
+ public void PredicatedCountOnChildList()
+ {
+ var results = (from c in db.Customers
+ select new
+ {
+ c.ContactName,
+ Count = c.Orders.Count(o => o.Employee.EmployeeId == 4)
+ }).ToList();
+
+ Assert.AreEqual(91, results.Count());
+ Assert.AreEqual(2, results.Where(c => c.ContactName == "Maria Anders").Single().Count);
+ Assert.AreEqual(4, results.Where(c => c.ContactName == "Thomas Hardy").Single().Count);
+ Assert.AreEqual(0, results.Where(c => c.ContactName == "Elizabeth Brown").Single().Count);
+ }
+
+ [Category("From NHUser list")]
+ [Test(Description = "Reference an outer object in a predicate")]
+ public void ReferenceToOuter()
+ {
+ var results = from c in db.Customers
+ where
+ c.Orders.Any(o => o.ShippedTo == c.CompanyName)
+ select c;
+
+ Assert.AreEqual(85, results.Count());
+ }
+
+ [Category("Paging")]
+ [Test(Description = "This sample uses a where clause and the Skip and Take operators to select " +
+ "the second, third and fourth pages of products")]
+ public void TriplePageSelection()
+ {
+ IQueryable<Product> q = (
+ from p in db.Products
+ where p.ProductId > 1
+ orderby p.ProductId
+ select p
+ );
+
+ IQueryable<Product> page2 = q.Skip(5).Take(5);
+ IQueryable<Product> page3 = q.Skip(10).Take(5);
+ IQueryable<Product> page4 = q.Skip(15).Take(5);
+
+ var firstResultOnPage2 = page2.First();
+ var firstResultOnPage3 = page3.First();
+ var firstResultOnPage4 = page4.First();
+
+ Assert.AreNotEqual(firstResultOnPage2.ProductId, firstResultOnPage3.ProductId);
+ Assert.AreNotEqual(firstResultOnPage3.ProductId, firstResultOnPage4.ProductId);
+ Assert.AreNotEqual(firstResultOnPage2.ProductId, firstResultOnPage4.ProductId);
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs 2009-11-25 18:36:07 UTC (rev 4857)
+++ trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs 2009-11-25 20:16:50 UTC (rev 4858)
@@ -48,10 +48,10 @@
var nhNewYork = new NhLinqExpression(newYork.Body);
Assert.AreEqual(nhLondon.Key, nhNewYork.Key);
- Assert.AreEqual(1, nhLondon.ParameterValues.Count);
- Assert.AreEqual(1, nhNewYork.ParameterValues.Count);
- Assert.AreEqual("London", nhLondon.ParameterValues.First().Value);
- Assert.AreEqual("New York", nhNewYork.ParameterValues.First().Value);
+ Assert.AreEqual(1, nhLondon.ParameterValuesByName.Count);
+ Assert.AreEqual(1, nhNewYork.ParameterValuesByName.Count);
+ Assert.AreEqual("London", nhLondon.ParameterValuesByName.First().Value);
+ Assert.AreEqual("New York", nhNewYork.ParameterValuesByName.First().Value);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|