|
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.
|