Skip to content

Commit 7b79fe0

Browse files
committed
Merge branch 'master' into GH-2454
2 parents 8aa3e84 + 1fa50d9 commit 7b79fe0

File tree

12 files changed

+830
-8
lines changed

12 files changed

+830
-8
lines changed

src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System;
1212
using System.Collections;
1313
using System.Collections.Generic;
14+
using System.Linq;
1415
using NHibernate.Dialect;
1516
using NHibernate.Criterion;
1617
using NHibernate.Linq;
@@ -2085,6 +2086,64 @@ public async Task RestrictionOnSubclassCollectionAsync()
20852086
s.Close();
20862087
}
20872088

2089+
//NH-2239 (GH-1075) - Wrong OrderBy in generated SQL
2090+
[Test]
2091+
public async Task OrderByAndOrderedCollectionAsync()
2092+
{
2093+
var reptile1 = new Reptile { SerialNumber = "9" };
2094+
var reptile2 = new Reptile { SerialNumber = "8" };
2095+
var reptile3 = new Reptile { SerialNumber = "7" };
2096+
var reptile4 = new Reptile { SerialNumber = "6" };
2097+
var reptile5 = new Reptile { SerialNumber = "5" };
2098+
2099+
using (var s = OpenSession())
2100+
using (var t = s.BeginTransaction())
2101+
{
2102+
await (s.SaveAsync(reptile5));
2103+
await (s.SaveAsync(reptile1));
2104+
await (s.SaveAsync(reptile2));
2105+
await (s.SaveAsync(reptile3));
2106+
await (s.SaveAsync(reptile4));
2107+
2108+
reptile1.AddOffspring(reptile4);
2109+
reptile1.AddOffspring(reptile2);
2110+
reptile4.Father = reptile3;
2111+
reptile2.Father = reptile4;
2112+
reptile1.Father = reptile5;
2113+
reptile3.AddOffspring(reptile1);
2114+
2115+
await (t.CommitAsync());
2116+
}
2117+
2118+
using(var s = OpenSession())
2119+
{
2120+
var list = await (s.CreateCriteria(typeof(Reptile))
2121+
.Fetch(SelectMode.Fetch, "offspring")
2122+
.AddOrder(Order.Asc("serialNumber"))
2123+
.SetResultTransformer(Transformers.DistinctRootEntity)
2124+
.ListAsync<Reptile>());
2125+
2126+
var expectedList = list.OrderBy(x => x.SerialNumber).ToList();
2127+
2128+
Assert.That(list.Count, Is.EqualTo(5));
2129+
CollectionAssert.AreEqual(expectedList, list);
2130+
2131+
var mother = expectedList.Last();
2132+
Assert.That(NHibernateUtil.IsInitialized(mother.Offspring), Is.True);
2133+
2134+
var expectedAssociationList = mother.Offspring.OrderBy(r => r.Father.Id).ToList();
2135+
Assert.That(expectedAssociationList.Count, Is.EqualTo(2));
2136+
CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring);
2137+
}
2138+
2139+
using (var s = OpenSession())
2140+
using (var t = s.BeginTransaction())
2141+
{
2142+
await (s.DeleteAsync("from Reptile"));
2143+
await (t.CommitAsync());
2144+
}
2145+
}
2146+
20882147
[Test]
20892148
public async Task ClassPropertyAsync()
20902149
{
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using NHibernate.Cfg.MappingSchema;
12+
using NHibernate.Criterion;
13+
using NHibernate.Mapping.ByCode;
14+
using NUnit.Framework;
15+
16+
namespace NHibernate.Test.NHSpecificTest.GH1180
17+
{
18+
using System.Threading.Tasks;
19+
[KnownBug("NH-3847 (GH-1180)")]
20+
[TestFixture]
21+
public class ByCodeFixtureAsync : TestCaseMappingByCode
22+
{
23+
protected override HbmMapping GetMappings()
24+
{
25+
var mapper = new ModelMapper();
26+
27+
mapper.Class<Entity>(rc =>
28+
{
29+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
30+
rc.Property(x => x.Name, m => { m.Length(10); });
31+
rc.Property(x => x.Amount, m => { m.Precision(8); m.Scale(2); });
32+
});
33+
34+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
35+
}
36+
37+
protected override void OnTearDown()
38+
{
39+
using (var session = OpenSession())
40+
using (var transaction = session.BeginTransaction())
41+
{
42+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
43+
transaction.Commit();
44+
}
45+
}
46+
47+
[Test]
48+
public async Task StringTypesAsync()
49+
{
50+
using (var session = OpenSession())
51+
using (var transaction = session.BeginTransaction())
52+
{
53+
// data
54+
await (session.SaveAsync(new Entity {Name = "Alpha"}));
55+
await (session.SaveAsync(new Entity {Name = "Beta"}));
56+
await (session.SaveAsync(new Entity {Name = "Gamma"}));
57+
58+
await (transaction.CommitAsync());
59+
}
60+
61+
// whenTrue is constant, whenFalse is property -> works even before the fix
62+
using (var session = OpenSession())
63+
{
64+
ICriteria tagCriteria = session.CreateCriteria(typeof(Entity));
65+
66+
var conditionalProjection = Projections.Conditional(
67+
Restrictions.Not(
68+
Restrictions.Like(nameof(Entity.Name), "B%")),
69+
Projections.Constant("other"),
70+
Projections.Property(nameof(Entity.Name)));
71+
tagCriteria.SetProjection(conditionalProjection);
72+
73+
// run query
74+
var results = await (tagCriteria.ListAsync());
75+
76+
Assert.That(results, Is.EquivalentTo(new[] {"other", "Beta", "other"}));
77+
}
78+
79+
// whenTrue is property, whenFalse is constant -> fails before the fix
80+
using (var session = OpenSession())
81+
{
82+
ICriteria tagCriteria = session.CreateCriteria(typeof(Entity));
83+
84+
var conditionalProjection = Projections.Conditional(
85+
Restrictions.Like(nameof(Entity.Name), "B%"),
86+
Projections.Property(nameof(Entity.Name)),
87+
Projections.Constant("other"));
88+
tagCriteria.SetProjection(conditionalProjection);
89+
90+
// run query
91+
var results = await (tagCriteria.ListAsync());
92+
93+
Assert.That(results, Is.EquivalentTo(new[] {"other", "Beta", "other"}));
94+
}
95+
}
96+
97+
[Test]
98+
public async Task DecimalTypesAsync()
99+
{
100+
using (var session = OpenSession())
101+
using (var transaction = session.BeginTransaction())
102+
{
103+
await (session.SaveAsync(new Entity {Amount = 3.14m}));
104+
await (session.SaveAsync(new Entity {Amount = 42.13m}));
105+
await (session.SaveAsync(new Entity {Amount = 17.99m}));
106+
107+
await (transaction.CommitAsync());
108+
}
109+
110+
// whenTrue is constant, whenFalse is property -> works even before the fix
111+
using (var session = OpenSession())
112+
{
113+
ICriteria tagCriteria = session.CreateCriteria(typeof(Entity));
114+
115+
var conditionalProjection = Projections.Conditional(
116+
Restrictions.Not(
117+
Restrictions.Ge(nameof(Entity.Amount), 20m)),
118+
Projections.Constant(20m),
119+
Projections.Property(nameof(Entity.Amount)));
120+
tagCriteria.SetProjection(conditionalProjection);
121+
122+
// run query
123+
var results = await (tagCriteria.ListAsync());
124+
125+
Assert.That(results, Is.EquivalentTo(new[] {20m, 42.13m, 20m}));
126+
}
127+
128+
// whenTrue is property, whenFalse is constant -> fails before the fix
129+
using (var session = OpenSession())
130+
{
131+
ICriteria tagCriteria = session.CreateCriteria(typeof(Entity));
132+
133+
var conditionalProjection = Projections.Conditional(
134+
Restrictions.Ge(nameof(Entity.Amount), 20m),
135+
Projections.Property(nameof(Entity.Amount)),
136+
Projections.Constant(20m));
137+
tagCriteria.SetProjection(conditionalProjection);
138+
139+
// run query
140+
var results = await (tagCriteria.ListAsync());
141+
142+
Assert.That(results, Is.EquivalentTo(new[] {20m, 42.13m, 20m}));
143+
}
144+
}
145+
}
146+
}

0 commit comments

Comments
 (0)