Skip to content

Commit cc1c22d

Browse files
committed
Obsolete HolderInstantiator
1 parent 7ce79ed commit cc1c22d

File tree

5 files changed

+84
-38
lines changed

5 files changed

+84
-38
lines changed

src/NHibernate/Async/Loader/Hql/QueryLoader.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using System.Diagnostics;
1616
using NHibernate.Engine;
1717
using NHibernate.Event;
18-
using NHibernate.Hql;
1918
using NHibernate.Hql.Ast.ANTLR;
2019
using NHibernate.Hql.Ast.ANTLR.Tree;
2120
using NHibernate.Impl;
@@ -104,11 +103,9 @@ internal async Task<IEnumerable> GetEnumerableAsync(QueryParameters queryParamet
104103
// This DbDataReader is disposed of in EnumerableImpl.Dispose
105104
var rs = await (GetResultSetAsync(cmd, queryParameters, session, null, cancellationToken)).ConfigureAwait(false);
106105

107-
HolderInstantiator hi =
108-
HolderInstantiator.GetHolderInstantiator(_selectNewTransformer, queryParameters.ResultTransformer, _queryReturnAliases);
109-
106+
var resultTransformer = _selectNewTransformer ?? queryParameters.ResultTransformer;
110107
IEnumerable result =
111-
new EnumerableImpl(rs, cmd, session, queryParameters.IsReadOnly(session), _queryTranslator.ReturnTypes, _queryTranslator.GetColumnNames(), queryParameters.RowSelection, hi);
108+
new EnumerableImpl(rs, cmd, session, queryParameters.IsReadOnly(session), _queryTranslator.ReturnTypes, _queryTranslator.GetColumnNames(), queryParameters.RowSelection, resultTransformer, _queryReturnAliases);
112109

113110
if (statsEnabled)
114111
{

src/NHibernate/Hql/HolderInstantiator.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
using System;
12
using System.Reflection;
23
using NHibernate.Transform;
34

45
namespace NHibernate.Hql
56
{
7+
//Since v5.2
8+
[Obsolete("This class has no more usages and will be removed in a future version.")]
69
public sealed class HolderInstantiator
710
{
811
public static readonly HolderInstantiator NoopInstantiator = new HolderInstantiator(null, null);

src/NHibernate/Impl/EnumerableImpl.cs

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using NHibernate.Exceptions;
88
using NHibernate.Hql;
99
using NHibernate.SqlCommand;
10+
using NHibernate.Transform;
1011
using NHibernate.Type;
1112

1213
namespace NHibernate.Impl
@@ -39,7 +40,8 @@ public class EnumerableImpl : IEnumerable, IEnumerator, IDisposable
3940
// when we start enumerating through the DataReader we are positioned
4041
// before the first record we need
4142
private int _currentRow = -1;
42-
private HolderInstantiator _holderInstantiator;
43+
private IResultTransformer _resultTransformer;
44+
private string[] _returnAliases;
4345
private RowSelection _selection;
4446

4547
/// <summary>
@@ -56,6 +58,8 @@ public class EnumerableImpl : IEnumerable, IEnumerator, IDisposable
5658
/// <remarks>
5759
/// The <see cref="DbDataReader"/> should already be positioned on the first record in <see cref="RowSelection"/>.
5860
/// </remarks>
61+
//Since v5.2
62+
[Obsolete("Please use the constructor accepting resultTransformer and queryReturnAliases")]
5963
public EnumerableImpl(DbDataReader reader,
6064
DbCommand cmd,
6165
IEventSource session,
@@ -64,6 +68,35 @@ public EnumerableImpl(DbDataReader reader,
6468
string[][] columnNames,
6569
RowSelection selection,
6670
HolderInstantiator holderInstantiator)
71+
: this(reader, cmd, session, readOnly, types, columnNames, selection, holderInstantiator.ResultTransformer, holderInstantiator.QueryReturnAliases)
72+
{
73+
}
74+
75+
/// <summary>
76+
/// Create an <see cref="IEnumerable"/> wrapper over an <see cref="DbDataReader"/>.
77+
/// </summary>
78+
/// <param name="reader">The <see cref="DbDataReader"/> to enumerate over.</param>
79+
/// <param name="cmd">The <see cref="DbCommand"/> used to create the <see cref="DbDataReader"/>.</param>
80+
/// <param name="session">The <see cref="ISession"/> to use to load objects.</param>
81+
/// <param name="readOnly"></param>
82+
/// <param name="types">The <see cref="IType"/>s contained in the <see cref="DbDataReader"/>.</param>
83+
/// <param name="columnNames">The names of the columns in the <see cref="DbDataReader"/>.</param>
84+
/// <param name="selection">The <see cref="RowSelection"/> that should be applied to the <see cref="DbDataReader"/>.</param>
85+
/// <param name="resultTransformer">The <see cref="IResultTransformer"/> that should be applied to a result row or <c>null</c>.</param>
86+
/// <param name="returnAliases">The aliases that correspond to a result row.</param>
87+
/// <remarks>
88+
/// The <see cref="DbDataReader"/> should already be positioned on the first record in <see cref="RowSelection"/>.
89+
/// </remarks>
90+
public EnumerableImpl(
91+
DbDataReader reader,
92+
DbCommand cmd,
93+
IEventSource session,
94+
bool readOnly,
95+
IType[] types,
96+
string[][] columnNames,
97+
RowSelection selection,
98+
IResultTransformer resultTransformer,
99+
string[] returnAliases)
67100
{
68101
_reader = reader;
69102
_cmd = cmd;
@@ -72,9 +105,10 @@ public EnumerableImpl(DbDataReader reader,
72105
_types = types;
73106
_names = columnNames;
74107
_selection = selection;
75-
_holderInstantiator = holderInstantiator;
76108

77109
_single = _types.Length == 1;
110+
_resultTransformer = resultTransformer;
111+
_returnAliases = returnAliases;
78112
}
79113

80114
/// <summary>
@@ -179,9 +213,8 @@ private void PostMoveNext(bool hasNext)
179213
else
180214
{
181215
log.Debug("retrieving next results");
182-
bool isHolder = _holderInstantiator.IsRequired;
183-
184-
if (_single && !isHolder)
216+
217+
if (_single && _resultTransformer == null)
185218
{
186219
_currentResult = _types[0].NullSafeGet(_reader, _names[0], _session, null);
187220
}
@@ -199,10 +232,10 @@ private void PostMoveNext(bool hasNext)
199232
// and use the ISession to load an instance of the object.
200233
currentResults[i] = _types[i].NullSafeGet(_reader, _names[i], _session, null);
201234
}
202-
203-
if (isHolder)
235+
236+
if (_resultTransformer != null)
204237
{
205-
_currentResult = _holderInstantiator.Instantiate(currentResults);
238+
_currentResult = _resultTransformer.TransformTuple(currentResults, _returnAliases);
206239
}
207240
else
208241
{

src/NHibernate/Loader/Custom/CustomLoader.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ protected override object[] GetResultRow(object[] row, DbDataReader rs, ISession
301301

302302
protected override IResultTransformer ResolveResultTransformer(IResultTransformer resultTransformer)
303303
{
304-
return HolderInstantiator.ResolveResultTransformer(null, resultTransformer);
304+
return resultTransformer;
305305
}
306306

307307
protected override bool[] IncludeInResultRow
@@ -312,23 +312,20 @@ protected override bool[] IncludeInResultRow
312312
public override IList GetResultList(IList results, IResultTransformer resultTransformer)
313313
{
314314
// meant to handle dynamic instantiation queries...(Copy from QueryLoader)
315-
HolderInstantiator holderInstantiator =
316-
HolderInstantiator.GetHolderInstantiator(null, resultTransformer, ReturnAliasesForTransformer);
317-
if (holderInstantiator.IsRequired)
315+
var returnAliases = ReturnAliasesForTransformer;
316+
317+
if (resultTransformer != null)
318318
{
319-
for (int i = 0; i < results.Count; i++)
319+
for (var i = 0; i < results.Count; i++)
320320
{
321-
object[] row = (object[]) results[i];
322-
object result = holderInstantiator.Instantiate(row);
323-
results[i] = result;
321+
var row = (object[]) results[i];
322+
results[i] = resultTransformer.TransformTuple(row, returnAliases);
324323
}
325324

326325
return resultTransformer.TransformList(results);
327326
}
328-
else
329-
{
330-
return results;
331-
}
327+
328+
return results;
332329
}
333330

334331
protected internal override void AutoDiscoverTypes(

src/NHibernate/Loader/Hql/QueryLoader.cs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Diagnostics;
66
using NHibernate.Engine;
77
using NHibernate.Event;
8-
using NHibernate.Hql;
98
using NHibernate.Hql.Ast.ANTLR;
109
using NHibernate.Hql.Ast.ANTLR.Tree;
1110
using NHibernate.Impl;
@@ -204,7 +203,7 @@ private void Initialize(SelectClause selectClause)
204203
//sqlResultTypes = selectClause.getSqlResultTypes();
205204
ResultTypes = selectClause.QueryReturnTypes;
206205

207-
_selectNewTransformer = HolderInstantiator.CreateSelectNewTransformer(selectClause.Constructor, selectClause.IsMap, selectClause.IsList);
206+
_selectNewTransformer = GetSelectNewTransformer(selectClause);
208207
_queryReturnAliases = selectClause.QueryReturnAliases;
209208

210209
IList<FromElement> collectionFromElements = selectClause.CollectionFromElements;
@@ -291,15 +290,13 @@ public IList List(ISessionImplementor session, QueryParameters queryParameters)
291290
public override IList GetResultList(IList results, IResultTransformer resultTransformer)
292291
{
293292
// meant to handle dynamic instantiation queries...
294-
HolderInstantiator holderInstantiator = HolderInstantiator.GetHolderInstantiator(_selectNewTransformer,
295-
resultTransformer,
296-
_queryReturnAliases);
297-
if (holderInstantiator.IsRequired)
293+
var transformer = _selectNewTransformer ?? resultTransformer;
294+
if (transformer != null)
298295
{
299296
for (int i = 0; i < results.Count; i++)
300297
{
301-
var row = (Object[]) results[i];
302-
Object result = holderInstantiator.Instantiate(row);
298+
var row = (object[]) results[i];
299+
object result = transformer.TransformTuple(row, _queryReturnAliases);
303300
results[i] = result;
304301
}
305302

@@ -320,7 +317,7 @@ public override IList GetResultList(IList results, IResultTransformer resultTran
320317

321318
protected override IResultTransformer ResolveResultTransformer(IResultTransformer resultTransformer)
322319
{
323-
return HolderInstantiator.ResolveResultTransformer(_selectNewTransformer, resultTransformer);
320+
return _selectNewTransformer ?? resultTransformer;
324321
}
325322

326323
protected override object GetResultColumnOrRow(object[] row, IResultTransformer resultTransformer, DbDataReader rs,
@@ -426,11 +423,9 @@ internal IEnumerable GetEnumerable(QueryParameters queryParameters, IEventSource
426423
// This DbDataReader is disposed of in EnumerableImpl.Dispose
427424
var rs = GetResultSet(cmd, queryParameters, session, null);
428425

429-
HolderInstantiator hi =
430-
HolderInstantiator.GetHolderInstantiator(_selectNewTransformer, queryParameters.ResultTransformer, _queryReturnAliases);
431-
426+
var resultTransformer = _selectNewTransformer ?? queryParameters.ResultTransformer;
432427
IEnumerable result =
433-
new EnumerableImpl(rs, cmd, session, queryParameters.IsReadOnly(session), _queryTranslator.ReturnTypes, _queryTranslator.GetColumnNames(), queryParameters.RowSelection, hi);
428+
new EnumerableImpl(rs, cmd, session, queryParameters.IsReadOnly(session), _queryTranslator.ReturnTypes, _queryTranslator.GetColumnNames(), queryParameters.RowSelection, resultTransformer, _queryReturnAliases);
434429

435430
if (statsEnabled)
436431
{
@@ -452,5 +447,26 @@ protected override IEnumerable<IParameterSpecification> GetParameterSpecificatio
452447
{
453448
return _queryTranslator.CollectedParameterSpecifications;
454449
}
450+
451+
private static IResultTransformer GetSelectNewTransformer(SelectClause selectClause)
452+
{
453+
var constructor = selectClause.Constructor;
454+
if (constructor != null)
455+
{
456+
return new AliasToBeanConstructorResultTransformer(constructor);
457+
}
458+
459+
if (selectClause.IsMap)
460+
{
461+
return Transformers.AliasToEntityMap;
462+
}
463+
464+
if (selectClause.IsList)
465+
{
466+
return Transformers.ToList;
467+
}
468+
469+
return null;
470+
}
455471
}
456472
}

0 commit comments

Comments
 (0)