Skip to content

Commit 3a2599d

Browse files
committed
Refactoring
1 parent d8850c7 commit 3a2599d

File tree

4 files changed

+52
-37
lines changed

4 files changed

+52
-37
lines changed
Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
11
using System.Linq.Expressions;
2+
using NHibernate.Linq.Visitors;
23
using Remotion.Linq.Clauses;
34

4-
5-
namespace NHibernate.Linq.Visitors
5+
namespace NHibernate.Linq.Clauses
66
{
7-
/// <summary>
8-
/// All joins are created as outer joins. An optimization in <see cref="WhereJoinDetector"/> finds
9-
/// joins that may be inner joined and calls <see cref="MakeInner"/> on them.
10-
/// <see cref="QueryModelVisitor"/>'s <see cref="QueryModelVisitor.VisitAdditionalFromClause"/> will
11-
/// then emit the correct HQL join.
12-
/// </summary>
13-
public class NhJoinClause : AdditionalFromClause
14-
{
15-
public bool IsInner { get; private set; }
16-
public void MakeInner() {
17-
IsInner = true;
18-
}
19-
public NhJoinClause(string itemName, System.Type itemType, Expression fromExpression) : base(itemName, itemType, fromExpression) {
20-
IsInner = false;
21-
}
22-
}
23-
}
7+
/// <summary>
8+
/// All joins are created as outer joins. An optimization in <see cref="WhereJoinDetector"/> finds
9+
/// joins that may be inner joined and calls <see cref="MakeInner"/> on them.
10+
/// <see cref="QueryModelVisitor"/>'s <see cref="QueryModelVisitor.VisitAdditionalFromClause"/> will
11+
/// then emit the correct HQL join.
12+
/// </summary>
13+
public class NhJoinClause : AdditionalFromClause
14+
{
15+
public NhJoinClause(string itemName, System.Type itemType, Expression fromExpression) : base(itemName, itemType, fromExpression)
16+
{
17+
IsInner = false;
18+
}
19+
20+
public bool IsInner { get; private set; }
21+
22+
public static NhJoinClause Create(FromClauseBase fromClause)
23+
{
24+
return new NhJoinClause(fromClause.ItemName, fromClause.ItemType, fromClause.FromExpression);
25+
}
26+
27+
public void MakeInner()
28+
{
29+
IsInner = true;
30+
}
31+
}
32+
}

src/NHibernate/Linq/NestedSelects/NestedSelectRewriter.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using NHibernate.Linq.GroupBy;
99
using NHibernate.Linq.Visitors;
1010
using Remotion.Linq;
11-
using Remotion.Linq.Clauses;
1211

1312
namespace NHibernate.Linq.NestedSelects
1413
{
@@ -25,7 +24,7 @@ public static void ReWrite(QueryModel queryModel, ISessionFactory sessionFactory
2524

2625
var mainFromClause = subQueryModel.MainFromClause;
2726

28-
var item = new NhJoinClause(mainFromClause.ItemName, mainFromClause.ItemType, mainFromClause.FromExpression);
27+
var item = NhJoinClause.Create(mainFromClause);
2928

3029
queryModel.BodyClauses.Add(item);
3130

src/NHibernate/Linq/Visitors/JoinBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.Linq.Expressions;
3+
using NHibernate.Linq.Clauses;
34
using Remotion.Linq;
45
using Remotion.Linq.Clauses;
56
using Remotion.Linq.Clauses.Expressions;

src/NHibernate/Linq/Visitors/QueryModelVisitor.cs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel quer
5656

5757
// rewrite any operators that should be applied on the outer query
5858
// by flattening out the sub-queries that they are located in
59-
ResultOperatorRewriterResult result = ResultOperatorRewriter.Rewrite(queryModel);
59+
var result = ResultOperatorRewriter.Rewrite(queryModel);
6060

6161
// Identify and name query sources
6262
QuerySourceIdentifier.Visit(parameters.QuerySourceNamer, queryModel);
@@ -142,22 +142,10 @@ public override void VisitAdditionalFromClause(AdditionalFromClause fromClause,
142142
{
143143
var querySourceName = VisitorParameters.QuerySourceNamer.GetName(fromClause);
144144

145-
if (fromClause is NhJoinClause)
145+
var joinClause = fromClause as NhJoinClause;
146+
if (joinClause != null)
146147
{
147-
if (((NhJoinClause)fromClause).IsInner)
148-
{
149-
_hqlTree.AddFromClause(
150-
_hqlTree.TreeBuilder.Join(
151-
HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
152-
_hqlTree.TreeBuilder.Alias(querySourceName)));
153-
}
154-
else
155-
{
156-
_hqlTree.AddFromClause(
157-
_hqlTree.TreeBuilder.LeftJoin(
158-
HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
159-
_hqlTree.TreeBuilder.Alias(querySourceName)));
160-
}
148+
VisitNhJoinClause(querySourceName, joinClause);
161149
}
162150
else if (fromClause.FromExpression is MemberExpression)
163151
{
@@ -180,6 +168,24 @@ public override void VisitAdditionalFromClause(AdditionalFromClause fromClause,
180168
base.VisitAdditionalFromClause(fromClause, queryModel, index);
181169
}
182170

171+
private void VisitNhJoinClause(string querySourceName, NhJoinClause joinClause)
172+
{
173+
var expression = HqlGeneratorExpressionTreeVisitor.Visit(joinClause.FromExpression, VisitorParameters).AsExpression();
174+
var alias = _hqlTree.TreeBuilder.Alias(querySourceName);
175+
176+
HqlTreeNode hqlJoin;
177+
if (joinClause.IsInner)
178+
{
179+
hqlJoin = _hqlTree.TreeBuilder.Join(expression, @alias);
180+
}
181+
else
182+
{
183+
hqlJoin = _hqlTree.TreeBuilder.LeftJoin(expression, @alias);
184+
}
185+
186+
_hqlTree.AddFromClause(hqlJoin);
187+
}
188+
183189
public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index)
184190
{
185191
PreviousEvaluationType = CurrentEvaluationType;

0 commit comments

Comments
 (0)