Skip to content

Commit cf46e82

Browse files
author
Dmitry Naumov
committed
Merge PagingRewriter from 'master' to fix NH-3320
1 parent 0ba587f commit cf46e82

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System.Linq;
2+
using NHibernate.Linq.Visitors;
3+
using Remotion.Linq;
4+
using Remotion.Linq.Clauses;
5+
using Remotion.Linq.Clauses.Expressions;
6+
using Remotion.Linq.Clauses.ResultOperators;
7+
8+
namespace NHibernate.Linq.GroupBy
9+
{
10+
public static class PagingRewriter
11+
{
12+
private static readonly System.Type[] PagingResultOperators = new[]
13+
{
14+
typeof (SkipResultOperator),
15+
typeof (TakeResultOperator),
16+
};
17+
18+
public static void ReWrite(QueryModel queryModel)
19+
{
20+
var subQueryExpression = queryModel.MainFromClause.FromExpression as SubQueryExpression;
21+
22+
if (subQueryExpression != null &&
23+
subQueryExpression.QueryModel.ResultOperators.All(x => PagingResultOperators.Contains(x.GetType())))
24+
{
25+
FlattenSubQuery(subQueryExpression, queryModel);
26+
}
27+
}
28+
29+
private static void FlattenSubQuery(SubQueryExpression subQueryExpression, QueryModel queryModel)
30+
{
31+
// we can not flattern subquery if outer query has body clauses.
32+
var subQueryModel = subQueryExpression.QueryModel;
33+
var subQueryMainFromClause = subQueryModel.MainFromClause;
34+
if (queryModel.BodyClauses.Count == 0)
35+
{
36+
foreach (var resultOperator in subQueryModel.ResultOperators)
37+
queryModel.ResultOperators.Add(resultOperator);
38+
39+
foreach (var bodyClause in subQueryModel.BodyClauses)
40+
queryModel.BodyClauses.Add(bodyClause);
41+
}
42+
else
43+
{
44+
var cro = new ContainsResultOperator(new QuerySourceReferenceExpression(subQueryMainFromClause));
45+
46+
var newSubQueryModel = subQueryModel.Clone();
47+
newSubQueryModel.ResultOperators.Add(cro);
48+
newSubQueryModel.ResultTypeOverride = typeof(bool);
49+
50+
var where = new WhereClause(new SubQueryExpression(newSubQueryModel));
51+
queryModel.BodyClauses.Add(where);
52+
53+
if (!queryModel.BodyClauses.OfType<OrderByClause>().Any())
54+
{
55+
var orderByClauses = subQueryModel.BodyClauses.OfType<OrderByClause>();
56+
foreach (var orderByClause in orderByClauses)
57+
queryModel.BodyClauses.Add(orderByClause);
58+
}
59+
}
60+
61+
// Point all query source references to the outer from clause
62+
queryModel.TransformExpressions(s => new SwapQuerySourceVisitor(queryModel.MainFromClause, subQueryMainFromClause).Swap(s));
63+
64+
// Replace the outer query source
65+
queryModel.MainFromClause = subQueryMainFromClause;
66+
}
67+
}
68+
}

src/NHibernate/Linq/Visitors/QueryModelVisitor.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel quer
3737
// Rewrite non-aggregating group-joins
3838
NonAggregatingGroupJoinRewriter.ReWrite(queryModel);
3939

40+
// Rewrite paging
41+
PagingRewriter.ReWrite(queryModel);
42+
4043
// Flatten pointless subqueries
4144
QueryReferenceExpressionFlattener.ReWrite(queryModel);
4245

src/NHibernate/NHibernate.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,10 @@
288288
<Compile Include="Linq\Clauses\NhHavingClause.cs" />
289289
<Compile Include="Linq\Clauses\NhJoinClause.cs" />
290290
<Compile Include="Linq\ExpressionTransformers\RemoveCharToIntConversion.cs" />
291-
<Compile Include="Linq\ExpressionTransformers\RemoveRedundantCast.cs" />
291+
<Compile Include="Linq\ExpressionTransformers\RemoveRedundantCast.cs" />
292292
<Compile Include="Linq\Functions\DictionaryGenerator.cs" />
293293
<Compile Include="Linq\Functions\EqualsGenerator.cs" />
294+
<Compile Include="Linq\GroupBy\PagingRewriter.cs" />
294295
<Compile Include="Linq\Visitors\NhPartialEvaluatingExpressionTreeVisitor.cs" />
295296
<Compile Include="Linq\QuerySourceNamer.cs" />
296297
<Compile Include="Linq\ReWriters\AddJoinsReWriter.cs" />

0 commit comments

Comments
 (0)