From: <ste...@us...> - 2010-01-19 10:31:27
|
Revision: 4920 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4920&view=rev Author: steverstrong Date: 2010-01-19 10:31:20 +0000 (Tue, 19 Jan 2010) Log Message: ----------- Upgraded to latest re-linq version Modified Paths: -------------- trunk/nhibernate/lib/net/3.5/Remotion.Data.Linq.dll trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs trunk/nhibernate/src/NHibernate/Linq/Functions/QueryableGenerator.cs trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs trunk/nhibernate/src/NHibernate/Linq/ResultOperators/ClientSideTransformOperator.cs trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.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 Removed Paths: ------------- trunk/nhibernate/lib/net/3.5/Remotion.Interfaces.dll trunk/nhibernate/lib/net/3.5/Remotion.dll Modified: trunk/nhibernate/lib/net/3.5/Remotion.Data.Linq.dll =================================================================== (Binary files differ) Deleted: trunk/nhibernate/lib/net/3.5/Remotion.Interfaces.dll =================================================================== (Binary files differ) Deleted: trunk/nhibernate/lib/net/3.5/Remotion.dll =================================================================== (Binary files differ) Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -261,7 +261,7 @@ return new HqlBitwiseNot(_factory); } - public HqlBooleanNot Not(HqlBooleanExpression operand) + public HqlBooleanNot BooleanNot(HqlBooleanExpression operand) { return new HqlBooleanNot(_factory, operand); } Modified: trunk/nhibernate/src/NHibernate/Linq/Functions/QueryableGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Functions/QueryableGenerator.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Linq/Functions/QueryableGenerator.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -75,7 +75,7 @@ // All has two arguments. Arg 1 is the source and arg 2 is the predicate var predicate = (LambdaExpression)arguments[1]; - return treeBuilder.Not( + return treeBuilder.BooleanNot( treeBuilder.Exists( treeBuilder.Query( treeBuilder.SelectFrom( @@ -86,7 +86,7 @@ ) ), treeBuilder.Where( - treeBuilder.Not(visitor.Visit(arguments[1]).AsBooleanExpression()) + treeBuilder.BooleanNot(visitor.Visit(arguments[1]).AsBooleanExpression()) ) ) ) Modified: trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -3,6 +3,7 @@ using System.Linq; using System.Linq.Expressions; using NHibernate.Engine.Query; +using NHibernate.Hql.Ast; using NHibernate.Hql.Ast.ANTLR.Tree; using NHibernate.Linq.ResultOperators; using NHibernate.Linq.Visitors; @@ -71,7 +72,7 @@ ExpressionToHqlTranslationResults = QueryModelVisitor.GenerateHqlQuery(queryModel, _constantToParameterMap, - requiredHqlParameters); + requiredHqlParameters, true); ParameterDescriptors = requiredHqlParameters.AsReadOnly(); _astNode = ExpressionToHqlTranslationResults.Statement.AstNode; Modified: trunk/nhibernate/src/NHibernate/Linq/ResultOperators/ClientSideTransformOperator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ResultOperators/ClientSideTransformOperator.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Linq/ResultOperators/ClientSideTransformOperator.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -1,4 +1,5 @@ using System; +using System.Linq.Expressions; using Remotion.Data.Linq.Clauses; using Remotion.Data.Linq.Clauses.StreamedData; @@ -20,5 +21,9 @@ { throw new NotImplementedException(); } + + public override void TransformExpressions(Func<Expression, Expression> transformation) + { + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -3,7 +3,6 @@ using System.Linq; using System.Linq.Expressions; using NHibernate.Transform; -using Remotion.Collections; namespace NHibernate.Linq { Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -325,7 +325,7 @@ switch (expression.NodeType) { case ExpressionType.Not: - return _hqlTreeBuilder.Not(VisitExpression(expression.Operand).AsBooleanExpression()); + return _hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).AsBooleanExpression()); case ExpressionType.Convert: return VisitExpression(expression.Operand); } @@ -415,7 +415,7 @@ protected HqlTreeNode VisitSubQueryExpression(SubQueryExpression expression) { - ExpressionToHqlTranslationResults query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters); + ExpressionToHqlTranslationResults query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters, false); return query.Statement; } Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -21,7 +21,7 @@ { public class QueryModelVisitor : QueryModelVisitorBase { - public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) + public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters, bool root) { // Remove unnecessary body operators RemoveUnnecessaryBodyOperators.ReWrite(queryModel); @@ -44,7 +44,7 @@ // Flatten pointless subqueries QueryReferenceExpressionFlattener.ReWrite(queryModel); - var visitor = new QueryModelVisitor(parameters, requiredHqlParameters); + var visitor = new QueryModelVisitor(parameters, requiredHqlParameters, root); visitor.VisitQueryModel(queryModel); return visitor.GetTranslation(); @@ -62,20 +62,28 @@ private readonly IDictionary<ConstantExpression, NamedParameter> _parameters; private readonly IList<NamedParameterDescriptor> _requiredHqlParameters; + private readonly bool _root; private bool _serverSide = true; private HqlTreeNode _treeNode; + private System.Type _resultType; - private QueryModelVisitor(IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) + private QueryModelVisitor(IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters, bool root) { _parameters = parameters; _requiredHqlParameters = requiredHqlParameters; - _hqlTreeBuilder = new HqlTreeBuilder(); + _root = root; + _hqlTreeBuilder = new HqlTreeBuilder(); _treeNode = _hqlTreeBuilder.Query(_hqlTreeBuilder.SelectFrom(_hqlTreeBuilder.From())); } public ExpressionToHqlTranslationResults GetTranslation() { + if (_root) + { + DetectOuterExists(); + } + return new ExpressionToHqlTranslationResults(_treeNode, _itemTransformers, _listTransformers, @@ -83,6 +91,20 @@ _additionalCriteria); } + private void DetectOuterExists() + { + if (_treeNode is HqlExists) + { + _treeNode = _treeNode.Children.First(); + + _additionalCriteria.Add((q, p) => q.SetMaxResults(1)); + + Expression<Func<IEnumerable<object>, bool>> x = l => l.Any(); + + _listTransformers.Add(x); + } + } + public override void VisitMainFromClause(MainFromClause fromClause, QueryModel queryModel) { AddFromClause(_hqlTreeBuilder.Range( @@ -194,6 +216,14 @@ { ProcessAggregateOperator((AggregateResultOperator)resultOperator); } + else if (resultOperator is AnyResultOperator) + { + ProcessAnyOperator((AnyResultOperator) resultOperator); + } + else if (resultOperator is AllResultOperator) + { + ProcessAllOperator((AllResultOperator) resultOperator); + } else { throw new NotSupportedException(string.Format("The {0} result operator is not current supported", @@ -201,6 +231,20 @@ } } + private void ProcessAllOperator(AllResultOperator resultOperator) + { + AddWhereClause(_hqlTreeBuilder.BooleanNot( + HqlGeneratorExpressionTreeVisitor.Visit(resultOperator.Predicate, _parameters, + _requiredHqlParameters).AsBooleanExpression())); + + _treeNode = _hqlTreeBuilder.BooleanNot(_hqlTreeBuilder.Exists((HqlQuery)_treeNode)); + } + + private void ProcessAnyOperator(AnyResultOperator anyOperator) + { + _treeNode = _hqlTreeBuilder.Exists((HqlQuery) _treeNode); + } + private void ProcessContainsOperator(ContainsResultOperator resultOperator) { var itemExpression = Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-01-19 10:31:20 UTC (rev 4920) @@ -55,10 +55,6 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\..\lib\net\3.5\log4net.dll</HintPath> </Reference> - <Reference Include="Remotion, Version=1.13.9.2, Culture=neutral, PublicKeyToken=cab60358ab4081ea, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\..\lib\net\3.5\Remotion.dll</HintPath> - </Reference> <Reference Include="Remotion.Data.Linq, Version=1.13.9.2, Culture=neutral, PublicKeyToken=cab60358ab4081ea, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\lib\net\3.5\Remotion.Data.Linq.dll</HintPath> Modified: trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs 2010-01-17 19:31:11 UTC (rev 4919) +++ trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs 2010-01-19 10:31:20 UTC (rev 4920) @@ -7,7 +7,6 @@ public class MethodCallTests : LinqTestCase { [Test] - [Ignore("Waiting for re-linq support")] public void CanExecuteAny() { bool result = db.Users.Any(); @@ -15,7 +14,6 @@ } [Test] - [Ignore("Waiting for re-linq support")] public void CanExecuteAnyWithArguments() { bool result = db.Users.Any(u => u.Name == "user-does-not-exist"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |