1
+ using NHibernate . Linq ;
1
2
using NUnit . Framework ;
2
3
using System . Collections . Generic ;
3
4
using System . Linq ;
@@ -10,61 +11,70 @@ public class Fixture : BugTestCase
10
11
protected override void OnSetUp ( )
11
12
{
12
13
Clear2ndLevelCache ( ) ;
13
- using ( ISession s = OpenSession ( ) )
14
- using ( ITransaction tx = s . BeginTransaction ( ) )
14
+ using ( var session = OpenSession ( ) )
15
+ using ( var transaction = session . BeginTransaction ( ) )
15
16
{
16
17
var p1 = new Person ( ) { Name = "A" } ;
17
18
var p1c1 = new Person ( ) { Name = "AA" } ;
18
19
var p1c2 = new Person ( ) { Name = "AB" } ;
19
20
var p1c3 = new Person ( ) { Name = "AC" } ;
20
21
p1 . Children = new HashSet < Person > ( new [ ] { p1c1 , p1c2 , p1c3 } ) ;
21
- s . Save ( p1 ) ;
22
+ session . Save ( p1 ) ;
22
23
23
24
var p2 = new Person ( ) { Name = "B" } ;
24
25
var p2c1 = new Person ( ) { Name = "BA" } ;
25
26
var p2c2 = new Person ( ) { Name = "BB" } ;
26
27
var p2c3 = new Person ( ) { Name = "BC" } ;
27
28
p2 . Children = new HashSet < Person > ( new [ ] { p2c1 , p2c2 , p2c3 } ) ;
28
- s . Save ( p2 ) ;
29
+ session . Save ( p2 ) ;
29
30
30
- tx . Commit ( ) ;
31
+ transaction . Commit ( ) ;
31
32
}
32
33
}
33
34
34
35
protected override void OnTearDown ( )
35
36
{
36
- base . OnTearDown ( ) ;
37
- using ( ISession s = OpenSession ( ) )
38
- using ( ITransaction tx = s . BeginTransaction ( ) )
37
+ using ( var session = OpenSession ( ) )
38
+ using ( var transaction = session . BeginTransaction ( ) )
39
39
{
40
- s . Delete ( "from Person" ) ;
41
- tx . Commit ( ) ;
40
+ session . Delete ( "from Person" ) ;
41
+ transaction . Commit ( ) ;
42
42
}
43
43
}
44
44
45
45
[ Test ]
46
46
public void CacheableMulticriteria_QueryOverWithAliasedJoinQueryOver ( )
47
47
{
48
- ExecuteActionTwiceSecondRunEnsureNoSqlExecuted ( ( ) =>
48
+ foreach ( var checkCache in new [ ] { false , true } )
49
+ {
50
+ using ( var sqlLogSpy = new SqlLogSpy ( ) )
49
51
{
50
- using ( var s = Sfi . OpenSession ( ) )
52
+ using ( var session = Sfi . OpenSession ( ) )
51
53
{
52
- var query = CreateQueryOverWithAliasedJoinQueryOver ( s ) ;
54
+ var query = CreateQueryOverWithAliasedJoinQueryOver ( session ) ;
53
55
54
- var multiCriteria = s . CreateMultiCriteria ( ) ;
56
+ var multiCriteria = session . CreateMultiCriteria ( ) ;
55
57
multiCriteria . Add ( "myQuery" , query ) ;
56
58
multiCriteria . SetCacheable ( true ) ;
57
59
58
60
var list = ( IList < Person > ) multiCriteria . GetResult ( "myQuery" ) ;
59
61
AssertQueryResult ( list ) ;
60
62
}
61
- } ) ;
63
+
64
+ if ( checkCache && ! string . IsNullOrEmpty ( sqlLogSpy . GetWholeLog ( ) ) )
65
+ {
66
+ Assert . Fail ( "SQL executed. 2nd level cache should be used instead." ) ;
67
+ }
68
+ }
69
+ }
62
70
}
63
71
64
72
[ Test ]
65
73
public void CacheableFuture_QueryOverWithAliasedJoinQueryOver ( )
66
74
{
67
- ExecuteActionTwiceSecondRunEnsureNoSqlExecuted ( ( ) =>
75
+ foreach ( var checkCache in new [ ] { false , true } )
76
+ {
77
+ using ( var sqlLogSpy = new SqlLogSpy ( ) )
68
78
{
69
79
using ( var s = Sfi . OpenSession ( ) )
70
80
{
@@ -75,13 +85,20 @@ public void CacheableFuture_QueryOverWithAliasedJoinQueryOver()
75
85
var list = query . ToList ( ) ;
76
86
AssertQueryResult ( list ) ;
77
87
}
78
- } ) ;
88
+ if ( checkCache && ! string . IsNullOrEmpty ( sqlLogSpy . GetWholeLog ( ) ) )
89
+ {
90
+ Assert . Fail ( "SQL executed. 2nd level cache should be used instead." ) ;
91
+ }
92
+ }
93
+ }
79
94
}
80
95
81
96
[ Test ]
82
97
public void CacheableMulticriteria_QueryOverWithJoinAlias ( )
83
98
{
84
- ExecuteActionTwiceSecondRunEnsureNoSqlExecuted ( ( ) =>
99
+ foreach ( var checkCache in new [ ] { false , true } )
100
+ {
101
+ using ( var sqlLogSpy = new SqlLogSpy ( ) )
85
102
{
86
103
using ( var s = Sfi . OpenSession ( ) )
87
104
{
@@ -94,13 +111,20 @@ public void CacheableMulticriteria_QueryOverWithJoinAlias()
94
111
var list = ( IList < Person > ) multiCriteria . GetResult ( "myQuery" ) ;
95
112
AssertQueryResult ( list ) ;
96
113
}
97
- } ) ;
114
+ if ( checkCache && ! string . IsNullOrEmpty ( sqlLogSpy . GetWholeLog ( ) ) )
115
+ {
116
+ Assert . Fail ( "SQL executed. 2nd level cache should be used instead." ) ;
117
+ }
118
+ }
119
+ }
98
120
}
99
121
100
122
[ Test ]
101
123
public void CacheableFuture_QueryOverWithJoinAlias ( )
102
124
{
103
- ExecuteActionTwiceSecondRunEnsureNoSqlExecuted ( ( ) =>
125
+ foreach ( var checkCache in new [ ] { false , true } )
126
+ {
127
+ using ( var sqlLogSpy = new SqlLogSpy ( ) )
104
128
{
105
129
using ( var s = Sfi . OpenSession ( ) )
106
130
{
@@ -111,7 +135,34 @@ public void CacheableFuture_QueryOverWithJoinAlias()
111
135
var list = query . ToList ( ) ;
112
136
AssertQueryResult ( list ) ;
113
137
}
114
- } ) ;
138
+ if ( checkCache && ! string . IsNullOrEmpty ( sqlLogSpy . GetWholeLog ( ) ) )
139
+ {
140
+ Assert . Fail ( "SQL executed. 2nd level cache should be used instead." ) ;
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ [ Test ]
147
+ public void CacheableFuture_QueryWithSubQuery ( )
148
+ {
149
+ foreach ( var checkCache in new [ ] { false , true } )
150
+ {
151
+ using ( var sqlLogSpy = new SqlLogSpy ( ) )
152
+ {
153
+ using ( var session = Sfi . OpenSession ( ) )
154
+ {
155
+ var query = CreateCacheableQueryWithSubquery ( session ) ;
156
+
157
+ var list = query . ToList ( ) ;
158
+ AssertQueryResult ( list ) ;
159
+ }
160
+ if ( checkCache && ! string . IsNullOrEmpty ( sqlLogSpy . GetWholeLog ( ) ) )
161
+ {
162
+ Assert . Fail ( "SQL executed. 2nd level cache should be used instead." ) ;
163
+ }
164
+ }
165
+ }
115
166
}
116
167
117
168
private static void AssertQueryResult ( IList < Person > list )
@@ -126,6 +177,20 @@ private static void AssertQueryResult(IList<Person> list)
126
177
CollectionAssert . AreEquivalent ( person2 . Children . Select ( c => c . Name ) , new [ ] { "BA" , "BB" , "BC" } ) ;
127
178
}
128
179
180
+ private static IFutureEnumerable < Person > CreateCacheableQueryWithSubquery ( ISession session )
181
+ {
182
+ var subQuery = session . Query < Person > ( )
183
+ . WithOptions ( p => p . SetCacheable ( true ) ) ;
184
+
185
+ var query = session . Query < Person > ( )
186
+ . FetchMany ( p => p . Children )
187
+ . Where ( p => subQuery . Contains ( p ) && p . Parent == null )
188
+ . WithOptions ( o => o . SetCacheable ( true ) )
189
+ . ToFuture ( ) ;
190
+
191
+ return query ;
192
+ }
193
+
129
194
private static IQueryOver < Person , Person > CreateQueryOverWithJoinAlias ( ISession session )
130
195
{
131
196
Person childAlias = null ;
@@ -147,23 +212,5 @@ private void Clear2ndLevelCache()
147
212
Sfi . EvictQueries ( ) ;
148
213
Sfi . Evict ( typeof ( Person ) ) ;
149
214
}
150
-
151
- private static void ExecuteActionTwiceSecondRunEnsureNoSqlExecuted ( System . Action action )
152
- {
153
- action ( ) ;
154
- EnsureNoSqlExecutedOnDb ( action ) ;
155
- }
156
-
157
- private static void EnsureNoSqlExecutedOnDb ( System . Action action )
158
- {
159
- using ( var sqlLogSpy = new SqlLogSpy ( ) )
160
- {
161
- action ( ) ;
162
- if ( ! string . IsNullOrEmpty ( sqlLogSpy . GetWholeLog ( ) ) )
163
- {
164
- Assert . Fail ( "SQL executed. 2nd level cache should be used instead." ) ;
165
- }
166
- }
167
- }
168
215
}
169
216
}
0 commit comments