From fa8a8bc4b554ce38d2fc4a3a2749be7511020ea6 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 22 Mar 2019 09:58:53 +0200 Subject: [PATCH 1/4] Use entities prepared by Loader in hql select projections Fixes #2064 --- .../NHSpecificTest/GH2064/FixtureByCode.cs | 119 ++++++++++++++++++ .../NHSpecificTest/GH2064/Entities.cs | 17 +++ .../NHSpecificTest/GH2064/FixtureByCode.cs | 107 ++++++++++++++++ .../Async/Loader/Hql/QueryLoader.cs | 4 +- .../Hql/Ast/ANTLR/Tree/ConstructorNode.cs | 12 +- .../Hql/Ast/ANTLR/Tree/SelectClause.cs | 29 +++-- src/NHibernate/Loader/Hql/QueryLoader.cs | 6 +- 7 files changed, 276 insertions(+), 18 deletions(-) create mode 100644 src/NHibernate.Test/Async/NHSpecificTest/GH2064/FixtureByCode.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2064/FixtureByCode.cs diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2064/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2064/FixtureByCode.cs new file mode 100644 index 00000000000..251d368dc9e --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2064/FixtureByCode.cs @@ -0,0 +1,119 @@ +//------------------------------------------------------------------------------ +// +// 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 NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using NHibernate.Linq; + +namespace NHibernate.Test.NHSpecificTest.GH2064 +{ + using System.Threading.Tasks; + + [TestFixture] + public class OneToOneSelectProjectionFixtureAsync : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class( + rc => + { + rc.Id(e => e.Id, m => m.Generator(Generators.Assigned)); + rc.Property(e => e.Name); + }); + + mapper.Class( + rc => + { + rc.Id(e => e.Id, m => m.Generator(Generators.GuidComb)); + rc.Property(e => e.Name); + rc.OneToOne(e => e.OneToOne, m => { }); + }); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var nullableOwner = new ParentEntity() {Name = "Owner",}; + var oneToOne = new OneToOneEntity() {Name = "OneToOne"}; + nullableOwner.OneToOne = oneToOne; + session.Save(nullableOwner); + oneToOne.Id = nullableOwner.Id; + session.Save(oneToOne); + session.Flush(); + + transaction.Commit(); + } + } + + protected override void OnTearDown() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + // The HQL delete does all the job inside the database without loading the entities, but it does + // not handle delete order for avoiding violating constraints if any. Use + // session.Delete("from System.Object"); + // instead if in need of having NHbernate ordering the deletes, but this will cause + // loading the entities in the session. + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + } + + [Test] + public async Task QueryOneToOneAsync() + { + using (var session = OpenSession()) + { + var entity = + await (session + .Query() + .FirstOrDefaultAsync()); + Assert.That(entity.OneToOne, Is.Not.Null); + } + } + + [Test] + public async Task QueryOneToOneProjectionAsync() + { + using (var session = OpenSession()) + { + var entity = + await (session + .Query() + .Select( + x => new + { + x.Id, + SubType = new {x.OneToOne, x.Name}, + SubType2 = new + { + x.Id, + x.OneToOne, + SubType3 = new {x.Id, x.OneToOne} + }, + x.OneToOne + }).FirstOrDefaultAsync()); + Assert.That(entity.OneToOne, Is.Not.Null); + Assert.That(entity.SubType.OneToOne, Is.Not.Null); + Assert.That(entity.SubType2.OneToOne, Is.Not.Null); + Assert.That(entity.SubType2.SubType3.OneToOne, Is.Not.Null); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs b/src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs new file mode 100644 index 00000000000..3dc54475b3f --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs @@ -0,0 +1,17 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH2064 +{ + public class OneToOneEntity + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + } + + public class ParentEntity + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + public virtual OneToOneEntity OneToOne { get; set; } + } +} \ No newline at end of file diff --git a/src/NHibernate.Test/NHSpecificTest/GH2064/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH2064/FixtureByCode.cs new file mode 100644 index 00000000000..5b1443cd13e --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2064/FixtureByCode.cs @@ -0,0 +1,107 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH2064 +{ + + [TestFixture] + public class OneToOneSelectProjectionFixture : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class( + rc => + { + rc.Id(e => e.Id, m => m.Generator(Generators.Assigned)); + rc.Property(e => e.Name); + }); + + mapper.Class( + rc => + { + rc.Id(e => e.Id, m => m.Generator(Generators.GuidComb)); + rc.Property(e => e.Name); + rc.OneToOne(e => e.OneToOne, m => { }); + }); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var nullableOwner = new ParentEntity() {Name = "Owner",}; + var oneToOne = new OneToOneEntity() {Name = "OneToOne"}; + nullableOwner.OneToOne = oneToOne; + session.Save(nullableOwner); + oneToOne.Id = nullableOwner.Id; + session.Save(oneToOne); + session.Flush(); + + transaction.Commit(); + } + } + + protected override void OnTearDown() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + // The HQL delete does all the job inside the database without loading the entities, but it does + // not handle delete order for avoiding violating constraints if any. Use + // session.Delete("from System.Object"); + // instead if in need of having NHbernate ordering the deletes, but this will cause + // loading the entities in the session. + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + } + + [Test] + public void QueryOneToOne() + { + using (var session = OpenSession()) + { + var entity = + session + .Query() + .FirstOrDefault(); + Assert.That(entity.OneToOne, Is.Not.Null); + } + } + + [Test] + public void QueryOneToOneProjection() + { + using (var session = OpenSession()) + { + var entity = + session + .Query() + .Select( + x => new + { + x.Id, + SubType = new {x.OneToOne, x.Name}, + SubType2 = new + { + x.Id, + x.OneToOne, + SubType3 = new {x.Id, x.OneToOne} + }, + x.OneToOne + }).FirstOrDefault(); + Assert.That(entity.OneToOne, Is.Not.Null); + Assert.That(entity.SubType.OneToOne, Is.Not.Null); + Assert.That(entity.SubType2.OneToOne, Is.Not.Null); + Assert.That(entity.SubType2.SubType3.OneToOne, Is.Not.Null); + } + } + } +} diff --git a/src/NHibernate/Async/Loader/Hql/QueryLoader.cs b/src/NHibernate/Async/Loader/Hql/QueryLoader.cs index 4285de1c77e..63c80d7be40 100644 --- a/src/NHibernate/Async/Loader/Hql/QueryLoader.cs +++ b/src/NHibernate/Async/Loader/Hql/QueryLoader.cs @@ -76,7 +76,9 @@ protected override async Task GetResultRowAsync(object[] row, DbDataRe resultRow = new object[queryCols]; for (int i = 0; i < queryCols; i++) { - resultRow[i] = await (ResultTypes[i].NullSafeGetAsync(rs, scalarColumns[i], session, null, cancellationToken)).ConfigureAwait(false); + resultRow[i] = _entityToScalarResultMap.TryGetValue(i, out var rowIndex) + ? row[rowIndex] + : await (ResultTypes[i].NullSafeGetAsync(rs, scalarColumns[i], session, null, cancellationToken)).ConfigureAwait(false); } } else diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs index 925c0452f88..d183a6e24ed 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs @@ -133,15 +133,13 @@ public void Prepare() private IType[] ResolveConstructorArgumentTypes() { ISelectExpression[] argumentExpressions = CollectSelectExpressions(); - - if ( argumentExpressions == null ) - { - // return an empty Type array - return Array.Empty(); - } + return ToArgumentTypes(argumentExpressions); + } + internal static IType[] ToArgumentTypes(ISelectExpression[] argumentExpressions) + { IType[] types = new IType[argumentExpressions.Length]; - for ( int x = 0; x < argumentExpressions.Length; x++ ) + for (int x = 0; x < argumentExpressions.Length; x++) { types[x] = argumentExpressions[x].DataType; } diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs index 3fca5b4f4d3..a8c63385b2e 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs @@ -23,6 +23,8 @@ public class SelectClause : SelectExpressionList private IType[] _queryReturnTypes; private string[][] _columnNames; private readonly List _fromElementsForLoad = new List(); + private readonly Dictionary _entityToScalarResultMap = new Dictionary(); + private ConstructorNode _constructorNode; private string[] _aliases; private int[] _columnNamesStartPositions; @@ -136,20 +138,22 @@ public void InitializeExplicitSelectClause(FromClause fromClause) if (expr.IsConstructor) { _constructorNode = (ConstructorNode)expr; - IList constructorArgumentTypeList = _constructorNode.ConstructorArgumentTypeList; //sqlResultTypeList.addAll( constructorArgumentTypeList ); - queryReturnTypeList.AddRange(constructorArgumentTypeList); _scalarSelect = true; - for (int j = 1; j < _constructorNode.ChildCount; j++) + var ctorSelectExpressions = _constructorNode.CollectSelectExpressions(); + for (int j = 0; j < ctorSelectExpressions.Length; j++) { - ISelectExpression se = _constructorNode.GetChild(j) as ISelectExpression; + ISelectExpression se = ctorSelectExpressions[j]; - if (se != null && IsReturnableEntity(se)) + if (IsReturnableEntity(se)) { - _fromElementsForLoad.Add(se.FromElement); + AddEntityToScalarResults(queryReturnTypeList.Count + j, se); } } + + IList constructorArgumentTypeList = ConstructorNode.ToArgumentTypes(ctorSelectExpressions); + queryReturnTypeList.AddRange(constructorArgumentTypeList); } else { @@ -165,10 +169,9 @@ public void InitializeExplicitSelectClause(FromClause fromClause) { _scalarSelect = true; } - - if (IsReturnableEntity(expr)) + else if (IsReturnableEntity(expr)) { - _fromElementsForLoad.Add(expr.FromElement); + AddEntityToScalarResults(queryReturnTypeList.Count, expr); } // Always add the type to the return type list. @@ -250,6 +253,12 @@ public void InitializeExplicitSelectClause(FromClause fromClause) FinishInitialization( /*sqlResultTypeList,*/ queryReturnTypeList); } + private void AddEntityToScalarResults(int i, ISelectExpression se) + { + _entityToScalarResultMap[i] = _fromElementsForLoad.Count; + _fromElementsForLoad.Add(se.FromElement); + } + private static FromElement GetOrigin(FromElement fromElement) { var realOrigin = fromElement.RealOrigin; @@ -274,6 +283,8 @@ public IList FromElementsForLoad get { return _fromElementsForLoad; } } + internal IReadOnlyDictionary EntityToScalarResultMap => _entityToScalarResultMap; + public bool IsScalarSelect { get { return _scalarSelect; } diff --git a/src/NHibernate/Loader/Hql/QueryLoader.cs b/src/NHibernate/Loader/Hql/QueryLoader.cs index d918048802f..3cfb7cead10 100644 --- a/src/NHibernate/Loader/Hql/QueryLoader.cs +++ b/src/NHibernate/Loader/Hql/QueryLoader.cs @@ -46,6 +46,7 @@ public partial class QueryLoader : BasicLoader private LockMode[] _defaultLockModes; private IType[] _cacheTypes; private ISet _uncacheableCollectionPersisters; + private IReadOnlyDictionary _entityToScalarResultMap; public QueryLoader(QueryTranslatorImpl queryTranslator, ISessionFactoryImplementor factory, SelectClause selectClause) : base(factory) @@ -208,6 +209,7 @@ protected override ICollectionPersister[] CollectionPersisters private void Initialize(SelectClause selectClause) { IList fromElementList = selectClause.FromElementsForLoad; + _entityToScalarResultMap = selectClause.EntityToScalarResultMap; _hasScalars = selectClause.IsScalarSelect; _scalarColumnNames = selectClause.ColumnNames; @@ -375,7 +377,9 @@ protected override object[] GetResultRow(object[] row, DbDataReader rs, ISession resultRow = new object[queryCols]; for (int i = 0; i < queryCols; i++) { - resultRow[i] = ResultTypes[i].NullSafeGet(rs, scalarColumns[i], session, null); + resultRow[i] = _entityToScalarResultMap.TryGetValue(i, out var rowIndex) + ? row[rowIndex] + : ResultTypes[i].NullSafeGet(rs, scalarColumns[i], session, null); } } else From eafc323f7f60600996408c1f4b8cca34934ff2bd Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 22 Mar 2019 12:25:03 +0200 Subject: [PATCH 2/4] Improve naming --- ...Code.cs => OneToOneSelectProjectionFixture.cs} | 0 ...Code.cs => OneToOneSelectProjectionFixture.cs} | 0 src/NHibernate/Async/Loader/Hql/QueryLoader.cs | 2 +- src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs | 15 +++++++++------ src/NHibernate/Loader/Hql/QueryLoader.cs | 6 +++--- 5 files changed, 13 insertions(+), 10 deletions(-) rename src/NHibernate.Test/Async/NHSpecificTest/GH2064/{FixtureByCode.cs => OneToOneSelectProjectionFixture.cs} (100%) rename src/NHibernate.Test/NHSpecificTest/GH2064/{FixtureByCode.cs => OneToOneSelectProjectionFixture.cs} (100%) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2064/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs similarity index 100% rename from src/NHibernate.Test/Async/NHSpecificTest/GH2064/FixtureByCode.cs rename to src/NHibernate.Test/Async/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs diff --git a/src/NHibernate.Test/NHSpecificTest/GH2064/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs similarity index 100% rename from src/NHibernate.Test/NHSpecificTest/GH2064/FixtureByCode.cs rename to src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs diff --git a/src/NHibernate/Async/Loader/Hql/QueryLoader.cs b/src/NHibernate/Async/Loader/Hql/QueryLoader.cs index 63c80d7be40..3fd40c89fb1 100644 --- a/src/NHibernate/Async/Loader/Hql/QueryLoader.cs +++ b/src/NHibernate/Async/Loader/Hql/QueryLoader.cs @@ -76,7 +76,7 @@ protected override async Task GetResultRowAsync(object[] row, DbDataRe resultRow = new object[queryCols]; for (int i = 0; i < queryCols; i++) { - resultRow[i] = _entityToScalarResultMap.TryGetValue(i, out var rowIndex) + resultRow[i] = _entityByResultTypeDic.TryGetValue(i, out var rowIndex) ? row[rowIndex] : await (ResultTypes[i].NullSafeGetAsync(rs, scalarColumns[i], session, null, cancellationToken)).ConfigureAwait(false); } diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs index a8c63385b2e..80b69535db0 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs @@ -23,7 +23,7 @@ public class SelectClause : SelectExpressionList private IType[] _queryReturnTypes; private string[][] _columnNames; private readonly List _fromElementsForLoad = new List(); - private readonly Dictionary _entityToScalarResultMap = new Dictionary(); + private readonly Dictionary _entityByResultTypeDic = new Dictionary(); private ConstructorNode _constructorNode; private string[] _aliases; @@ -148,7 +148,7 @@ public void InitializeExplicitSelectClause(FromClause fromClause) if (IsReturnableEntity(se)) { - AddEntityToScalarResults(queryReturnTypeList.Count + j, se); + AddEntityToProjection(queryReturnTypeList.Count + j, se); } } @@ -171,7 +171,7 @@ public void InitializeExplicitSelectClause(FromClause fromClause) } else if (IsReturnableEntity(expr)) { - AddEntityToScalarResults(queryReturnTypeList.Count, expr); + AddEntityToProjection(queryReturnTypeList.Count, expr); } // Always add the type to the return type list. @@ -253,9 +253,9 @@ public void InitializeExplicitSelectClause(FromClause fromClause) FinishInitialization( /*sqlResultTypeList,*/ queryReturnTypeList); } - private void AddEntityToScalarResults(int i, ISelectExpression se) + private void AddEntityToProjection(int resultIndex, ISelectExpression se) { - _entityToScalarResultMap[i] = _fromElementsForLoad.Count; + _entityByResultTypeDic[resultIndex] = _fromElementsForLoad.Count; _fromElementsForLoad.Add(se.FromElement); } @@ -283,7 +283,10 @@ public IList FromElementsForLoad get { return _fromElementsForLoad; } } - internal IReadOnlyDictionary EntityToScalarResultMap => _entityToScalarResultMap; + /// + /// Maps QueryReturnTypes[key] to entities from FromElementsForLoad[value] + /// + internal IReadOnlyDictionary EntityByResultTypeDic => _entityByResultTypeDic; public bool IsScalarSelect { diff --git a/src/NHibernate/Loader/Hql/QueryLoader.cs b/src/NHibernate/Loader/Hql/QueryLoader.cs index 3cfb7cead10..519b9e5fb5d 100644 --- a/src/NHibernate/Loader/Hql/QueryLoader.cs +++ b/src/NHibernate/Loader/Hql/QueryLoader.cs @@ -46,7 +46,7 @@ public partial class QueryLoader : BasicLoader private LockMode[] _defaultLockModes; private IType[] _cacheTypes; private ISet _uncacheableCollectionPersisters; - private IReadOnlyDictionary _entityToScalarResultMap; + private IReadOnlyDictionary _entityByResultTypeDic; public QueryLoader(QueryTranslatorImpl queryTranslator, ISessionFactoryImplementor factory, SelectClause selectClause) : base(factory) @@ -209,7 +209,7 @@ protected override ICollectionPersister[] CollectionPersisters private void Initialize(SelectClause selectClause) { IList fromElementList = selectClause.FromElementsForLoad; - _entityToScalarResultMap = selectClause.EntityToScalarResultMap; + _entityByResultTypeDic = selectClause.EntityByResultTypeDic; _hasScalars = selectClause.IsScalarSelect; _scalarColumnNames = selectClause.ColumnNames; @@ -377,7 +377,7 @@ protected override object[] GetResultRow(object[] row, DbDataReader rs, ISession resultRow = new object[queryCols]; for (int i = 0; i < queryCols; i++) { - resultRow[i] = _entityToScalarResultMap.TryGetValue(i, out var rowIndex) + resultRow[i] = _entityByResultTypeDic.TryGetValue(i, out var rowIndex) ? row[rowIndex] : ResultTypes[i].NullSafeGet(rs, scalarColumns[i], session, null); } From b08b6aa750c313cae21d43006af5ca229df0061a Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Mon, 5 Aug 2019 23:31:15 +1200 Subject: [PATCH 3/4] Remove additional iterations over constructor's DataType --- src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs | 7 +------ src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs | 7 +++---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs index d183a6e24ed..6155b54e670 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/ConstructorNode.cs @@ -133,13 +133,8 @@ public void Prepare() private IType[] ResolveConstructorArgumentTypes() { ISelectExpression[] argumentExpressions = CollectSelectExpressions(); - return ToArgumentTypes(argumentExpressions); - } - - internal static IType[] ToArgumentTypes(ISelectExpression[] argumentExpressions) - { IType[] types = new IType[argumentExpressions.Length]; - for (int x = 0; x < argumentExpressions.Length; x++) + for ( int x = 0; x < argumentExpressions.Length; x++ ) { types[x] = argumentExpressions[x].DataType; } diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs index 80b69535db0..98e8bec66ee 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs @@ -148,12 +148,11 @@ public void InitializeExplicitSelectClause(FromClause fromClause) if (IsReturnableEntity(se)) { - AddEntityToProjection(queryReturnTypeList.Count + j, se); + AddEntityToProjection(queryReturnTypeList.Count, se); } - } - IList constructorArgumentTypeList = ConstructorNode.ToArgumentTypes(ctorSelectExpressions); - queryReturnTypeList.AddRange(constructorArgumentTypeList); + queryReturnTypeList.Add(se.DataType); + } } else { From cc0c6c4479e8471c196da897c44a030d8732c3b4 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, 4 Apr 2020 21:20:06 +0200 Subject: [PATCH 4/4] Fix two added CodeFactor issue --- .../GH2064/OneToOneSelectProjectionFixture.cs | 3 +-- .../NHSpecificTest/GH2064/OneToOneEntity.cs | 10 ++++++++++ .../GH2064/OneToOneSelectProjectionFixture.cs | 3 +-- .../GH2064/{Entities.cs => ParentEntity.cs} | 8 +------- 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneEntity.cs rename src/NHibernate.Test/NHSpecificTest/GH2064/{Entities.cs => ParentEntity.cs} (66%) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs index 251d368dc9e..07b0adabd83 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs @@ -17,7 +17,6 @@ namespace NHibernate.Test.NHSpecificTest.GH2064 { using System.Threading.Tasks; - [TestFixture] public class OneToOneSelectProjectionFixtureAsync : TestCaseMappingByCode { @@ -67,7 +66,7 @@ protected override void OnTearDown() // The HQL delete does all the job inside the database without loading the entities, but it does // not handle delete order for avoiding violating constraints if any. Use // session.Delete("from System.Object"); - // instead if in need of having NHbernate ordering the deletes, but this will cause + // instead if in need of having NHibernate ordering the deletes, but this will cause // loading the entities in the session. session.CreateQuery("delete from System.Object").ExecuteUpdate(); diff --git a/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneEntity.cs b/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneEntity.cs new file mode 100644 index 00000000000..40673d98926 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneEntity.cs @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH2064 +{ + public class OneToOneEntity + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs index 5b1443cd13e..7d6acdc74e5 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH2064/OneToOneSelectProjectionFixture.cs @@ -5,7 +5,6 @@ namespace NHibernate.Test.NHSpecificTest.GH2064 { - [TestFixture] public class OneToOneSelectProjectionFixture : TestCaseMappingByCode { @@ -55,7 +54,7 @@ protected override void OnTearDown() // The HQL delete does all the job inside the database without loading the entities, but it does // not handle delete order for avoiding violating constraints if any. Use // session.Delete("from System.Object"); - // instead if in need of having NHbernate ordering the deletes, but this will cause + // instead if in need of having NHibernate ordering the deletes, but this will cause // loading the entities in the session. session.CreateQuery("delete from System.Object").ExecuteUpdate(); diff --git a/src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs b/src/NHibernate.Test/NHSpecificTest/GH2064/ParentEntity.cs similarity index 66% rename from src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs rename to src/NHibernate.Test/NHSpecificTest/GH2064/ParentEntity.cs index 3dc54475b3f..03325f531b0 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH2064/Entities.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH2064/ParentEntity.cs @@ -2,16 +2,10 @@ namespace NHibernate.Test.NHSpecificTest.GH2064 { - public class OneToOneEntity - { - public virtual Guid Id { get; set; } - public virtual string Name { get; set; } - } - public class ParentEntity { public virtual Guid Id { get; set; } public virtual string Name { get; set; } public virtual OneToOneEntity OneToOne { get; set; } } -} \ No newline at end of file +}