From 10d87c275310154ec42efcc4a1b6785e37906016 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 8 Sep 2020 08:49:41 +0300 Subject: [PATCH 1/2] Fix wrong order by with ordered collection fetch --- .../Async/Criteria/CriteriaQueryTest.cs | 59 +++++++++++++++++++ src/NHibernate.Test/Criteria/Animal.cs | 6 +- .../Criteria/CriteriaQueryTest.cs | 59 +++++++++++++++++++ src/NHibernate/Loader/JoinWalker.cs | 5 +- 4 files changed, 124 insertions(+), 5 deletions(-) diff --git a/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs b/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs index 3d1da81dcea..2fb2cac0f2f 100644 --- a/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs +++ b/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs @@ -11,6 +11,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using NHibernate.Dialect; using NHibernate.Criterion; using NHibernate.Linq; @@ -2085,6 +2086,64 @@ public async Task RestrictionOnSubclassCollectionAsync() s.Close(); } + //NH-2239 (GH-1075) - Wrong OrderBy in generated SQL + [Test] + public async Task OrderByAndOrderedCollectionAsync() + { + var reptile1 = new Reptile { SerialNumber = "9" }; + var reptile2 = new Reptile { SerialNumber = "8" }; + var reptile3 = new Reptile { SerialNumber = "7" }; + var reptile4 = new Reptile { SerialNumber = "6" }; + var reptile5 = new Reptile { SerialNumber = "5" }; + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + await (s.SaveAsync(reptile5)); + await (s.SaveAsync(reptile1)); + await (s.SaveAsync(reptile2)); + await (s.SaveAsync(reptile3)); + await (s.SaveAsync(reptile4)); + + reptile1.AddOffspring(reptile4); + reptile1.AddOffspring(reptile2); + reptile4.Father = reptile3; + reptile2.Father = reptile4; + reptile1.Father = reptile5; + reptile3.AddOffspring(reptile1); + + await (t.CommitAsync()); + } + + using(var s = OpenSession()) + { + var list = await (s.CreateCriteria(typeof(Reptile)) + .Fetch(SelectMode.Fetch, "offspring") + .AddOrder(Order.Asc("serialNumber")) + .SetResultTransformer(Transformers.DistinctRootEntity) + .ListAsync()); + + var expectedList = list.OrderBy(x => x.SerialNumber).ToList(); + + Assert.That(list.Count, Is.EqualTo(5)); + CollectionAssert.AreEqual(expectedList, list); + + var mother = expectedList.Last(); + Assert.That(NHibernateUtil.IsInitialized(mother.Offspring), Is.True); + + var expectedAssociationList = mother.Offspring.OrderBy(r => r.Father.Id).ToList(); + Assert.That(expectedAssociationList.Count, Is.EqualTo(2)); + CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + await (s.CreateQuery("delete from System.Object").ExecuteUpdateAsync()); + await (t.CommitAsync()); + } + } + [Test] public async Task ClassPropertyAsync() { diff --git a/src/NHibernate.Test/Criteria/Animal.cs b/src/NHibernate.Test/Criteria/Animal.cs index 00739545bd4..efb8abb7b4c 100644 --- a/src/NHibernate.Test/Criteria/Animal.cs +++ b/src/NHibernate.Test/Criteria/Animal.cs @@ -61,9 +61,9 @@ public virtual string SerialNumber set { serialNumber = value; } } - private bool howHappyIsHe; + private string howHappyIsHe; - public virtual bool HowHappyIsHe + public virtual string HowHappyIsHe { get { return howHappyIsHe; } set { howHappyIsHe = value; } @@ -85,6 +85,8 @@ public virtual void AddOffspring(Animal offspring) { this.Offspring = new HashSet(); } + + offspring.Mother = this; this.Offspring.Add(offspring); } } diff --git a/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs b/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs index f88c0cbc2cd..3f0df5c8cd8 100644 --- a/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs +++ b/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using NHibernate.Dialect; using NHibernate.Criterion; using NHibernate.Linq; @@ -2182,6 +2183,64 @@ public void RestrictionOnSubclassCollection() s.Close(); } + //NH-2239 (GH-1075) - Wrong OrderBy in generated SQL + [Test] + public void OrderByAndOrderedCollection() + { + var reptile1 = new Reptile { SerialNumber = "9" }; + var reptile2 = new Reptile { SerialNumber = "8" }; + var reptile3 = new Reptile { SerialNumber = "7" }; + var reptile4 = new Reptile { SerialNumber = "6" }; + var reptile5 = new Reptile { SerialNumber = "5" }; + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + s.Save(reptile5); + s.Save(reptile1); + s.Save(reptile2); + s.Save(reptile3); + s.Save(reptile4); + + reptile1.AddOffspring(reptile4); + reptile1.AddOffspring(reptile2); + reptile4.Father = reptile3; + reptile2.Father = reptile4; + reptile1.Father = reptile5; + reptile3.AddOffspring(reptile1); + + t.Commit(); + } + + using(var s = OpenSession()) + { + var list = s.CreateCriteria(typeof(Reptile)) + .Fetch(SelectMode.Fetch, "offspring") + .AddOrder(Order.Asc("serialNumber")) + .SetResultTransformer(Transformers.DistinctRootEntity) + .List(); + + var expectedList = list.OrderBy(x => x.SerialNumber).ToList(); + + Assert.That(list.Count, Is.EqualTo(5)); + CollectionAssert.AreEqual(expectedList, list); + + var mother = expectedList.Last(); + Assert.That(NHibernateUtil.IsInitialized(mother.Offspring), Is.True); + + var expectedAssociationList = mother.Offspring.OrderBy(r => r.Father.Id).ToList(); + Assert.That(expectedAssociationList.Count, Is.EqualTo(2)); + CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + s.CreateQuery("delete from System.Object").ExecuteUpdate(); + t.Commit(); + } + } + [Test] public void ClassProperty() { diff --git a/src/NHibernate/Loader/JoinWalker.cs b/src/NHibernate/Loader/JoinWalker.cs index feec3ae674f..2d6259ab0ca 100644 --- a/src/NHibernate/Loader/JoinWalker.cs +++ b/src/NHibernate/Loader/JoinWalker.cs @@ -818,10 +818,9 @@ protected SqlString MergeOrderings(SqlString ass, SqlString orderBy) { if (ass.Length == 0) return orderBy; - else if (orderBy.Length == 0) + if (orderBy.Length == 0) return ass; - else - return ass.Append(StringHelper.CommaSpace, orderBy); + return orderBy.Append(StringHelper.CommaSpace, ass); } protected SqlString MergeOrderings(string ass, SqlString orderBy) { From dcdf2439473b0c13cf0269a96102c5a3cd1add35 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 8 Sep 2020 10:26:12 +0300 Subject: [PATCH 2/2] Fix failed clean up on some dialects --- src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs | 4 ++-- src/NHibernate.Test/Criteria/CriteriaQueryTest.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs b/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs index 2fb2cac0f2f..ef2bbf8dae0 100644 --- a/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs +++ b/src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs @@ -2135,11 +2135,11 @@ public async Task OrderByAndOrderedCollectionAsync() Assert.That(expectedAssociationList.Count, Is.EqualTo(2)); CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring); } - + using (var s = OpenSession()) using (var t = s.BeginTransaction()) { - await (s.CreateQuery("delete from System.Object").ExecuteUpdateAsync()); + await (s.DeleteAsync("from Reptile")); await (t.CommitAsync()); } } diff --git a/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs b/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs index 3f0df5c8cd8..63a22533aa1 100644 --- a/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs +++ b/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs @@ -2232,11 +2232,11 @@ public void OrderByAndOrderedCollection() Assert.That(expectedAssociationList.Count, Is.EqualTo(2)); CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring); } - + using (var s = OpenSession()) using (var t = s.BeginTransaction()) { - s.CreateQuery("delete from System.Object").ExecuteUpdate(); + s.Delete("from Reptile"); t.Commit(); } }