From: <fab...@us...> - 2011-05-12 18:32:59
|
Revision: 5813 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5813&view=rev Author: fabiomaulo Date: 2011-05-12 18:32:53 +0000 (Thu, 12 May 2011) Log Message: ----------- Fix NH-2691 (with some other possible cases) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Expressions/NhCountExpression.cs trunk/nhibernate/src/NHibernate/Linq/ReWriters/MergeAggregatingResultsRewriter.cs trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/NhExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/NhThrowingExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Expressions/NhCountExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Expressions/NhCountExpression.cs 2011-05-12 16:42:27 UTC (rev 5812) +++ trunk/nhibernate/src/NHibernate/Linq/Expressions/NhCountExpression.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -2,27 +2,33 @@ namespace NHibernate.Linq.Expressions { - public class NhCountExpression : NhAggregatedExpression + public abstract class NhCountExpression : NhAggregatedExpression { - public NhCountExpression(Expression expression, System.Type type) - : base(expression, type, NhExpressionType.Count) + protected NhCountExpression(Expression expression, System.Type type) + : base(expression, type, NhExpressionType.Count) {} + + public abstract NhCountExpression CreateNew(Expression expression); + } + + public class NhShortCountExpression : NhCountExpression + { + public NhShortCountExpression(Expression expression) + : base(expression, typeof (int)) {} + + public override NhCountExpression CreateNew(Expression expression) { + return new NhShortCountExpression(expression); } } - public class NhShortCountExpression : NhCountExpression - { - public NhShortCountExpression(Expression expression) - : base(expression, typeof(int)) - { - } - } + public class NhLongCountExpression : NhCountExpression + { + public NhLongCountExpression(Expression expression) + : base(expression, typeof (long)) {} - public class NhLongCountExpression : NhCountExpression - { - public NhLongCountExpression(Expression expression) - : base(expression, typeof(long)) - { - } - } -} + public override NhCountExpression CreateNew(Expression expression) + { + return new NhLongCountExpression(expression); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/ReWriters/MergeAggregatingResultsRewriter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ReWriters/MergeAggregatingResultsRewriter.cs 2011-05-12 16:42:27 UTC (rev 5812) +++ trunk/nhibernate/src/NHibernate/Linq/ReWriters/MergeAggregatingResultsRewriter.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -110,6 +110,10 @@ return CreateAggregate(m.Arguments[0], (LambdaExpression)m.Arguments[1], e => new NhShortCountExpression(e), () => new CountResultOperator()); + case "LongCount": + return CreateAggregate(m.Arguments[0], (LambdaExpression) m.Arguments[1], + e => new NhLongCountExpression(e), + () => new LongCountResultOperator()); case "Min": return CreateAggregate(m.Arguments[0], (LambdaExpression) m.Arguments[1], e => new NhMinExpression(e), Modified: trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs 2011-05-12 16:42:27 UTC (rev 5812) +++ trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -1,39 +1,33 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using NHibernate.Linq.Expressions; +using System.Linq; using Remotion.Linq; using Remotion.Linq.Clauses; using Remotion.Linq.Clauses.ResultOperators; -using Remotion.Linq.Parsing; namespace NHibernate.Linq.ReWriters { - public class RemoveUnnecessaryBodyOperators : QueryModelVisitorBase - { - private RemoveUnnecessaryBodyOperators() - { - } + public class RemoveUnnecessaryBodyOperators : QueryModelVisitorBase + { + private RemoveUnnecessaryBodyOperators() {} - public static void ReWrite(QueryModel queryModel) - { - var rewriter = new RemoveUnnecessaryBodyOperators(); + public static void ReWrite(QueryModel queryModel) + { + var rewriter = new RemoveUnnecessaryBodyOperators(); - rewriter.VisitQueryModel(queryModel); - } + 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); - } - } + public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index) + { + if (resultOperator is CountResultOperator || resultOperator is LongCountResultOperator) + { + // For count operators, we can remove any order-by result operators + foreach (IBodyClause orderby in queryModel.BodyClauses.Where(bc => bc is OrderByClause).ToList()) + { + queryModel.BodyClauses.Remove(orderby); + } + } - base.VisitResultOperator(resultOperator, queryModel, index); - } - } + base.VisitResultOperator(resultOperator, queryModel, index); + } + } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/NhExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/NhExpressionTreeVisitor.cs 2011-05-12 16:42:27 UTC (rev 5812) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/NhExpressionTreeVisitor.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -78,7 +78,7 @@ { Expression nx = VisitExpression(expression.Expression); - return nx != expression.Expression ? new NhShortCountExpression(nx) : expression; + return nx != expression.Expression ? expression.CreateNew(nx) : expression; } protected virtual Expression VisitNhSum(NhSumExpression expression) Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/NhThrowingExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/NhThrowingExpressionTreeVisitor.cs 2011-05-12 16:42:27 UTC (rev 5812) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/NhThrowingExpressionTreeVisitor.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -85,7 +85,7 @@ { Expression nx = base.VisitExpression(expression.Expression); - return nx != expression.Expression ? new NhCountExpression(nx, expression.Type) : expression; + return nx != expression.Expression ? expression.CreateNew(nx) : expression; } protected virtual Expression BaseVisitNhSum(NhSumExpression expression) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Domain.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -0,0 +1,28 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH2691 +{ + public abstract class Animal + { + public virtual int Id { get; set; } + public virtual string Description { get; set; } + public virtual int Sequence { get; set; } + } + + public abstract class Reptile : Animal + { + public virtual double BodyTemperature { get; set; } + } + + public class Lizard : Reptile { } + + public abstract class Mammal : Animal + { + public virtual bool Pregnant { get; set; } + public virtual DateTime? BirthDate { get; set; } + } + + public class Dog : Mammal { } + + public class Cat : Mammal { } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2691/Fixture.cs 2011-05-12 18:32:53 UTC (rev 5813) @@ -0,0 +1,45 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Linq; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2691 +{ + public class Fixture: TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ConventionModelMapper(); + mapper.IsTablePerClass((type, declared) => false); + mapper.IsTablePerClassHierarchy((type, declared) => true); + var mappings = mapper.CompileMappingFor(new[] {typeof (Animal), typeof (Reptile), typeof (Mammal), typeof (Lizard), typeof (Dog), typeof (Cat)}); + return mappings; + } + + [Test] + public void WhenUseCountWithOrderThenCutTheOrder() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var baseQuery = from cat in session.Query<Cat>() orderby cat.BirthDate select cat; + Executing.This(() => baseQuery.Count()).Should().NotThrow(); + session.Transaction.Commit(); + } + } + + [Test] + public void WhenUseLongCountWithOrderThenCutTheOrder() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var baseQuery = from cat in session.Query<Cat>() orderby cat.BirthDate select cat; + Executing.This(() => baseQuery.LongCount()).Should().NotThrow(); + session.Transaction.Commit(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-12 16:42:27 UTC (rev 5812) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-12 18:32:53 UTC (rev 5813) @@ -820,6 +820,8 @@ <Compile Include="NHSpecificTest\NH2660And2661\Test.cs" /> <Compile Include="NHSpecificTest\NH2673\Blog.cs" /> <Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" /> + <Compile Include="NHSpecificTest\NH2691\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2691\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2697\ArticleGroupItem.cs" /> <Compile Include="NHSpecificTest\NH2697\ArticleItem.cs" /> <Compile Include="NHSpecificTest\NH2697\SampleTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |