1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Linq ;
3
4
using NHibernate . Linq . Clauses ;
4
5
using NHibernate . Linq . Visitors ;
@@ -26,47 +27,44 @@ namespace NHibernate.Linq.GroupBy
26
27
/// This class takes such queries, flattens out the re-linq sub-query and re-writes the outer select
27
28
/// </para>
28
29
/// </summary>
29
- public class AggregatingGroupByRewriter
30
+ public static class AggregatingGroupByRewriter
30
31
{
31
- private AggregatingGroupByRewriter ( ) { }
32
+ private static readonly ICollection < System . Type > AcceptableOuterResultOperators = new HashSet < System . Type >
33
+ {
34
+ typeof ( SkipResultOperator ) ,
35
+ typeof ( TakeResultOperator ) ,
36
+ typeof ( FirstResultOperator ) ,
37
+ typeof ( SingleResultOperator )
38
+ } ;
32
39
33
- public static void ReWrite ( QueryModel queryModel )
40
+ public static void ReWrite ( QueryModel queryModel )
34
41
{
35
42
var subQueryExpression = queryModel . MainFromClause . FromExpression as SubQueryExpression ;
36
43
37
44
if ( ( subQueryExpression != null ) &&
38
45
( subQueryExpression . QueryModel . ResultOperators . Count == 1 ) &&
39
46
( subQueryExpression . QueryModel . ResultOperators [ 0 ] is GroupResultOperator ) )
40
47
{
41
- FlattenSubQuery ( subQueryExpression , queryModel ) ;
48
+ FlattenSubQuery ( queryModel , subQueryExpression . QueryModel ) ;
42
49
}
43
50
}
44
51
45
-
46
- private static readonly System . Type [ ] AcceptableOuterResultOperators = new [ ]
47
- {
48
- typeof ( SkipResultOperator ) ,
49
- typeof ( TakeResultOperator ) ,
50
- } ;
51
-
52
-
53
- private static void FlattenSubQuery ( SubQueryExpression subQueryExpression , QueryModel queryModel )
52
+ private static void FlattenSubQuery ( QueryModel queryModel , QueryModel subQueryModel )
54
53
{
55
- foreach ( var resultOperator in queryModel . ResultOperators )
54
+ foreach ( var resultOperator in queryModel . ResultOperators . Where ( resultOperator => ! AcceptableOuterResultOperators . Contains ( resultOperator . GetType ( ) ) ) )
56
55
{
57
- if ( ! AcceptableOuterResultOperators . Contains ( resultOperator . GetType ( ) ) )
58
- throw new NotImplementedException ( "Cannot use group by with the "
59
- + resultOperator . GetType ( ) . Name + " result operator." ) ;
56
+ throw new NotImplementedException ( "Cannot use group by with the " + resultOperator . GetType ( ) . Name + " result operator." ) ;
60
57
}
61
58
62
59
// Move the result operator up.
63
- var groupBy = ( GroupResultOperator ) subQueryExpression . QueryModel . ResultOperators [ 0 ] ;
64
- queryModel . ResultOperators . Insert ( 0 , groupBy ) ;
60
+ var groupBy = ( GroupResultOperator ) subQueryModel . ResultOperators [ 0 ] ;
61
+
62
+ queryModel . ResultOperators . Insert ( 0 , groupBy ) ;
65
63
66
64
for ( int i = 0 ; i < queryModel . BodyClauses . Count ; i ++ )
67
65
{
68
66
var clause = queryModel . BodyClauses [ i ] ;
69
- clause . TransformExpressions ( s => GroupBySelectClauseRewriter . ReWrite ( s , groupBy , subQueryExpression . QueryModel ) ) ;
67
+ clause . TransformExpressions ( s => GroupBySelectClauseRewriter . ReWrite ( s , groupBy , subQueryModel ) ) ;
70
68
71
69
//all outer where clauses actually are having clauses
72
70
var whereClause = clause as WhereClause ;
@@ -77,21 +75,19 @@ private static void FlattenSubQuery(SubQueryExpression subQueryExpression, Query
77
75
}
78
76
}
79
77
80
- foreach ( var bodyClause in subQueryExpression . QueryModel . BodyClauses )
81
- {
78
+ foreach ( var bodyClause in subQueryModel . BodyClauses )
82
79
queryModel . BodyClauses . Add ( bodyClause ) ;
83
- }
84
80
85
81
// Replace the outer select clause...
86
82
queryModel . SelectClause . TransformExpressions ( s =>
87
- GroupBySelectClauseRewriter . ReWrite ( s , groupBy , subQueryExpression . QueryModel ) ) ;
83
+ GroupBySelectClauseRewriter . ReWrite ( s , groupBy , subQueryModel ) ) ;
88
84
89
85
// Point all query source references to the outer from clause
90
- queryModel . TransformExpressions ( s =>
91
- new SwapQuerySourceVisitor ( queryModel . MainFromClause , subQueryExpression . QueryModel . MainFromClause ) . Swap ( s ) ) ;
86
+ var visitor = new SwapQuerySourceVisitor ( queryModel . MainFromClause , subQueryModel . MainFromClause ) ;
87
+ queryModel . TransformExpressions ( visitor . Swap ) ;
92
88
93
89
// Replace the outer query source
94
- queryModel . MainFromClause = subQueryExpression . QueryModel . MainFromClause ;
90
+ queryModel . MainFromClause = subQueryModel . MainFromClause ;
95
91
}
96
92
}
97
93
}
0 commit comments