Skip to content

Fix wrong order by with ordered collection fetch in Criteria #2521

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Reptile>());

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.DeleteAsync("from Reptile"));
await (t.CommitAsync());
}
}

[Test]
public async Task ClassPropertyAsync()
{
Expand Down
6 changes: 4 additions & 2 deletions src/NHibernate.Test/Criteria/Animal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand All @@ -85,6 +85,8 @@ public virtual void AddOffspring(Animal offspring)
{
this.Offspring = new HashSet<Animal>();
}

offspring.Mother = this;
this.Offspring.Add(offspring);
}
}
Expand Down
59 changes: 59 additions & 0 deletions src/NHibernate.Test/Criteria/CriteriaQueryTest.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<Reptile>();

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.Delete("from Reptile");
t.Commit();
}
}

[Test]
public void ClassProperty()
{
Expand Down
5 changes: 2 additions & 3 deletions src/NHibernate/Loader/JoinWalker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down