Skip to content

Commit 4c75002

Browse files
hazzikfredericDelaporte
authored andcommitted
Store the span for the parameter instead of actual collection
1 parent 6687043 commit 4c75002

File tree

4 files changed

+19
-54
lines changed

4 files changed

+19
-54
lines changed

src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,16 @@ private SqlString ExpandDynamicFilterParameters(SqlString sqlString, ICollection
151151
string parameterName = parts[1];
152152
var filter = (FilterImpl)enabledFilters[filterName];
153153

154-
var listValue = filter.GetParameterList(parameterName);
154+
var collectionSpan = filter.GetParameterSpan(parameterName);
155155
IType type = filter.FilterDefinition.GetParameterType(parameterName);
156156
int parameterColumnSpan = type.GetColumnSpan(session.Factory);
157-
int? collectionSpan = null;
158157

159158
// Add query chunk
160-
string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan).ToArray());
159+
string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan));
161160
string bindFragment;
162-
if (listValue != null && !type.ReturnedClass.IsArray)
161+
if (collectionSpan.HasValue && !type.ReturnedClass.IsArray)
163162
{
164-
collectionSpan = EnumerableHelper.Count(listValue);
165-
bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionSpan.Value).ToArray());
163+
bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionSpan.Value));
166164
}
167165
else
168166
{

src/NHibernate/Impl/FilterImpl.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections;
32
using NHibernate.Engine;
43
using NHibernate.Type;
54
using System.Collections.Generic;
@@ -17,7 +16,7 @@ public class FilterImpl : IFilter
1716
private FilterDefinition definition;
1817

1918
private readonly IDictionary<string, object> parameters = new Dictionary<string, object>();
20-
private readonly IDictionary<string, IEnumerable> _parameterLists = new Dictionary<string, IEnumerable>();
19+
private readonly Dictionary<string, int> _parameterSpans = new Dictionary<string, int>();
2120

2221
public void AfterDeserialize(FilterDefinition factoryDefinition)
2322
{
@@ -80,20 +79,17 @@ public IFilter SetParameter(string name, object value)
8079
/// <exception cref="ArgumentNullException">Thrown when <paramref name="name"/> or <paramref name="values"/> are <see langword="null" />.</exception>
8180
public IFilter SetParameterList<T>(string name, ICollection<T> values)
8281
{
82+
if (values == null)
83+
throw new ArgumentNullException(nameof(values), "Collection must be not null!");
84+
8385
var type = definition.GetParameterType(name);
8486
if (type == null)
85-
{
8687
throw new HibernateException("Undefined filter parameter [" + name + "]");
87-
}
8888

8989
if (!type.ReturnedClass.IsAssignableFrom(typeof(T)))
90-
{
9190
throw new HibernateException("Incorrect type for parameter [" + name + "]");
92-
}
9391

94-
_parameterLists[name] = values ??
95-
// This guarantees GetParameterList semantic.
96-
throw new ArgumentNullException(nameof(values), "Collection must be not null!");
92+
_parameterSpans[name] = values.Count;
9793
parameters[name] = values;
9894
return this;
9995
}
@@ -106,14 +102,15 @@ public object GetParameter(string name)
106102
}
107103

108104
/// <summary>
109-
/// Get a parameter list by name. <see langword="null" /> if there is no parameter list for that name.
105+
/// Get a span of collection parameter by name. <see langword="null" /> if the parameter is not a collectino or
106+
/// there is no such parameter exist.
110107
/// </summary>
111108
/// <param name="name">The parameter name.</param>
112-
/// <returns>The parameter list, or <see langword="null" /> if there is no parameter list for that name.</returns>
113-
public IEnumerable GetParameterList(string name)
109+
/// <returns>The parameter span, or <see langword="null" /> if the parameter is not a collectino or
110+
/// there is no such parameter exist.</returns>
111+
public int? GetParameterSpan(string name)
114112
{
115-
_parameterLists.TryGetValue(name, out var result);
116-
return result;
113+
return _parameterSpans.TryGetValue(name, out var result) ? result : default(int?);
117114
}
118115

119116
/// <summary>

src/NHibernate/Loader/Loader.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,18 +1857,16 @@ protected SqlString ExpandDynamicFilterParameters(SqlString sqlString, ICollecti
18571857
string parameterName = parts[1];
18581858
var filter = (FilterImpl)enabledFilters[filterName];
18591859

1860-
var listValue = filter.GetParameterList(parameterName);
1860+
int? collectionSpan = filter.GetParameterSpan(parameterName);
18611861
IType type = filter.FilterDefinition.GetParameterType(parameterName);
18621862
int parameterColumnSpan = type.GetColumnSpan(session.Factory);
1863-
int? collectionSpan = null;
18641863

18651864
// Add query chunk
1866-
string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan).ToArray());
1865+
string typeBindFragment = string.Join(", ", Enumerable.Repeat("?", parameterColumnSpan));
18671866
string bindFragment;
1868-
if (listValue != null && !type.ReturnedClass.IsArray)
1867+
if (collectionSpan.HasValue && !type.ReturnedClass.IsArray)
18691868
{
1870-
collectionSpan = EnumerableHelper.Count(listValue);
1871-
bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionSpan.Value).ToArray());
1869+
bindFragment = string.Join(", ", Enumerable.Repeat(typeBindFragment, collectionSpan.Value));
18721870
}
18731871
else
18741872
{

src/NHibernate/Util/EnumerableHelper.cs

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)