Skip to content

Commit

Permalink
Merge 5.4.2 into master
Browse files Browse the repository at this point in the history
  • Loading branch information
fredericDelaporte committed Apr 5, 2023
2 parents a98192d + cddbac1 commit f41a800
Show file tree
Hide file tree
Showing 25 changed files with 496 additions and 44 deletions.
46 changes: 44 additions & 2 deletions releasenotes.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,33 @@
Build 5.4.1
Build 5.4.2
=============================

Release notes - NHibernate - Version 5.4.2

6 issues were resolved in this release.

** Bug

* #3274 Improve LINQ Contains subquery parameter detection
* #3271 LINQ subqueries wrongly altered by SelectClauseVisitor
* #3263 Wrong alias in Where clause if using Fetch and scalar Select
* #3239 Incorrect SQL generated fetching many-to-many with subclasses

** New Feature

* #3251 MappingByCode: Support backfield property access

** Task

* #3281 Merge 5.3.16 in 5.4.x
* #3277 Release 5.4.2


Build 5.4.1
=============================

Release notes - NHibernate - Version 5.4.1

4 issues were resolved in this release.
5 issues were resolved in this release.

** Bug

Expand All @@ -14,6 +38,7 @@ Release notes - NHibernate - Version 5.4.1
** Task

* #3232 Release 5.4.1
* #3227 Merge 5.3.15 in 5.4.x

As part of releasing 5.4.1, a missing 5.4.0 possible breaking change has been added, about
one-to-one associations and optimistic locking. See 5.4.0 possible breaking changes.
Expand Down Expand Up @@ -209,6 +234,23 @@ Release notes - NHibernate - Version 5.4.0
* #2242 Test case for NH-3972 - SQL error when selecting a column of a subclass when sibling classes have a column of the same name


Build 5.3.16
=============================

Release notes - NHibernate - Version 5.3.16

3 issues were resolved in this release.

** Bug

* #3269 "Or" clause in a "where" condition returns a wrong result with not-found-ignore
* #3210 Wrong name value for L2 read-only cache warning on mutable

** Task

* #3276 Release 5.3.16


Build 5.3.15
=============================

Expand Down
9 changes: 9 additions & 0 deletions src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,15 @@ from x2 in session.Query<NullableOwner>()
//GH-2988
var withNullOrValidList = await (session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == validManyToOne.Id || x.ManyToOne == null).ToListAsync());
var withNullOrValidList2 = await (session.Query<NullableOwner>().Where(x => x.ManyToOne == null || x.ManyToOne.Id == validManyToOne.Id).ToListAsync());
//GH-3269
var invalidId = Guid.NewGuid();
var withInvalidOrValid = await (session.Query<NullableOwner>().Where(x => x.OneToOne.Id == invalidId || x.ManyToOne.Id == validManyToOne.Id).ToListAsync());
var withInvalidOrNull = await (session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne == null).ToListAsync());
var withInvalidOrNotNull = await (session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne != null).ToListAsync());

Assert.That(withInvalidOrValid.Count, Is.EqualTo(1));
Assert.That(withInvalidOrNull.Count, Is.EqualTo(2));
Assert.That(withInvalidOrNotNull.Count, Is.EqualTo(0));

//GH-3185
var mixImplicitAndLeftJoinList = await (session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == validManyToOne.Id && x.OneToOne == null).ToListAsync());
Expand Down
33 changes: 33 additions & 0 deletions src/NHibernate.Test/Async/Linq/WhereTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using System.Linq;
using System.Linq.Expressions;
using log4net.Core;
using NHibernate.Dialect;
using NHibernate.Engine.Query;
using NHibernate.Linq;
using NHibernate.DomainModel.Northwind.Entities;
Expand Down Expand Up @@ -670,6 +671,38 @@ where sheet.Users.Contains(user)
Assert.That(query.Count, Is.EqualTo(2));
}

[Test]
public async Task TimesheetsWithEnumerableContainsOnSelectAsync()
{
if (Dialect is MsSqlCeDialect)
Assert.Ignore("Dialect is not supported");

var value = (EnumStoredAsInt32) 1000;
var query = await ((from sheet in db.Timesheets
where sheet.Users.Select(x => x.NullableEnum2 ?? value).Contains(value)
select sheet).ToListAsync());

Assert.That(query.Count, Is.EqualTo(1));
}

[Test]
public async Task ContainsSubqueryWithCoalesceStringEnumSelectAsync()
{
if (Dialect is MsSqlCeDialect || Dialect is SQLiteDialect)
Assert.Ignore("Dialect is not supported");

var results =
await (db.Timesheets.Where(
o =>
o.Users
.Where(u => u.Id != 0.MappedAs(NHibernateUtil.Int32))
.Select(u => u.Name == u.Name ? u.Enum1 : u.NullableEnum1.Value)
.Contains(EnumStoredAsString.Small))
.ToListAsync());

Assert.That(results.Count, Is.EqualTo(1));
}

[Test]
public async Task SearchOnObjectTypeWithExtensionMethodAsync()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by AsyncGenerator.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------


using System.Linq;
using NHibernate.Linq;
using NUnit.Framework;

namespace NHibernate.Test.NHSpecificTest.GH3263
{
using System.Threading.Tasks;
[TestFixture]
public class ReuseFetchJoinFixtureAsync : BugTestCase
{
protected override void OnSetUp()
{
using var s = OpenSession();
using var t = s.BeginTransaction();
var em = new Employee() { Name = "x", OptionalInfo = new OptionalInfo() };
em.OptionalInfo.Employee = em;
s.Save(em);
t.Commit();
}
protected override void OnTearDown()
{
using var session = OpenSession();
using var transaction = session.BeginTransaction();
session.CreateQuery("delete from System.Object").ExecuteUpdate();

transaction.Commit();
}

[Test]
public async Task ReuseJoinScalarSelectAsync()
{
using var session = OpenSession();
await (session.Query<Employee>()
.Fetch(x => x.OptionalInfo)
.Where(x => x.OptionalInfo != null)
.Select(x => new { x.OptionalInfo.Age })
.ToListAsync());
}

[Test]
public async Task ReuseJoinScalarSelectHqlAsync()
{
using var session = OpenSession();
await (session.CreateQuery(
"select x.OptionalInfo.Age " +
"from Employee x " +
"fetch x.OptionalInfo " +
"where x.OptionalInfo != null ").ListAsync());

}

[Test]
public async Task ReuseJoinScalarSelectHql2Async()
{
using var session = OpenSession();
await (session.CreateQuery(
"select x.OptionalInfo.Age " +
"from Employee x " +
"join fetch x.OptionalInfo o " +
"where o != null ").ListAsync());
}

[Test]
public async Task ReuseJoinScalarSelectHql3Async()
{
using var session = OpenSession();
await (session.CreateQuery(
"select x.OptionalInfo.Age from Employee x " +
"join fetch x.OptionalInfo " +
"where x.OptionalInfo != null ").ListAsync());
}

[Test]
public async Task ReuseJoinEntityAndScalarSelectAsync()
{
using var session = OpenSession();
using var sqlLog = new SqlLogSpy();

var x = await (session.Query<Employee>()
.Fetch(x => x.OptionalInfo)
.Where(x => x.OptionalInfo != null)
.Select(x => new { x, x.OptionalInfo.Age })
.FirstAsync());

Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1));
Assert.That(NHibernateUtil.IsInitialized(x.x.OptionalInfo), Is.True);
}
}
}
28 changes: 27 additions & 1 deletion src/NHibernate.Test/Async/NHSpecificTest/NH2174/Fixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ protected override void OnSetUp()
{
var doc = new Document {Id_Base = 1, Id_Doc = 2};
session.Save(doc);
session.Save(new DocumentDetailDocument {Id_Base = 1, Id_Doc = 2, Id_Item = 1, ReferencedDocument = doc});
var detail = new DocumentDetailDocument {Id_Base = 1, Id_Doc = 2, Id_Item = 1, ReferencedDocument = doc};
session.Save(detail);

doc.RefferedDetailsManyToMany.Add(detail);
transaction.Commit();
}
}
Expand All @@ -53,6 +55,14 @@ public async Task LinqFetchAsync()
}
}

[Test(Description = "GH-3239")]
public async Task LinqFetchManyToManyAsync()
{
using var session = OpenSession();
var result = await (session.Query<Document>().Fetch(x => x.RefferedDetailsManyToMany).FirstAsync());
Assert.That(result.RefferedDetailsManyToMany, Has.Count.EqualTo(1));
}

[Test]
public async Task QueryOverFetchAsync()
{
Expand All @@ -63,6 +73,14 @@ public async Task QueryOverFetchAsync()
}
}

[Test(Description = "GH-3239")]
public async Task QueryOverFetchManyToManyAsync()
{
using var session = OpenSession();
var result = await (session.QueryOver<Document>().Fetch(SelectMode.Fetch, x => x.RefferedDetailsManyToMany).SingleOrDefaultAsync());
Assert.That(result.RefferedDetailsManyToMany, Has.Count.EqualTo(1));
}

[Test]
public async Task LazyLoadAsync()
{
Expand All @@ -73,5 +91,13 @@ public async Task LazyLoadAsync()
Assert.That(result.RefferedDetails.Count, Is.EqualTo(1));
}
}

[Test]
public async Task LazyLoadManyToManyAsync()
{
using var session = OpenSession();
var result = await (session.Query<Document>().FirstAsync());
Assert.That(result.RefferedDetailsManyToMany.Count, Is.EqualTo(1));
}
}
}
9 changes: 9 additions & 0 deletions src/NHibernate.Test/Hql/EntityJoinHqlTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,15 @@ from x2 in session.Query<NullableOwner>()
//GH-2988
var withNullOrValidList = session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == validManyToOne.Id || x.ManyToOne == null).ToList();
var withNullOrValidList2 = session.Query<NullableOwner>().Where(x => x.ManyToOne == null || x.ManyToOne.Id == validManyToOne.Id).ToList();
//GH-3269
var invalidId = Guid.NewGuid();
var withInvalidOrValid = session.Query<NullableOwner>().Where(x => x.OneToOne.Id == invalidId || x.ManyToOne.Id == validManyToOne.Id).ToList();
var withInvalidOrNull = session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne == null).ToList();
var withInvalidOrNotNull = session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne != null).ToList();

Assert.That(withInvalidOrValid.Count, Is.EqualTo(1));
Assert.That(withInvalidOrNull.Count, Is.EqualTo(2));
Assert.That(withInvalidOrNotNull.Count, Is.EqualTo(0));

//GH-3185
var mixImplicitAndLeftJoinList = session.Query<NullableOwner>().Where(x => x.ManyToOne.Id == validManyToOne.Id && x.OneToOne == null).ToList();
Expand Down
33 changes: 33 additions & 0 deletions src/NHibernate.Test/Linq/WhereTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Linq;
using System.Linq.Expressions;
using log4net.Core;
using NHibernate.Dialect;
using NHibernate.Engine.Query;
using NHibernate.Linq;
using NHibernate.DomainModel.Northwind.Entities;
Expand Down Expand Up @@ -671,6 +672,38 @@ where sheet.Users.Contains(user)
Assert.That(query.Count, Is.EqualTo(2));
}

[Test]
public void TimesheetsWithEnumerableContainsOnSelect()
{
if (Dialect is MsSqlCeDialect)
Assert.Ignore("Dialect is not supported");

var value = (EnumStoredAsInt32) 1000;
var query = (from sheet in db.Timesheets
where sheet.Users.Select(x => x.NullableEnum2 ?? value).Contains(value)
select sheet).ToList();

Assert.That(query.Count, Is.EqualTo(1));
}

[Test]
public void ContainsSubqueryWithCoalesceStringEnumSelect()
{
if (Dialect is MsSqlCeDialect || Dialect is SQLiteDialect)
Assert.Ignore("Dialect is not supported");

var results =
db.Timesheets.Where(
o =>
o.Users
.Where(u => u.Id != 0.MappedAs(NHibernateUtil.Int32))
.Select(u => u.Name == u.Name ? u.Enum1 : u.NullableEnum1.Value)
.Contains(EnumStoredAsString.Small))
.ToList();

Assert.That(results.Count, Is.EqualTo(1));
}

[Test]
public void SearchOnObjectTypeWithExtensionMethod()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,20 @@ public void WhenMapPropertiesInTheBaseJumpedClassUsingMemberNameThenMapInInherit
Assert.That(hbmClass.Properties.Select(p => p.Access).All(a => a.StartsWith("field.")), Is.True);
}

[Test]
public void BackfieldAccessPropertyMapping()
{
var mapper = new ModelMapper();
mapper.Class<MyClass>(mc =>
{
mc.Id(x => x.Id, m => m.Access(Accessor.Backfield));
});

HbmMapping mappings = mapper.CompileMappingForAllExplicitlyAddedEntities();
HbmClass hbmClass = mappings.RootClasses[0];
Assert.That(hbmClass.Id.access, Is.EqualTo("backfield"));
}

[Test]
public void WhenMapBagWithWrongElementTypeThenThrows()
{
Expand Down
16 changes: 16 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/GH3263/Entity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace NHibernate.Test.NHSpecificTest.GH3263
{
public class Employee
{
public virtual int EmployeeId { get; set; }
public virtual string Name { get; set; }
public virtual OptionalInfo OptionalInfo { get; set; }
}

public class OptionalInfo
{
public virtual int EmployeeId { get; set; }
public virtual int Age { get; set; }
public virtual Employee Employee { get; set; }
}
}
Loading

0 comments on commit f41a800

Please sign in to comment.