Skip to content

Commit 30b786d

Browse files
committed
NH-3524 - Add support for DateTimeOffset properties in QueryOver
1 parent b81321b commit 30b786d

File tree

9 files changed

+319
-47
lines changed

9 files changed

+319
-47
lines changed

src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void YearPartSingleOrDefault()
9191
}
9292

9393
[Test]
94-
public void SelectAvg()
94+
public void SelectAvgYearPart()
9595
{
9696
using (var s = OpenSession())
9797
using (s.BeginTransaction())
@@ -168,7 +168,7 @@ public void MonthPartEqualsDayPart()
168168
}
169169

170170
[Test]
171-
public void Order()
171+
public void OrderByYearPart()
172172
{
173173
using (var s = OpenSession())
174174
using (s.BeginTransaction())
@@ -183,5 +183,100 @@ public void Order()
183183
persons[2].Name.Should().Be("pP3");
184184
}
185185
}
186+
187+
[Test]
188+
public void YearEqual()
189+
{
190+
using (var s = OpenSession())
191+
using (s.BeginTransaction())
192+
{
193+
var persons = s.QueryOver<Person>()
194+
.Where(p => p.BirthDate.Year == 2008)
195+
.List();
196+
197+
persons.Count.Should().Be(1);
198+
persons[0].Name.Should().Be("p2");
199+
}
200+
}
201+
202+
[Test]
203+
public void YearIsIn()
204+
{
205+
using (var s = OpenSession())
206+
using (s.BeginTransaction())
207+
{
208+
var persons = s.QueryOver<Person>()
209+
.Where(p => p.BirthDate.Year.IsIn(new[] { 2008, 2009 }))
210+
.OrderBy(p => p.Name).Asc
211+
.List();
212+
213+
persons.Count.Should().Be(2);
214+
persons[0].Name.Should().Be("p1");
215+
persons[1].Name.Should().Be("p2");
216+
}
217+
}
218+
219+
[Test]
220+
public void YearSingleOrDefault()
221+
{
222+
using (var s = OpenSession())
223+
using (s.BeginTransaction())
224+
{
225+
var yearOfBirth = s.QueryOver<Person>()
226+
.Where(p => p.Name == "p2")
227+
.Select(p => p.BirthDate.Year)
228+
.SingleOrDefault<object>();
229+
230+
yearOfBirth.GetType().Should().Be(typeof(int));
231+
yearOfBirth.Should().Be(2008);
232+
}
233+
}
234+
235+
[Test]
236+
public void SelectAvgYear()
237+
{
238+
using (var s = OpenSession())
239+
using (s.BeginTransaction())
240+
{
241+
var avgYear = s.QueryOver<Person>()
242+
.SelectList(list => list.SelectAvg(p => p.BirthDate.Year))
243+
.SingleOrDefault<object>();
244+
245+
avgYear.GetType().Should().Be(typeof(double));
246+
string.Format("{0:0}", avgYear).Should().Be("2008");
247+
}
248+
}
249+
250+
[Test]
251+
public void OrderByYear()
252+
{
253+
using (var s = OpenSession())
254+
using (s.BeginTransaction())
255+
{
256+
var persons = s.QueryOver<Person>()
257+
.OrderBy(p => p.BirthDate.Year).Desc
258+
.List();
259+
260+
persons.Count.Should().Be(3);
261+
persons[0].Name.Should().Be("p1");
262+
persons[1].Name.Should().Be("p2");
263+
persons[2].Name.Should().Be("pP3");
264+
}
265+
}
266+
267+
[Test]
268+
public void MonthEqualsDay()
269+
{
270+
using (var s = OpenSession())
271+
using (s.BeginTransaction())
272+
{
273+
var persons = s.QueryOver<Person>()
274+
.Where(p => p.BirthDate.Month == p.BirthDate.Day)
275+
.List();
276+
277+
persons.Count.Should().Be(1);
278+
persons[0].Name.Should().Be("p2");
279+
}
280+
}
186281
}
187282
}

src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,34 @@ public void RowCount()
315315
}
316316
}
317317

318+
[Test]
319+
public void FunctionsOrder()
320+
{
321+
using (ISession s = OpenSession())
322+
using (ITransaction t = s.BeginTransaction())
323+
{
324+
s.Save(new Person() { Name = "p2", BirthDate = new DateTime(2008, 07, 06) });
325+
s.Save(new Person() { Name = "p1", BirthDate = new DateTime(2009, 08, 07) });
326+
s.Save(new Person() { Name = "p3", BirthDate = new DateTime(2007, 06, 05) });
327+
328+
t.Commit();
329+
}
330+
331+
using (ISession s = OpenSession())
332+
using (s.BeginTransaction())
333+
{
334+
var persons =
335+
s.QueryOver<Person>()
336+
.OrderBy(p => p.BirthDate.Year).Desc
337+
.List();
338+
339+
persons.Count.Should().Be(3);
340+
persons[0].Name.Should().Be("p1");
341+
persons[1].Name.Should().Be("p2");
342+
persons[2].Name.Should().Be("p3");
343+
}
344+
}
345+
318346
[Test]
319347
public void MultiCriteria()
320348
{

src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<property name="Name" />
1212
<property name="Age" />
1313
<property name="BirthDate" />
14+
<property name="BirthDateAsDateTimeOffset" />
1415
<property name="Blood" />
1516
<component name="Detail" class="PersonDetail">
1617
<property name="MaidenName" />

src/NHibernate.Test/Criteria/Lambda/Model.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public Person()
1919
Children = new List<Child>();
2020
Blood = 'O';
2121
BirthDate = new DateTime(1950, 01, 01);
22+
BirthDateAsDateTimeOffset = new DateTimeOffset(BirthDate);
2223
}
2324

2425
public static string StaticName;
@@ -33,6 +34,7 @@ public Person()
3334
public virtual bool IsParent { get; set; }
3435
public virtual char Blood { get; set; }
3536
public virtual DateTime BirthDate { get; set; }
37+
public virtual DateTimeOffset BirthDateAsDateTimeOffset { get; set; }
3638
public virtual PersonDetail Detail { get; set; }
3739

3840
public virtual int? NullableAge { get; set; }

src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,21 @@ public void SelectSingleFunction()
146146

147147
var actual =
148148
CreateTestQueryOver<Person>()
149-
.Select(p => p.BirthDate.YearPart());
149+
.Select(p => p.BirthDate.Year);
150+
151+
AssertCriteriaAreEqual(expected, actual);
152+
}
153+
154+
[Test]
155+
public void SelectSingleFunctionOfDateTimeOffset()
156+
{
157+
ICriteria expected =
158+
CreateTestCriteria(typeof(Person))
159+
.SetProjection(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")));
160+
161+
var actual =
162+
CreateTestQueryOver<Person>()
163+
.Select(p => p.BirthDateAsDateTimeOffset.Year);
150164

151165
AssertCriteriaAreEqual(expected, actual);
152166
}
@@ -164,8 +178,27 @@ public void SelectMultipleFunction()
164178
var actual =
165179
CreateTestQueryOver<Person>(() => personAlias)
166180
.SelectList(list => list
167-
.Select(p => p.BirthDate.YearPart())
168-
.Select(() => personAlias.BirthDate.MonthPart()));
181+
.Select(p => p.BirthDate.Year)
182+
.Select(() => personAlias.BirthDate.Month));
183+
184+
AssertCriteriaAreEqual(expected, actual);
185+
}
186+
187+
[Test]
188+
public void SelectMultipleFunctionOfDateTimeOffset()
189+
{
190+
ICriteria expected =
191+
CreateTestCriteria(typeof(Person), "personAlias")
192+
.SetProjection(Projections.ProjectionList()
193+
.Add(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")))
194+
.Add(Projections.SqlFunction("month", NHibernateUtil.Int32, Projections.Property("personAlias.BirthDateAsDateTimeOffset"))));
195+
196+
Person personAlias = null;
197+
var actual =
198+
CreateTestQueryOver<Person>(() => personAlias)
199+
.SelectList(list => list
200+
.Select(p => p.BirthDateAsDateTimeOffset.Year)
201+
.Select(() => personAlias.BirthDateAsDateTimeOffset.Month));
169202

170203
AssertCriteriaAreEqual(expected, actual);
171204
}

src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ public void OrderBy()
630630
}
631631

632632
[Test]
633-
public void OrderByFunction()
633+
public void OrderByYearPartFunction()
634634
{
635635
ICriteria expected =
636636
CreateTestCriteria(typeof(Person), "personAlias")
@@ -644,6 +644,36 @@ public void OrderByFunction()
644644
AssertCriteriaAreEqual(expected, actual);
645645
}
646646

647+
[Test]
648+
public void OrderByYearFunction()
649+
{
650+
ICriteria expected =
651+
CreateTestCriteria(typeof(Person), "personAlias")
652+
.AddOrder(Order.Desc(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("personAlias.BirthDate"))));
653+
654+
Person personAlias = null;
655+
IQueryOver<Person> actual =
656+
CreateTestQueryOver<Person>(() => personAlias)
657+
.OrderBy(() => personAlias.BirthDate.Year).Desc;
658+
659+
AssertCriteriaAreEqual(expected, actual);
660+
}
661+
662+
[Test]
663+
public void OrderByFunctionOfDateTimeOffset()
664+
{
665+
ICriteria expected =
666+
CreateTestCriteria(typeof(Person), "personAlias")
667+
.AddOrder(Order.Desc(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("personAlias.BirthDateAsDateTimeOffset"))));
668+
669+
Person personAlias = null;
670+
IQueryOver<Person> actual =
671+
CreateTestQueryOver<Person>(() => personAlias)
672+
.OrderBy(() => personAlias.BirthDateAsDateTimeOffset.Year).Desc;
673+
674+
AssertCriteriaAreEqual(expected, actual);
675+
}
676+
647677
[Test]
648678
public void AllowSingleCallSyntax()
649679
{

src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ public void RestrictionsExtensions()
258258
[Test]
259259
public void FunctionExtensions()
260260
{
261+
var date = new DateTime(1970, 1, 1);
262+
261263
ICriteria expected =
262264
CreateTestCriteria(typeof(Person))
263265
.Add(Restrictions.Eq(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1970))
@@ -266,6 +268,14 @@ public void FunctionExtensions()
266268
.Add(Restrictions.Eq(Projections.SqlFunction("hour", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1))
267269
.Add(Restrictions.Eq(Projections.SqlFunction("minute", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1))
268270
.Add(Restrictions.Eq(Projections.SqlFunction("second", NHibernateUtil.Int32, Projections.Property("BirthDate")), 1))
271+
.Add(Restrictions.Eq(Projections.SqlFunction("date", NHibernateUtil.Date, Projections.Property("BirthDate")), date))
272+
.Add(Restrictions.Eq(Projections.SqlFunction("date", NHibernateUtil.Date, Projections.Property("BirthDateAsDateTimeOffset")), date))
273+
.Add(Restrictions.Eq(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")), 1970))
274+
.Add(Restrictions.Eq(Projections.SqlFunction("day", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")), 1))
275+
.Add(Restrictions.Eq(Projections.SqlFunction("month", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")), 1))
276+
.Add(Restrictions.Eq(Projections.SqlFunction("hour", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")), 1))
277+
.Add(Restrictions.Eq(Projections.SqlFunction("minute", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")), 1))
278+
.Add(Restrictions.Eq(Projections.SqlFunction("second", NHibernateUtil.Int32, Projections.Property("BirthDateAsDateTimeOffset")), 1))
269279
.Add(Restrictions.Eq(Projections.SqlFunction("sqrt", NHibernateUtil.Double, Projections.Property("Height")), 10d))
270280
.Add(Restrictions.Eq(Projections.SqlFunction("lower", NHibernateUtil.String, Projections.Property("Name")), "test"))
271281
.Add(Restrictions.Eq(Projections.SqlFunction("upper", NHibernateUtil.String, Projections.Property("Name")), "TEST"))
@@ -282,12 +292,20 @@ public void FunctionExtensions()
282292

283293
IQueryOver<Person> actual =
284294
CreateTestQueryOver<Person>()
285-
.Where(p => p.BirthDate.YearPart() == 1970)
286-
.And(p => p.BirthDate.DayPart() == 1)
287-
.And(p => p.BirthDate.MonthPart() == 1)
288-
.And(p => p.BirthDate.HourPart() == 1)
289-
.And(p => p.BirthDate.MinutePart() == 1)
290-
.And(p => p.BirthDate.SecondPart() == 1)
295+
.Where(p => p.BirthDate.Year == 1970)
296+
.And(p => p.BirthDate.Day == 1)
297+
.And(p => p.BirthDate.Month == 1)
298+
.And(p => p.BirthDate.Hour == 1)
299+
.And(p => p.BirthDate.Minute == 1)
300+
.And(p => p.BirthDate.Second == 1)
301+
.And(p => p.BirthDate.Date == date)
302+
.And(p => p.BirthDateAsDateTimeOffset.Date == date)
303+
.And(p => p.BirthDateAsDateTimeOffset.Year == 1970)
304+
.And(p => p.BirthDateAsDateTimeOffset.Day == 1)
305+
.And(p => p.BirthDateAsDateTimeOffset.Month == 1)
306+
.And(p => p.BirthDateAsDateTimeOffset.Hour == 1)
307+
.And(p => p.BirthDateAsDateTimeOffset.Minute == 1)
308+
.And(p => p.BirthDateAsDateTimeOffset.Second == 1)
291309
.And(p => p.Height.Sqrt() == 10)
292310
.And(p => p.Name.Lower() == "test")
293311
.And(p => p.Name.Upper() == "TEST")
@@ -316,11 +334,9 @@ public void FunctionExtensionsProperty()
316334

317335
IQueryOver<Person> actual =
318336
CreateTestQueryOver<Person>()
319-
.Where(p => p.BirthDate.MonthPart() == p.BirthDate.DayPart());
337+
.Where(p => p.BirthDate.Month == p.BirthDate.Day);
320338

321339
AssertCriteriaAreEqual(expected, actual);
322340
}
323-
324341
}
325-
326342
}

0 commit comments

Comments
 (0)