From 7695e5c633ee5be96cd197b7d74051ed00066400 Mon Sep 17 00:00:00 2001 From: Tomas Lukac Date: Tue, 21 Feb 2023 09:57:42 +0100 Subject: [PATCH 1/9] Add enum HasFlag method support #829 --- .../NHSpecificTest/GH3365/Fixture.cs | 69 +++++++++++++++++++ .../NHSpecificTest/GH3365/Mappings.hbm.xml | 17 +++++ .../NHSpecificTest/GH3365/Model.cs | 23 +++++++ .../NHSpecificTest/GH3365/TestEnum.cs | 13 ++++ .../RemoveRedundantCast.cs | 8 ++- .../DefaultLinqToHqlGeneratorsRegistry.cs | 1 + .../Linq/Functions/HasFlagGenerator.cs | 34 +++++++++ 7 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs create mode 100644 src/NHibernate/Linq/Functions/HasFlagGenerator.cs diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs new file mode 100644 index 00000000000..093cb008d79 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs @@ -0,0 +1,69 @@ +using System.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3365 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + + var e1 = new Parent { Type = TestEnum.A | TestEnum.C }; + session.Save(e1); + + var e2 = new Child { Type = TestEnum.D, Parent = e1 }; + session.Save(e2); + + var e3 = new Child { Type = TestEnum.C, Parent = e1 }; + session.Save(e3); + + session.Flush(); + transaction.Commit(); + } + } + + [Test] + public void SelectClass() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var resultFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefault(); + + var resultNotFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.D)).FirstOrDefault(); + + Assert.That(resultFound, Is.Not.Null); + Assert.That(resultNotFound, Is.Null); + } + } + + [Test] + public void SelectChildClassContainedInParent() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefault(); + + Assert.That(result, Is.Not.Null); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + using (ISession session = this.OpenSession()) + { + foreach (var entity in new[] { nameof(Child), nameof(Parent) }) + { + session.Delete($"from {entity}"); + session.Flush(); + } + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml new file mode 100644 index 00000000000..eaf9245849f --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs b/src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs new file mode 100644 index 00000000000..66041f90790 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.GH3365 +{ + public class Parent + { + public virtual Guid Id { get; set; } + + public virtual TestEnum Type { get; set; } + + public virtual IList Children { get; set; } = new List(); + } + + public class Child + { + public virtual Guid Id { get; set; } + + public virtual TestEnum Type { get; set; } + + public virtual Parent Parent { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs b/src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs new file mode 100644 index 00000000000..5f95aa32f53 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs @@ -0,0 +1,13 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH3365 +{ + [Flags] + public enum TestEnum + { + A = 1 << 0, + B = 1 << 1, + C = 1 << 2, + D = 1 << 3 + } +} diff --git a/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs b/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs index 8feac321a1c..d352dc47247 100644 --- a/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs +++ b/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs @@ -1,3 +1,4 @@ +using System; using System.Linq.Expressions; using NHibernate.Util; using Remotion.Linq.Parsing.ExpressionVisitors.Transformation; @@ -5,8 +6,8 @@ namespace NHibernate.Linq.ExpressionTransformers { /// - /// Remove redundant casts to the same type or to superclass (upcast) in , - /// and s + /// Remove redundant casts to the same type or to superclass (upcast) in , + /// and s /// public class RemoveRedundantCast : IExpressionTransformer { @@ -20,6 +21,7 @@ public class RemoveRedundantCast : IExpressionTransformer public Expression Transform(UnaryExpression expression) { if (expression.Type != typeof(object) && + expression.Type != typeof(Enum) && expression.Type.IsAssignableFrom(expression.Operand.Type) && expression.Method == null && !expression.IsLiftedToNull) @@ -29,7 +31,7 @@ public Expression Transform(UnaryExpression expression) // Reduce double casting (e.g. (long?)(long)3 => (long?)3) if (expression.Operand.NodeType == ExpressionType.Convert && - expression.Type.UnwrapIfNullable() == expression.Operand.Type) + expression.Type.UnwrapIfNullable() == expression.Operand.Type) { return Expression.Convert(((UnaryExpression) expression.Operand).Operand, expression.Type); } diff --git a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs index 29595877d9f..b9b04ab9759 100644 --- a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs +++ b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs @@ -25,6 +25,7 @@ public DefaultLinqToHqlGeneratorsRegistry() RegisterGenerator(new ToStringRuntimeMethodHqlGenerator()); RegisterGenerator(new LikeGenerator()); RegisterGenerator(new GetValueOrDefaultGenerator()); + RegisterGenerator(new HasFlagGenerator()); RegisterGenerator(new CompareGenerator()); this.Merge(new CompareGenerator()); diff --git a/src/NHibernate/Linq/Functions/HasFlagGenerator.cs b/src/NHibernate/Linq/Functions/HasFlagGenerator.cs new file mode 100644 index 00000000000..876b8ff3087 --- /dev/null +++ b/src/NHibernate/Linq/Functions/HasFlagGenerator.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq.Expressions; +using System.Reflection; +using NHibernate.Hql.Ast; +using NHibernate.Linq.Visitors; + +namespace NHibernate.Linq.Functions +{ + internal class HasFlagGenerator : BaseHqlGeneratorForMethod, IRuntimeMethodHqlGenerator + { + private const string _bitAndFunctionName = "band"; + + public bool SupportsMethod(MethodInfo method) + { + return method.Name == nameof(Enum.HasFlag) && method.DeclaringType == typeof(Enum); + } + + public IHqlGeneratorForMethod GetMethodGenerator(MethodInfo method) + { + return this; + } + + public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) + { + return treeBuilder.Equality( + treeBuilder.MethodCall( + _bitAndFunctionName, + visitor.Visit(targetObject).AsExpression(), + visitor.Visit(arguments[0]).AsExpression()), + visitor.Visit(arguments[0]).AsExpression()); + } + } +} From d3b70011ce4849d4653c43b10142eac6983b702b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 21 Feb 2023 09:16:59 +0000 Subject: [PATCH 2/9] Generate async files --- .../Async/NHSpecificTest/GH3365/Fixture.cs | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs new file mode 100644 index 00000000000..ed8cb246171 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System.Linq; +using NUnit.Framework; +using NHibernate.Linq; + +namespace NHibernate.Test.NHSpecificTest.GH3365 +{ + using System.Threading.Tasks; + [TestFixture] + public class FixtureAsync : BugTestCase + { + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + + var e1 = new Parent { Type = TestEnum.A | TestEnum.C }; + session.Save(e1); + + var e2 = new Child { Type = TestEnum.D, Parent = e1 }; + session.Save(e2); + + var e3 = new Child { Type = TestEnum.C, Parent = e1 }; + session.Save(e3); + + session.Flush(); + transaction.Commit(); + } + } + + [Test] + public async Task SelectClassAsync() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var resultFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefaultAsync()); + + var resultNotFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.D)).FirstOrDefaultAsync()); + + Assert.That(resultFound, Is.Not.Null); + Assert.That(resultNotFound, Is.Null); + } + } + + [Test] + public async Task SelectChildClassContainedInParentAsync() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var result = await (session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefaultAsync()); + + Assert.That(result, Is.Not.Null); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + using (ISession session = this.OpenSession()) + { + foreach (var entity in new[] { nameof(Child), nameof(Parent) }) + { + session.Delete($"from {entity}"); + session.Flush(); + } + } + } + } +} From 1e03044120889d496f57e0b5a7ca512cec213f94 Mon Sep 17 00:00:00 2001 From: Tomas Lukac Date: Tue, 21 Feb 2023 15:15:50 +0100 Subject: [PATCH 3/9] Move test to correct namespace / folder --- .../Async/NHSpecificTest/{GH3365 => GH0829}/Fixture.cs | 2 +- .../NHSpecificTest/{GH3365 => GH0829}/Fixture.cs | 2 +- .../NHSpecificTest/{GH3365 => GH0829}/Mappings.hbm.xml | 6 +++--- .../NHSpecificTest/{GH3365 => GH0829}/Model.cs | 2 +- .../NHSpecificTest/{GH3365 => GH0829}/TestEnum.cs | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename src/NHibernate.Test/Async/NHSpecificTest/{GH3365 => GH0829}/Fixture.cs (97%) rename src/NHibernate.Test/NHSpecificTest/{GH3365 => GH0829}/Fixture.cs (96%) rename src/NHibernate.Test/NHSpecificTest/{GH3365 => GH0829}/Mappings.hbm.xml (76%) rename src/NHibernate.Test/NHSpecificTest/{GH3365 => GH0829}/Model.cs (89%) rename src/NHibernate.Test/NHSpecificTest/{GH3365 => GH0829}/TestEnum.cs (70%) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs similarity index 97% rename from src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs rename to src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs index ed8cb246171..c53185607e2 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH3365/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs @@ -12,7 +12,7 @@ using NUnit.Framework; using NHibernate.Linq; -namespace NHibernate.Test.NHSpecificTest.GH3365 +namespace NHibernate.Test.NHSpecificTest.GH0829 { using System.Threading.Tasks; [TestFixture] diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs similarity index 96% rename from src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs rename to src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs index 093cb008d79..cb3a26d31af 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3365/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs @@ -1,7 +1,7 @@ using System.Linq; using NUnit.Framework; -namespace NHibernate.Test.NHSpecificTest.GH3365 +namespace NHibernate.Test.NHSpecificTest.GH0829 { [TestFixture] public class Fixture : BugTestCase diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH0829/Mappings.hbm.xml similarity index 76% rename from src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml rename to src/NHibernate.Test/NHSpecificTest/GH0829/Mappings.hbm.xml index eaf9245849f..7527c9d74c7 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3365/Mappings.hbm.xml +++ b/src/NHibernate.Test/NHSpecificTest/GH0829/Mappings.hbm.xml @@ -1,8 +1,8 @@  - + - + @@ -11,7 +11,7 @@ - + diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs b/src/NHibernate.Test/NHSpecificTest/GH0829/Model.cs similarity index 89% rename from src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs rename to src/NHibernate.Test/NHSpecificTest/GH0829/Model.cs index 66041f90790..92af512fddb 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3365/Model.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH0829/Model.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace NHibernate.Test.NHSpecificTest.GH3365 +namespace NHibernate.Test.NHSpecificTest.GH0829 { public class Parent { diff --git a/src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs b/src/NHibernate.Test/NHSpecificTest/GH0829/TestEnum.cs similarity index 70% rename from src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs rename to src/NHibernate.Test/NHSpecificTest/GH0829/TestEnum.cs index 5f95aa32f53..5d3a919400e 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH3365/TestEnum.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH0829/TestEnum.cs @@ -1,6 +1,6 @@ using System; -namespace NHibernate.Test.NHSpecificTest.GH3365 +namespace NHibernate.Test.NHSpecificTest.GH0829 { [Flags] public enum TestEnum From ab4a1e86217b8d34b3d5d524e5d993991909d1db Mon Sep 17 00:00:00 2001 From: Tomas Lukac Date: Thu, 23 Feb 2023 11:13:24 +0100 Subject: [PATCH 4/9] fix for DeepSource analysis --- .../NHSpecificTest/GH0829/Fixture.cs | 58 +++++++++---------- .../RemoveRedundantCast.cs | 5 +- 2 files changed, 27 insertions(+), 36 deletions(-) diff --git a/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs index cb3a26d31af..7b2780d8bbc 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs @@ -8,61 +8,55 @@ public class Fixture : BugTestCase { protected override void OnSetUp() { - using (var session = OpenSession()) - using (var transaction = session.BeginTransaction()) - { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); - var e1 = new Parent { Type = TestEnum.A | TestEnum.C }; - session.Save(e1); + var e1 = new Parent { Type = TestEnum.A | TestEnum.C }; + session.Save(e1); - var e2 = new Child { Type = TestEnum.D, Parent = e1 }; - session.Save(e2); + var e2 = new Child { Type = TestEnum.D, Parent = e1 }; + session.Save(e2); - var e3 = new Child { Type = TestEnum.C, Parent = e1 }; - session.Save(e3); + var e3 = new Child { Type = TestEnum.C, Parent = e1 }; + session.Save(e3); - session.Flush(); - transaction.Commit(); - } + session.Flush(); + transaction.Commit(); } [Test] public void SelectClass() { - using (var session = OpenSession()) - using (session.BeginTransaction()) - { - var resultFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefault(); + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); - var resultNotFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.D)).FirstOrDefault(); + var resultFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefault(); - Assert.That(resultFound, Is.Not.Null); - Assert.That(resultNotFound, Is.Null); - } + var resultNotFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.D)).FirstOrDefault(); + + Assert.That(resultFound, Is.Not.Null); + Assert.That(resultNotFound, Is.Null); } [Test] public void SelectChildClassContainedInParent() { - using (var session = OpenSession()) - using (session.BeginTransaction()) - { - var result = session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefault(); + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); - Assert.That(result, Is.Not.Null); - } + var result = session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefault(); + + Assert.That(result, Is.Not.Null); } protected override void OnTearDown() { base.OnTearDown(); - using (ISession session = this.OpenSession()) + using var session = OpenSession(); + foreach (var entity in new[] { nameof(Child), nameof(Parent) }) { - foreach (var entity in new[] { nameof(Child), nameof(Parent) }) - { - session.Delete($"from {entity}"); - session.Flush(); - } + session.Delete($"from {entity}"); + session.Flush(); } } } diff --git a/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs b/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs index d352dc47247..3e263d45c6b 100644 --- a/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs +++ b/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs @@ -39,9 +39,6 @@ public Expression Transform(UnaryExpression expression) return expression; } - public ExpressionType[] SupportedExpressionTypes - { - get { return _supportedExpressionTypes; } - } + public ExpressionType[] SupportedExpressionTypes => _supportedExpressionTypes; } } From 4a1666474d0c42562344341de77576e1438f41ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Feb 2023 10:17:52 +0000 Subject: [PATCH 5/9] Generate async files --- .../Async/NHSpecificTest/GH0829/Fixture.cs | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs index c53185607e2..b8b41e212eb 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs @@ -20,61 +20,55 @@ public class FixtureAsync : BugTestCase { protected override void OnSetUp() { - using (var session = OpenSession()) - using (var transaction = session.BeginTransaction()) - { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); - var e1 = new Parent { Type = TestEnum.A | TestEnum.C }; - session.Save(e1); + var e1 = new Parent { Type = TestEnum.A | TestEnum.C }; + session.Save(e1); - var e2 = new Child { Type = TestEnum.D, Parent = e1 }; - session.Save(e2); + var e2 = new Child { Type = TestEnum.D, Parent = e1 }; + session.Save(e2); - var e3 = new Child { Type = TestEnum.C, Parent = e1 }; - session.Save(e3); + var e3 = new Child { Type = TestEnum.C, Parent = e1 }; + session.Save(e3); - session.Flush(); - transaction.Commit(); - } + session.Flush(); + transaction.Commit(); } [Test] public async Task SelectClassAsync() { - using (var session = OpenSession()) - using (session.BeginTransaction()) - { - var resultFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefaultAsync()); + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); - var resultNotFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.D)).FirstOrDefaultAsync()); + var resultFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefaultAsync()); - Assert.That(resultFound, Is.Not.Null); - Assert.That(resultNotFound, Is.Null); - } + var resultNotFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.D)).FirstOrDefaultAsync()); + + Assert.That(resultFound, Is.Not.Null); + Assert.That(resultNotFound, Is.Null); } [Test] public async Task SelectChildClassContainedInParentAsync() { - using (var session = OpenSession()) - using (session.BeginTransaction()) - { - var result = await (session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefaultAsync()); + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); - Assert.That(result, Is.Not.Null); - } + var result = await (session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefaultAsync()); + + Assert.That(result, Is.Not.Null); } protected override void OnTearDown() { base.OnTearDown(); - using (ISession session = this.OpenSession()) + using var session = OpenSession(); + foreach (var entity in new[] { nameof(Child), nameof(Parent) }) { - foreach (var entity in new[] { nameof(Child), nameof(Parent) }) - { - session.Delete($"from {entity}"); - session.Flush(); - } + session.Delete($"from {entity}"); + session.Flush(); } } } From 33764077b622df10f1e5286a2236a1470bc064d8 Mon Sep 17 00:00:00 2001 From: Tomas Lukac Date: Fri, 24 Mar 2023 18:31:29 +0100 Subject: [PATCH 6/9] remove unnecessary usage of IRuntimeMethodHqlGenerator --- .../Functions/DefaultLinqToHqlGeneratorsRegistry.cs | 3 ++- src/NHibernate/Linq/Functions/HasFlagGenerator.cs | 12 ++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs index b9b04ab9759..8702c9f71bb 100644 --- a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs +++ b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs @@ -25,7 +25,7 @@ public DefaultLinqToHqlGeneratorsRegistry() RegisterGenerator(new ToStringRuntimeMethodHqlGenerator()); RegisterGenerator(new LikeGenerator()); RegisterGenerator(new GetValueOrDefaultGenerator()); - RegisterGenerator(new HasFlagGenerator()); + RegisterGenerator(new CompareGenerator()); this.Merge(new CompareGenerator()); @@ -70,6 +70,7 @@ public DefaultLinqToHqlGeneratorsRegistry() this.Merge(new DecimalNegateGenerator()); this.Merge(new RoundGenerator()); this.Merge(new TruncateGenerator()); + this.Merge(new HasFlagGenerator()); var indexerGenerator = new ListIndexerGenerator(); RegisterGenerator(indexerGenerator); diff --git a/src/NHibernate/Linq/Functions/HasFlagGenerator.cs b/src/NHibernate/Linq/Functions/HasFlagGenerator.cs index 876b8ff3087..99b0c0ced7a 100644 --- a/src/NHibernate/Linq/Functions/HasFlagGenerator.cs +++ b/src/NHibernate/Linq/Functions/HasFlagGenerator.cs @@ -4,21 +4,17 @@ using System.Reflection; using NHibernate.Hql.Ast; using NHibernate.Linq.Visitors; +using NHibernate.Util; namespace NHibernate.Linq.Functions { - internal class HasFlagGenerator : BaseHqlGeneratorForMethod, IRuntimeMethodHqlGenerator + internal class HasFlagGenerator : BaseHqlGeneratorForMethod { private const string _bitAndFunctionName = "band"; - public bool SupportsMethod(MethodInfo method) + public HasFlagGenerator() { - return method.Name == nameof(Enum.HasFlag) && method.DeclaringType == typeof(Enum); - } - - public IHqlGeneratorForMethod GetMethodGenerator(MethodInfo method) - { - return this; + SupportedMethods = new[] { ReflectHelper.GetMethodDefinition(x => x.HasFlag(default)) }; } public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) From b11297a8e52a022936f161bb8620f2916bc4e07f Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 25 Mar 2023 07:10:16 +0200 Subject: [PATCH 7/9] Remove unrelated formatting changes --- .../ExpressionTransformers/RemoveRedundantCast.cs | 11 +++++++---- .../Functions/DefaultLinqToHqlGeneratorsRegistry.cs | 1 - 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs b/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs index 3e263d45c6b..f8e152229f2 100644 --- a/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs +++ b/src/NHibernate/Linq/ExpressionTransformers/RemoveRedundantCast.cs @@ -6,8 +6,8 @@ namespace NHibernate.Linq.ExpressionTransformers { /// - /// Remove redundant casts to the same type or to superclass (upcast) in , - /// and s + /// Remove redundant casts to the same type or to superclass (upcast) in , + /// and s /// public class RemoveRedundantCast : IExpressionTransformer { @@ -31,7 +31,7 @@ public Expression Transform(UnaryExpression expression) // Reduce double casting (e.g. (long?)(long)3 => (long?)3) if (expression.Operand.NodeType == ExpressionType.Convert && - expression.Type.UnwrapIfNullable() == expression.Operand.Type) + expression.Type.UnwrapIfNullable() == expression.Operand.Type) { return Expression.Convert(((UnaryExpression) expression.Operand).Operand, expression.Type); } @@ -39,6 +39,9 @@ public Expression Transform(UnaryExpression expression) return expression; } - public ExpressionType[] SupportedExpressionTypes => _supportedExpressionTypes; + public ExpressionType[] SupportedExpressionTypes + { + get { return _supportedExpressionTypes; } + } } } diff --git a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs index 8702c9f71bb..6800271f9f0 100644 --- a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs +++ b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs @@ -26,7 +26,6 @@ public DefaultLinqToHqlGeneratorsRegistry() RegisterGenerator(new LikeGenerator()); RegisterGenerator(new GetValueOrDefaultGenerator()); - RegisterGenerator(new CompareGenerator()); this.Merge(new CompareGenerator()); From 824368752f6af2e57b6fb97561a13ecf92b874ef Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 25 Mar 2023 07:58:13 +0200 Subject: [PATCH 8/9] Test cleanup --- src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs index 7b2780d8bbc..5726de6d4b2 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH0829/Fixture.cs @@ -20,7 +20,6 @@ protected override void OnSetUp() var e3 = new Child { Type = TestEnum.C, Parent = e1 }; session.Save(e3); - session.Flush(); transaction.Commit(); } @@ -28,7 +27,6 @@ protected override void OnSetUp() public void SelectClass() { using var session = OpenSession(); - using var transaction = session.BeginTransaction(); var resultFound = session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefault(); @@ -42,7 +40,6 @@ public void SelectClass() public void SelectChildClassContainedInParent() { using var session = OpenSession(); - using var transaction = session.BeginTransaction(); var result = session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefault(); @@ -51,13 +48,14 @@ public void SelectChildClassContainedInParent() protected override void OnTearDown() { - base.OnTearDown(); using var session = OpenSession(); + using var transaction = session.BeginTransaction(); foreach (var entity in new[] { nameof(Child), nameof(Parent) }) { - session.Delete($"from {entity}"); - session.Flush(); + session.CreateQuery($"delete from {entity}").ExecuteUpdate(); } + + transaction.Commit(); } } } From 31c74da00f936df21a5afa80a9a8a6355b746b8d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 25 Mar 2023 06:03:34 +0000 Subject: [PATCH 9/9] Generate async files --- .../Async/NHSpecificTest/GH0829/Fixture.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs index b8b41e212eb..36015f3d1c6 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH0829/Fixture.cs @@ -32,7 +32,6 @@ protected override void OnSetUp() var e3 = new Child { Type = TestEnum.C, Parent = e1 }; session.Save(e3); - session.Flush(); transaction.Commit(); } @@ -40,7 +39,6 @@ protected override void OnSetUp() public async Task SelectClassAsync() { using var session = OpenSession(); - using var transaction = session.BeginTransaction(); var resultFound = await (session.Query().Where(x => x.Type.HasFlag(TestEnum.A)).FirstOrDefaultAsync()); @@ -54,7 +52,6 @@ public async Task SelectClassAsync() public async Task SelectChildClassContainedInParentAsync() { using var session = OpenSession(); - using var transaction = session.BeginTransaction(); var result = await (session.Query().Where(x => x.Parent.Type.HasFlag(x.Type)).FirstOrDefaultAsync()); @@ -63,13 +60,14 @@ public async Task SelectChildClassContainedInParentAsync() protected override void OnTearDown() { - base.OnTearDown(); using var session = OpenSession(); + using var transaction = session.BeginTransaction(); foreach (var entity in new[] { nameof(Child), nameof(Parent) }) { - session.Delete($"from {entity}"); - session.Flush(); + session.CreateQuery($"delete from {entity}").ExecuteUpdate(); } + + transaction.Commit(); } } }