Skip to content

Commit 5d3192e

Browse files
NH-3951: supporting .All as final result. And refactoring .Any as final result for avoiding HQL tree inspection.
1 parent a9e3a54 commit 5d3192e

File tree

3 files changed

+55
-37
lines changed

3 files changed

+55
-37
lines changed

src/NHibernate/Linq/IntermediateHqlTree.cs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ public class IntermediateHqlTree
3030
private HqlTreeNode _root;
3131
private HqlOrderBy _orderBy;
3232

33+
public bool IsRoot
34+
{
35+
get
36+
{
37+
return _isRoot;
38+
}
39+
}
40+
3341
public HqlTreeNode Root
3442
{
3543
get
@@ -53,11 +61,6 @@ public IntermediateHqlTree(bool root)
5361

5462
public ExpressionToHqlTranslationResults GetTranslation()
5563
{
56-
if (_isRoot)
57-
{
58-
DetectOuterExists();
59-
}
60-
6164
return new ExpressionToHqlTranslationResults(Root,
6265
_itemTransformers,
6366
_listTransformers,
@@ -201,19 +204,6 @@ public void AddHavingClause(HqlBooleanExpression where)
201204
}
202205
}
203206

204-
private void DetectOuterExists()
205-
{
206-
if (_root is HqlExists)
207-
{
208-
_takeCount = TreeBuilder.Constant(1);
209-
_root = Root.Children.First();
210-
211-
Expression<Func<IEnumerable<object>, bool>> x = l => l.Any();
212-
213-
_listTransformers.Add(x);
214-
}
215-
}
216-
217207
public void AddAdditionalCriteria(Action<IQuery, IDictionary<string, Tuple<object, IType>>> criteria)
218208
{
219209
_additionalCriteria.Add(criteria);
Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,31 @@
1-
using NHibernate.Hql.Ast;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using NHibernate.Hql.Ast;
26
using Remotion.Linq.Clauses.ResultOperators;
37

48
namespace NHibernate.Linq.Visitors.ResultOperatorProcessors
59
{
6-
public class ProcessAll : IResultOperatorProcessor<AllResultOperator>
7-
{
8-
public void Process(AllResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
9-
{
10-
tree.AddWhereClause(tree.TreeBuilder.BooleanNot(
11-
HqlGeneratorExpressionTreeVisitor.Visit(resultOperator.Predicate, queryModelVisitor.VisitorParameters).
12-
ToBooleanExpression()));
10+
public class ProcessAll : IResultOperatorProcessor<AllResultOperator>
11+
{
12+
public void Process(AllResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
13+
{
14+
tree.AddWhereClause(tree.TreeBuilder.BooleanNot(
15+
HqlGeneratorExpressionTreeVisitor.Visit(resultOperator.Predicate, queryModelVisitor.VisitorParameters).
16+
ToBooleanExpression()));
1317

14-
tree.SetRoot(tree.TreeBuilder.BooleanNot(tree.TreeBuilder.Exists((HqlQuery) tree.Root)));
15-
}
16-
}
18+
if (tree.IsRoot)
19+
{
20+
tree.AddTakeClause(tree.TreeBuilder.Constant(1));
21+
22+
Expression<Func<IEnumerable<object>, bool>> x = l => !l.Any();
23+
tree.AddListTransformer(x);
24+
}
25+
else
26+
{
27+
tree.SetRoot(tree.TreeBuilder.BooleanNot(tree.TreeBuilder.Exists((HqlQuery)tree.Root)));
28+
}
29+
}
30+
}
1731
}
Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1-
using NHibernate.Hql.Ast;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using NHibernate.Hql.Ast;
26
using Remotion.Linq.Clauses.ResultOperators;
37

48
namespace NHibernate.Linq.Visitors.ResultOperatorProcessors
59
{
6-
public class ProcessAny : IResultOperatorProcessor<AnyResultOperator>
7-
{
8-
public void Process(AnyResultOperator anyOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
9-
{
10-
tree.SetRoot(tree.TreeBuilder.Exists((HqlQuery) tree.Root));
11-
}
12-
}
10+
public class ProcessAny : IResultOperatorProcessor<AnyResultOperator>
11+
{
12+
public void Process(AnyResultOperator anyOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
13+
{
14+
if (tree.IsRoot)
15+
{
16+
tree.AddTakeClause(tree.TreeBuilder.Constant(1));
17+
18+
Expression<Func<IEnumerable<object>, bool>> x = l => l.Any();
19+
tree.AddListTransformer(x);
20+
}
21+
else
22+
{
23+
tree.SetRoot(tree.TreeBuilder.Exists((HqlQuery)tree.Root));
24+
}
25+
}
26+
}
1327
}

0 commit comments

Comments
 (0)