Skip to content

Commit 148412c

Browse files
committed
NH-3797 - Moved the GroupByKeys expression list into the VisitorParameters class to make it more reusable and refactored the Group By key extraction into an extension method for possible reuse
1 parent 96aed85 commit 148412c

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using NHibernate.Linq.Clauses;
66
using NHibernate.Linq.ReWriters;
77
using NHibernate.Linq.Visitors;
8+
using NHibernate.Util;
89
using Remotion.Linq;
910
using Remotion.Linq.Clauses.Expressions;
1011
using Remotion.Linq.Clauses.ResultOperators;
@@ -43,9 +44,8 @@ public static class AggregatingGroupByRewriter
4344
typeof (CacheableResultOperator)
4445
};
4546

46-
public static IEnumerable<Expression> ReWrite(QueryModel queryModel)
47+
public static void ReWrite(QueryModel queryModel, IList<Expression> groupByKeys)
4748
{
48-
IEnumerable<Expression> groupByKeys = Enumerable.Empty<Expression>();
4949
var subQueryExpression = queryModel.MainFromClause.FromExpression as SubQueryExpression;
5050

5151
if (subQueryExpression != null)
@@ -59,17 +59,11 @@ public static IEnumerable<Expression> ReWrite(QueryModel queryModel)
5959
var groupBy = operators[0] as GroupResultOperator;
6060
if (groupBy != null)
6161
{
62-
if (groupBy.KeySelector is NewExpression)
63-
groupByKeys = (groupBy.KeySelector as NewExpression).Arguments;
64-
else if (groupBy.KeySelector is NewArrayExpression)
65-
groupByKeys = (groupBy.KeySelector as NewArrayExpression).Expressions;
66-
else
67-
groupByKeys = new[] { groupBy.KeySelector };
62+
groupBy.ExtractKeyExpressions(groupByKeys);
6863
FlattenSubQuery(queryModel, subQueryExpression.QueryModel, groupBy);
6964
}
7065
}
7166
}
72-
return groupByKeys;
7367
}
7468

7569
private static void FlattenSubQuery(QueryModel queryModel, QueryModel subQueryModel, GroupResultOperator groupBy)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using System.Text;
6+
using NHibernate.Util;
7+
using Remotion.Linq.Clauses.ResultOperators;
8+
9+
namespace NHibernate.Linq
10+
{
11+
internal static class GroupResultOperatorExtensions
12+
{
13+
public static void ExtractKeyExpressions(this GroupResultOperator groupResult, IList<Expression> groupByKeys)
14+
{
15+
if (groupResult.KeySelector is NewExpression)
16+
(groupResult.KeySelector as NewExpression).Arguments.ForEach(groupByKeys.Add);
17+
else if (groupResult.KeySelector is NewArrayExpression)
18+
(groupResult.KeySelector as NewArrayExpression).Expressions.ForEach(groupByKeys.Add);
19+
else
20+
groupByKeys.Add(groupResult.KeySelector);
21+
}
22+
}
23+
}

src/NHibernate/Linq/Visitors/QueryModelVisitor.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel quer
3434
NonAggregatingGroupByRewriter.ReWrite(queryModel);
3535

3636
// Rewrite aggregate group-by statements
37-
var groupByKeys = AggregatingGroupByRewriter.ReWrite(queryModel);
37+
AggregatingGroupByRewriter.ReWrite(queryModel, parameters.GroupByKeys);
3838

3939
// Rewrite aggregating group-joins
4040
AggregatingGroupJoinRewriter.ReWrite(queryModel);
@@ -79,7 +79,6 @@ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel quer
7979
var visitor = new QueryModelVisitor(parameters, root, queryModel)
8080
{
8181
RewrittenOperatorResult = result,
82-
GroupByKeys = groupByKeys,
8382
};
8483
visitor.Visit();
8584

@@ -100,9 +99,7 @@ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel quer
10099

101100
public ResultOperatorRewriterResult RewrittenOperatorResult { get; private set; }
102101

103-
public IEnumerable<Expression> GroupByKeys { get; private set; }
104-
105-
static QueryModelVisitor()
102+
static QueryModelVisitor()
106103
{
107104
// TODO - reflection to build map
108105
ResultOperatorMap = new ResultOperatorMap();
@@ -238,7 +235,7 @@ public override void VisitSelectClause(SelectClause selectClause, QueryModel que
238235
{
239236
CurrentEvaluationType = selectClause.GetOutputDataInfo();
240237

241-
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters, GroupByKeys);
238+
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters, VisitorParameters.GroupByKeys);
242239

243240
visitor.Visit(selectClause.Selector);
244241

src/NHibernate/Linq/Visitors/VisitorParameters.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public class VisitorParameters
1616

1717
public QuerySourceNamer QuerySourceNamer { get; set; }
1818

19+
public IList<Expression> GroupByKeys { get; private set; }
20+
1921
public VisitorParameters(
2022
ISessionFactoryImplementor sessionFactory,
2123
IDictionary<ConstantExpression, NamedParameter> constantToParameterMap,
@@ -26,6 +28,7 @@ public VisitorParameters(
2628
ConstantToParameterMap = constantToParameterMap;
2729
RequiredHqlParameters = requiredHqlParameters;
2830
QuerySourceNamer = querySourceNamer;
31+
GroupByKeys = new List<Expression>();
2932
}
3033
}
3134
}

src/NHibernate/NHibernate.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@
299299
<Compile Include="Linq\Functions\EqualsGenerator.cs" />
300300
<Compile Include="Linq\GroupBy\KeySelectorVisitor.cs" />
301301
<Compile Include="Linq\GroupBy\PagingRewriter.cs" />
302+
<Compile Include="Linq\GroupResultOperatorExtensions.cs" />
302303
<Compile Include="Linq\NestedSelects\NestedSelectDetector.cs" />
303304
<Compile Include="Linq\NestedSelects\Tuple.cs" />
304305
<Compile Include="Linq\NestedSelects\SelectClauseRewriter.cs" />

0 commit comments

Comments
 (0)