11using System ;
22using System . Collections ;
33using System . Collections . Generic ;
4+ using System . Linq ;
45using log4net ;
56using NHibernate . Cache ;
67using NHibernate . Cache . Entry ;
@@ -195,6 +196,127 @@ public void CriteriaQueryFilters()
195196 testData . Release ( ) ;
196197 }
197198
199+
200+ [ Test ]
201+ public void CriteriaControl ( )
202+ {
203+ using ( var testData = new TestData ( this ) )
204+ {
205+ testData . Prepare ( ) ;
206+
207+ // the subquery...
208+ var subquery = DetachedCriteria
209+ . For < Salesperson > ( )
210+ . SetProjection ( Property . ForName ( "Name" ) ) ;
211+
212+ using ( var session = OpenSession ( ) )
213+ using ( var transaction = session . BeginTransaction ( ) )
214+ {
215+ session . EnableFilter ( "fulfilledOrders" ) . SetParameter ( "asOfDate" , testData . lastMonth . Date ) ;
216+ session . EnableFilter ( "regionlist" ) . SetParameter ( "regions" , "APAC" ) ;
217+
218+ var result = session
219+ . CreateCriteria < Order > ( )
220+ . Add ( Subqueries . In ( "steve" , subquery ) )
221+ . List ( ) ;
222+
223+ Assert . That ( result . Count , Is . EqualTo ( 1 ) ) ;
224+
225+ transaction . Commit ( ) ;
226+ }
227+ }
228+ }
229+
230+ [ Test ]
231+ public void CriteriaSubqueryWithFilters ( )
232+ {
233+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
234+ // Criteria-subquery test
235+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
236+ log . Info ( "Starting Criteria-subquery filter tests" ) ;
237+ using ( var testData = new TestData ( this ) )
238+ {
239+ testData . Prepare ( ) ;
240+
241+ using ( var session = OpenSession ( ) )
242+ {
243+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
244+
245+ log . Info ( "Criteria query against Department with a subquery on Salesperson in the APAC reqion..." ) ;
246+ var salespersonSubquery = DetachedCriteria . For < Salesperson > ( )
247+ . Add ( Restrictions . Eq ( "Name" , "steve" ) )
248+ . SetProjection ( Property . ForName ( "Department" ) ) ;
249+
250+ var departmentsQuery = session . CreateCriteria < Department > ( ) .
251+ Add ( Subqueries . PropertyIn ( "Id" , salespersonSubquery ) ) ;
252+ var departments = departmentsQuery . List < Department > ( ) ;
253+
254+ Assert . That ( departments . Count , Is . EqualTo ( 1 ) , "Incorrect department count" ) ;
255+
256+ log . Info ( "Criteria query against Department with a subquery on Salesperson in the FooBar reqion..." ) ;
257+
258+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "Foobar" ) ;
259+ departments = departmentsQuery . List < Department > ( ) ;
260+
261+ Assert . That ( departments . Count , Is . EqualTo ( 0 ) , "Incorrect department count" ) ;
262+
263+ log . Info ( "Criteria query against Order with a subquery for line items with a subquery on product and sold by a given sales person..." ) ;
264+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
265+
266+ var lineItemSubquery = DetachedCriteria . For < LineItem > ( )
267+ . Add ( Restrictions . Ge ( "Quantity" , 1L ) )
268+ . CreateCriteria ( "Product" )
269+ . Add ( Restrictions . Eq ( "Name" , "Acme Hair Gel" ) )
270+ . SetProjection ( Property . ForName ( "Id" ) ) ;
271+
272+ var orders = session . CreateCriteria < Order > ( )
273+ . Add ( Subqueries . Exists ( lineItemSubquery ) )
274+ . Add ( Restrictions . Eq ( "Buyer" , "gavin" ) )
275+ . List < Order > ( ) ;
276+
277+ Assert . That ( orders . Count , Is . EqualTo ( 1 ) , "Incorrect orders count" ) ;
278+
279+ log . Info ( "query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of last month" ) ;
280+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
281+ session . EnableFilter ( "effectiveDate" ) . SetParameter ( "asOfDate" , testData . lastMonth . Date ) ;
282+
283+ var productSubquery = DetachedCriteria . For < Product > ( )
284+ .
285+ Add ( Restrictions . Eq ( "Name" , "Acme Hair Gel" ) )
286+ . SetProjection ( Property . ForName ( "id" ) ) ;
287+
288+ lineItemSubquery = DetachedCriteria . For < LineItem > ( )
289+ . Add ( Restrictions . Ge ( "Quantity" , 1L ) )
290+ . CreateCriteria ( "Product" )
291+ . Add ( Subqueries . PropertyIn ( "Id" , productSubquery ) )
292+ . SetProjection ( Property . ForName ( "Id" ) ) ;
293+
294+ orders = session
295+ . CreateCriteria < Order > ( )
296+ . Add ( Subqueries . Exists ( lineItemSubquery ) )
297+ . Add ( Restrictions . Eq ( "Buyer" , "gavin" ) )
298+ . List < Order > ( ) ;
299+
300+ Assert . That ( orders . Count , Is . EqualTo ( 1 ) , "Incorrect orders count" ) ;
301+
302+
303+ log . Info ( "query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of 4 months ago" ) ;
304+ session . EnableFilter ( "region" ) . SetParameter ( "region" , "APAC" ) ;
305+ session . EnableFilter ( "effectiveDate" ) . SetParameter ( "asOfDate" , testData . fourMonthsAgo . Date ) ;
306+
307+ orders = session . CreateCriteria < Order > ( )
308+ . Add ( Subqueries . Exists ( lineItemSubquery ) )
309+ . Add ( Restrictions . Eq ( "Buyer" , "gavin" ) )
310+ . List < Order > ( ) ;
311+
312+ Assert . That ( orders . Count , Is . EqualTo ( 0 ) , "Incorrect orders count" ) ;
313+
314+ session . Close ( ) ;
315+ }
316+ }
317+ }
318+
319+
198320 [ Test ]
199321 public void GetFilters ( )
200322 {
@@ -472,10 +594,7 @@ public void ManyToManyBaseThruCriteria()
472594 testData . Release ( ) ;
473595 }
474596
475- protected override string MappingsAssembly
476- {
477- get { return "NHibernate.Test" ; }
478- }
597+ protected override string MappingsAssembly => "NHibernate.Test" ;
479598
480599 protected override IList Mappings
481600 {
@@ -489,7 +608,7 @@ protected override IList Mappings
489608 }
490609 }
491610
492- private class TestData
611+ private class TestData : IDisposable
493612 {
494613 public long steveId ;
495614 public long deptId ;
@@ -621,6 +740,11 @@ public void Release()
621740 transaction . Commit ( ) ;
622741 session . Close ( ) ;
623742 }
743+
744+ public void Dispose ( )
745+ {
746+ Release ( ) ;
747+ }
624748 }
625749 }
626750}
0 commit comments