From c7accf3774c4d2dd041f45f338e3d20a6d08d835 Mon Sep 17 00:00:00 2001 From: csharper2010 Date: Tue, 24 Nov 2020 16:39:12 +0100 Subject: [PATCH 1/4] Fixes nhibernate#2614 Results from the query should be skipped if they are already in the ISet distinction thus if distinction.Add is false. Currently, they are only added if they have been there before. Signed-off-by: csharper2010 --- src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs | 2 +- src/NHibernate/Engine/Query/HQLQueryPlan.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs b/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs index f0e5674ea69..a5ced8d10d7 100644 --- a/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs +++ b/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs @@ -78,7 +78,7 @@ public async Task PerformListAsync(QueryParameters queryParameters, ISessionImpl for (int x = 0; x < size; x++) { object result = tmp[x]; - if (distinction.Add(result)) + if (!distinction.Add(result)) { continue; } diff --git a/src/NHibernate/Engine/Query/HQLQueryPlan.cs b/src/NHibernate/Engine/Query/HQLQueryPlan.cs index eb02c296cea..fd6717a3d33 100644 --- a/src/NHibernate/Engine/Query/HQLQueryPlan.cs +++ b/src/NHibernate/Engine/Query/HQLQueryPlan.cs @@ -128,7 +128,7 @@ public void PerformList(QueryParameters queryParameters, ISessionImplementor ses for (int x = 0; x < size; x++) { object result = tmp[x]; - if (distinction.Add(result)) + if (!distinction.Add(result)) { continue; } From 9b48a2e318cd9914475c1db115efc844b93c2e7c Mon Sep 17 00:00:00 2001 From: csharper2010 Date: Wed, 25 Nov 2020 08:00:42 +0100 Subject: [PATCH 2/4] Unit Test for #2614 Polymorphic query with limit --- .../NHSpecificTest/GH2614/Fixture.cs | 41 +++++++++++++++++++ .../NHSpecificTest/GH2614/Mappings.hbm.xml | 20 +++++++++ .../NHSpecificTest/GH2614/Model.cs | 18 ++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs new file mode 100644 index 00000000000..aff2e621c76 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs @@ -0,0 +1,41 @@ +using System.Collections; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH2614 +{ + public class Fixture : BugTestCase + { + [Test] + public async Task TestOk() + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + try + { + { + s.Save(new ConcreteClass1 {Name = "C1"}); + s.Save(new ConcreteClass2 {Name = "C2"}); + } + { + var query = s.CreateQuery(@" + SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2614.BaseClass ROOT"); + query.SetMaxResults(5); + IList listAsync = await query.ListAsync(); + Assert.AreEqual(2, listAsync.Count); + Assert.AreEqual(2, query.List().Count); + } + } + finally + { + s.Delete("from ConcreteClass1"); + s.Delete("from ConcreteClass2"); + t.Commit(); + } + } + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml new file mode 100644 index 00000000000..3aaefa26341 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs new file mode 100644 index 00000000000..a03f1b725b7 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.GH2614 +{ + public abstract class BaseClass + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } + + public class ConcreteClass1 : BaseClass + { + } + + public class ConcreteClass2 : BaseClass + { + } +} From dcbf576b287fcdc583cbb8e82001cf571a34fdf8 Mon Sep 17 00:00:00 2001 From: csharper2010 Date: Fri, 4 Dec 2020 15:14:31 +0100 Subject: [PATCH 3/4] One class per file to resolve codefactor issue --- .../NHSpecificTest/GH2614/{Model.cs => BaseClass.cs} | 10 ---------- .../NHSpecificTest/GH2614/ConcreteClass1.cs | 6 ++++++ .../NHSpecificTest/GH2614/ConcreteClass2.cs | 8 ++++++++ 3 files changed, 14 insertions(+), 10 deletions(-) rename src/NHibernate.Test/NHSpecificTest/GH2614/{Model.cs => BaseClass.cs} (56%) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/BaseClass.cs similarity index 56% rename from src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs rename to src/NHibernate.Test/NHSpecificTest/GH2614/BaseClass.cs index a03f1b725b7..07ae632ad07 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH2614/Model.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/BaseClass.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - namespace NHibernate.Test.NHSpecificTest.GH2614 { public abstract class BaseClass @@ -7,12 +5,4 @@ public abstract class BaseClass public virtual int Id { get; set; } public virtual string Name { get; set; } } - - public class ConcreteClass1 : BaseClass - { - } - - public class ConcreteClass2 : BaseClass - { - } } diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs new file mode 100644 index 00000000000..e164a83a07d --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs @@ -0,0 +1,6 @@ +namespace NHibernate.Test.NHSpecificTest.GH2614 +{ + public class ConcreteClass1 : BaseClass + { + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs new file mode 100644 index 00000000000..0c5f9f20eb7 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.GH2614 +{ + public class ConcreteClass2 : BaseClass + { + } +} From 846dbeb89ab3b3bc620abb89b9c21539079353ca Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Thu, 17 Dec 2020 22:10:22 +1300 Subject: [PATCH 4/4] Refactor tests --- .../Async/NHSpecificTest/GH2614/Fixture.cs | 54 +++++++++++++++++ .../NHSpecificTest/GH2614/Fixture.cs | 60 ++++++++++--------- 2 files changed, 85 insertions(+), 29 deletions(-) create mode 100644 src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs new file mode 100644 index 00000000000..2b7c0006da0 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH2614 +{ + using System.Threading.Tasks; + [TestFixture] + public class FixtureAsync : BugTestCase + { + protected override void OnSetUp() + { + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + s.Save(new ConcreteClass1 {Name = "C1"}); + s.Save(new ConcreteClass2 {Name = "C2"}); + t.Commit(); + } + } + + protected override void OnTearDown() + { + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + s.CreateQuery("delete from System.Object").ExecuteUpdate(); + t.Commit(); + } + } + + [Test] + public async Task PolymorphicListReturnsCorrectResultsAsync() + { + using (var s = OpenSession()) + using (s.BeginTransaction()) + { + var query = s.CreateQuery( + @"SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2614.BaseClass ROOT"); + query.SetMaxResults(5); + var list = await (query.ListAsync()); + Assert.That(list.Count, Is.EqualTo(2)); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs index aff2e621c76..82876011bae 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs @@ -1,40 +1,42 @@ -using System.Collections; -using System.Threading.Tasks; -using NUnit.Framework; +using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.GH2614 { + [TestFixture] public class Fixture : BugTestCase { + protected override void OnSetUp() + { + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + s.Save(new ConcreteClass1 {Name = "C1"}); + s.Save(new ConcreteClass2 {Name = "C2"}); + t.Commit(); + } + } + + protected override void OnTearDown() + { + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + s.CreateQuery("delete from System.Object").ExecuteUpdate(); + t.Commit(); + } + } + [Test] - public async Task TestOk() + public void PolymorphicListReturnsCorrectResults() { - using (ISession s = OpenSession()) + using (var s = OpenSession()) + using (s.BeginTransaction()) { - using (ITransaction t = s.BeginTransaction()) - { - try - { - { - s.Save(new ConcreteClass1 {Name = "C1"}); - s.Save(new ConcreteClass2 {Name = "C2"}); - } - { - var query = s.CreateQuery(@" - SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2614.BaseClass ROOT"); - query.SetMaxResults(5); - IList listAsync = await query.ListAsync(); - Assert.AreEqual(2, listAsync.Count); - Assert.AreEqual(2, query.List().Count); - } - } - finally - { - s.Delete("from ConcreteClass1"); - s.Delete("from ConcreteClass2"); - t.Commit(); - } - } + var query = s.CreateQuery( + @"SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2614.BaseClass ROOT"); + query.SetMaxResults(5); + var list = query.List(); + Assert.That(list.Count, Is.EqualTo(2)); } } }