From 89061f25af0ed2e070e0f836b28fc5b4eba09178 Mon Sep 17 00:00:00 2001 From: Duncan M Date: Mon, 8 Nov 2021 09:06:13 -0700 Subject: [PATCH 1/5] Pick test from Duncan --- src/NHibernate.Test/Linq/TryGetMappedTests.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/NHibernate.Test/Linq/TryGetMappedTests.cs b/src/NHibernate.Test/Linq/TryGetMappedTests.cs index 964072efdc2..44839dccf96 100644 --- a/src/NHibernate.Test/Linq/TryGetMappedTests.cs +++ b/src/NHibernate.Test/Linq/TryGetMappedTests.cs @@ -272,6 +272,18 @@ public void NestedComponentPropertyCastTest() o => o?.Name == "component[OtherProperty1]"); } + [Test] + public void CompositePropertyTest() + { + var query = session.Query().Select(o => o.Multiple.count); + AssertSupported( + query, + typeof(Glarch).FullName, + "Multiple.count", + o => o is Int32Type, + o => o?.Name == typeof(MultiplicityType).FullName); + } + [Test] public void ManyToOneTest() { From 6321fe0c6b88cb032b735c3766e63c994d4f61f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Thu, 11 Nov 2021 20:15:57 +0100 Subject: [PATCH 2/5] Fix NRE in linq processing of custom components fix #2937 --- src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs | 6 +++--- src/NHibernate.Test/Linq/TryGetMappedTests.cs | 2 +- src/NHibernate/Util/ExpressionsHelper.cs | 9 ++++++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs index 95672bab016..ef552314347 100644 --- a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs @@ -346,9 +346,9 @@ public async Task NullableEntityProjectionAsync() var withNullManyToOneList = await (session.Query().Where(x => x.ManyToOne == null).ToListAsync()); var withNullManyToOneJoinedList = await ((from x in session.Query() - from x2 in session.Query() - where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null - select x2).ToListAsync()); + from x2 in session.Query() + where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null + select x2).ToListAsync()); Assert.That(fullList.Count, Is.EqualTo(2)); Assert.That(withValidManyToOneList.Count, Is.EqualTo(0)); Assert.That(withValidManyToOneList2.Count, Is.EqualTo(0)); diff --git a/src/NHibernate.Test/Linq/TryGetMappedTests.cs b/src/NHibernate.Test/Linq/TryGetMappedTests.cs index 44839dccf96..78a8313b492 100644 --- a/src/NHibernate.Test/Linq/TryGetMappedTests.cs +++ b/src/NHibernate.Test/Linq/TryGetMappedTests.cs @@ -819,7 +819,7 @@ private void AssertResult( Assert.That(() => expectedMemberType(memberType), $"Invalid member type: {memberType?.Name ?? "null"}"); Assert.That(() => expectedComponentType(componentType), $"Invalid component type: {componentType?.Name ?? "null"}"); - if (found) + if (found && (componentType == null || componentType.PropertyNullability != null)) { Assert.That(_tryGetMappedNullability(Sfi, queryModel.SelectClause.Selector, out var isNullable), Is.True, "Expression should be supported"); Assert.That(nullability, Is.EqualTo(isNullable), "Nullability is not correct"); diff --git a/src/NHibernate/Util/ExpressionsHelper.cs b/src/NHibernate/Util/ExpressionsHelper.cs index 050a4d2ed22..3dc7924c3f7 100644 --- a/src/NHibernate/Util/ExpressionsHelper.cs +++ b/src/NHibernate/Util/ExpressionsHelper.cs @@ -160,10 +160,17 @@ internal static bool TryGetMappedNullability( int index; if (componentType != null) { + var propertyNullability = componentType.PropertyNullability; + if (propertyNullability == null) + { + nullable = false; + return false; + } + index = Array.IndexOf( componentType.PropertyNames, memberPath.Substring(memberPath.LastIndexOf('.') + 1)); - nullable = componentType.PropertyNullability[index]; + nullable = propertyNullability[index]; return true; } From 5b5a47e7f13117fc6cf9ec7666f53f23d3c0b82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Fri, 12 Nov 2021 00:31:48 +0100 Subject: [PATCH 3/5] Apply suggestion To be dropped if not considered actually adequate. --- src/NHibernate.Test/Linq/TryGetMappedTests.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/NHibernate.Test/Linq/TryGetMappedTests.cs b/src/NHibernate.Test/Linq/TryGetMappedTests.cs index 78a8313b492..7fd3f41f0ab 100644 --- a/src/NHibernate.Test/Linq/TryGetMappedTests.cs +++ b/src/NHibernate.Test/Linq/TryGetMappedTests.cs @@ -276,12 +276,14 @@ public void NestedComponentPropertyCastTest() public void CompositePropertyTest() { var query = session.Query().Select(o => o.Multiple.count); - AssertSupported( + AssertResult( query, + true, true, typeof(Glarch).FullName, "Multiple.count", o => o is Int32Type, - o => o?.Name == typeof(MultiplicityType).FullName); + o => o?.Name == typeof(MultiplicityType).FullName, + null); } [Test] @@ -780,7 +782,7 @@ private void AssertResult( string expectedMemberPath, Predicate expectedMemberType, Predicate expectedComponentType = null, - bool nullability = true) + bool? nullability = true) { expectedComponentType = expectedComponentType ?? (o => o == null); @@ -819,10 +821,14 @@ private void AssertResult( Assert.That(() => expectedMemberType(memberType), $"Invalid member type: {memberType?.Name ?? "null"}"); Assert.That(() => expectedComponentType(componentType), $"Invalid component type: {componentType?.Name ?? "null"}"); - if (found && (componentType == null || componentType.PropertyNullability != null)) + if (found) { - Assert.That(_tryGetMappedNullability(Sfi, queryModel.SelectClause.Selector, out var isNullable), Is.True, "Expression should be supported"); - Assert.That(nullability, Is.EqualTo(isNullable), "Nullability is not correct"); + Assert.That( + _tryGetMappedNullability(Sfi, queryModel.SelectClause.Selector, out var isNullable), + Is.EqualTo(nullability.HasValue), + $"Expression should be {(nullability.HasValue ? "supported" : "unsupported")}"); + if (nullability.HasValue) + Assert.That(nullability, Is.EqualTo(isNullable), "Nullability is not correct"); } } } From f21b1b28b60e2134b1b1de8494344307c8fef60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Sat, 13 Nov 2021 19:54:26 +0100 Subject: [PATCH 4/5] Adjust suggestion --- src/NHibernate.Test/Linq/TryGetMappedTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NHibernate.Test/Linq/TryGetMappedTests.cs b/src/NHibernate.Test/Linq/TryGetMappedTests.cs index 7fd3f41f0ab..dc381113e08 100644 --- a/src/NHibernate.Test/Linq/TryGetMappedTests.cs +++ b/src/NHibernate.Test/Linq/TryGetMappedTests.cs @@ -276,9 +276,8 @@ public void NestedComponentPropertyCastTest() public void CompositePropertyTest() { var query = session.Query().Select(o => o.Multiple.count); - AssertResult( + AssertSupported( query, - true, true, typeof(Glarch).FullName, "Multiple.count", o => o is Int32Type, @@ -737,9 +736,10 @@ private void AssertSupported( string expectedEntityName, string expectedMemberPath, Predicate expectedMemberType, - Predicate expectedComponentType = null) + Predicate expectedComponentType = null, + bool? nullability = true) { - AssertResult(query, true, true, expectedEntityName, expectedMemberPath, expectedMemberType, expectedComponentType); + AssertResult(query, true, true, expectedEntityName, expectedMemberPath, expectedMemberType, expectedComponentType, nullability); } private void AssertSupported( From 62e11d324e03fc4f8122a71da8ac547d0d425232 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sun, 14 Nov 2021 10:46:27 +0200 Subject: [PATCH 5/5] Add test description --- src/NHibernate.Test/Linq/TryGetMappedTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate.Test/Linq/TryGetMappedTests.cs b/src/NHibernate.Test/Linq/TryGetMappedTests.cs index dc381113e08..87b860089b0 100644 --- a/src/NHibernate.Test/Linq/TryGetMappedTests.cs +++ b/src/NHibernate.Test/Linq/TryGetMappedTests.cs @@ -272,8 +272,8 @@ public void NestedComponentPropertyCastTest() o => o?.Name == "component[OtherProperty1]"); } - [Test] - public void CompositePropertyTest() + [Test(Description = "GH-2937")] + public void CompositeUserTypePropertyTest() { var query = session.Query().Select(o => o.Multiple.count); AssertSupported(