Skip to content

Commit 828e31a

Browse files
committed
NH-3973 - Port HHH-530 missing criteria filter tests
1 parent 6370f3d commit 828e31a

File tree

1 file changed

+129
-5
lines changed

1 file changed

+129
-5
lines changed

src/NHibernate.Test/FilterTest/DynamicFilterTest.cs

Lines changed: 129 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Linq;
45
using log4net;
56
using NHibernate.Cache;
67
using 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

Comments
 (0)