Skip to content

Replace SafetyEnumerable<T> with OfType<T> where applicable #2368

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/NHibernate.Test/UtilityTest/SafetyEnumerableFixture.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using NHibernate.Util;
using NUnit.Framework;
Expand All @@ -7,6 +8,8 @@ namespace NHibernate.Test.UtilityTest
/// <summary>
/// Test cases for the <see cref="SafetyEnumerable{T}"/> class.
/// </summary>
// Since v5.3
[Obsolete("This class has no more usages and will be removed in a future version")]
[TestFixture]
public class SafetyEnumerableFixture
{
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public async Task<IEnumerable> PerformIterateAsync(QueryParameters queryParamete
public async Task<IEnumerable<T>> PerformIterateAsync<T>(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return new SafetyEnumerable<T>(await (PerformIterateAsync(queryParameters, session, cancellationToken)).ConfigureAwait(false));
return (await (PerformIterateAsync(queryParameters, session, cancellationToken)).ConfigureAwait(false)).CastOrDefault<T>();
}

public async Task<int> PerformExecuteUpdateAsync(QueryParameters queryParameters, ISessionImplementor session, CancellationToken cancellationToken)
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Cfg/XmlHbmBinding/RootClassBinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ private void BindNaturalId(HbmNaturalId naturalid, PersistentClass rootClass, ID
property.IsUpdateable = false;
property.IsNaturalIdentifier = true;

uk.AddColumns(property.ColumnIterator.OfType<Column>());
uk.AddColumns(property.ColumnIterator);
});

rootClass.Table.AddUniqueKey(uk);
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Engine/Query/HQLQueryPlan.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public IEnumerable PerformIterate(QueryParameters queryParameters, IEventSource

public IEnumerable<T> PerformIterate<T>(QueryParameters queryParameters, IEventSource session)
{
return new SafetyEnumerable<T>(PerformIterate(queryParameters, session));
return PerformIterate(queryParameters, session).CastOrDefault<T>();
}

public int PerformExecuteUpdate(QueryParameters queryParameters, ISessionImplementor session)
Expand Down
8 changes: 6 additions & 2 deletions src/NHibernate/Mapping/Constraint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,15 @@ public void AddColumns(IEnumerable<Column> columnIterator)
{
foreach (Column col in columnIterator)
{
if (!col.IsFormula)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsFormula is not virtual and always false for Column

AddColumn(col);
AddColumn(col);
}
}

public void AddColumns(IEnumerable<ISelectable> columnIterator)
{
AddColumns(columnIterator.OfType<Column>());
}

/// <summary>
/// Gets the number of columns that this Constraint contains.
/// </summary>
Expand Down
3 changes: 1 addition & 2 deletions src/NHibernate/Mapping/IdentifierCollection.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using NHibernate.Engine;
using NHibernate.Util;

namespace NHibernate.Mapping
{
Expand Down Expand Up @@ -40,7 +39,7 @@ public override void CreatePrimaryKey()
if (!IsOneToMany)
{
PrimaryKey pk = new PrimaryKey();
pk.AddColumns(new SafetyEnumerable<Column>(Identifier.ColumnIterator));
pk.AddColumns(Identifier.ColumnIterator);
CollectionTable.PrimaryKey = pk;
}
//else // Create an index on the key columns?
Expand Down
7 changes: 3 additions & 4 deletions src/NHibernate/Mapping/IndexedCollection.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using NHibernate.Engine;
using NHibernate.Util;

namespace NHibernate.Mapping
{
Expand Down Expand Up @@ -40,7 +39,7 @@ public override void CreatePrimaryKey()
if (!IsOneToMany)
{
PrimaryKey pk = new PrimaryKey();
pk.AddColumns(new SafetyEnumerable<Column>(Key.ColumnIterator));
pk.AddColumns(Key.ColumnIterator);

// index should be last column listed
bool isFormula = false;
Expand All @@ -52,11 +51,11 @@ public override void CreatePrimaryKey()
if (isFormula)
{
//if it is a formula index, use the element columns in the PK
pk.AddColumns(new SafetyEnumerable<Column>(Element.ColumnIterator));
pk.AddColumns(Element.ColumnIterator);
}
else
{
pk.AddColumns(new SafetyEnumerable<Column>(Index.ColumnIterator));
pk.AddColumns(Index.ColumnIterator);
}

CollectionTable.PrimaryKey = pk;
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Mapping/Join.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public void CreatePrimaryKey()
pk.Name = PK_ALIAS.ToAliasString(table.Name);
table.PrimaryKey = pk;

pk.AddColumns(Key.ColumnIterator.OfType<Column>());
pk.AddColumns(Key.ColumnIterator);
}

public int PropertySpan
Expand Down
4 changes: 2 additions & 2 deletions src/NHibernate/Mapping/ManyToOne.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using NHibernate.Type;
using NHibernate.Util;
using System;
using System.Linq;

namespace NHibernate.Mapping
{
Expand Down Expand Up @@ -77,7 +77,7 @@ public void CreatePropertyRefConstraints(IDictionary<string, PersistentClass> pe

if (!HasFormula && !"none".Equals(ForeignKeyName, StringComparison.OrdinalIgnoreCase))
{
IEnumerable<Column> ce = new SafetyEnumerable<Column>(property.ColumnIterator);
IEnumerable<Column> ce = property.ColumnIterator.OfType<Column>();

// NH : Ensure that related columns have same length
ForeignKey.AlignColumns(ConstraintColumns, ce);
Expand Down
8 changes: 3 additions & 5 deletions src/NHibernate/Mapping/OneToOne.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NHibernate.Type;
using NHibernate.Util;

Expand Down Expand Up @@ -40,10 +41,7 @@ public override void CreateForeignKey()
}

/// <summary></summary>
public override IEnumerable<Column> ConstraintColumns
{
get { return new SafetyEnumerable<Column>(identifier.ColumnIterator); }
}
public override IEnumerable<Column> ConstraintColumns => identifier.ColumnIterator.OfType<Column>();

/// <summary></summary>
public bool IsConstrained
Expand Down Expand Up @@ -103,4 +101,4 @@ public override IType Type
}
}
}
}
}
2 changes: 1 addition & 1 deletion src/NHibernate/Mapping/PersistentClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -761,7 +761,7 @@ public virtual void CreatePrimaryKey(Dialect.Dialect dialect)
pk.Name = PKAlias.ToAliasString(table.Name);
table.PrimaryKey = pk;

pk.AddColumns(new SafetyEnumerable<Column>(Key.ColumnIterator));
pk.AddColumns(Key.ColumnIterator);
}

/// <summary>
Expand Down
5 changes: 1 addition & 4 deletions src/NHibernate/Mapping/SimpleValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,7 @@ public SimpleValue(Table table)
this.table = table;
}

public virtual IEnumerable<Column> ConstraintColumns
{
get { return new SafetyEnumerable<Column>(columns); }
}
public virtual IEnumerable<Column> ConstraintColumns => columns.OfType<Column>();

public string ForeignKeyName
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,7 @@ public JoinedSubclassEntityPersister(PersistentClass persistentClass, ICacheConc
tables.Add(tabname);

var keyCols = new List<string>(idColumnSpan);
var enumerableKCols = new SafetyEnumerable<Column>(key.ColumnIterator);
foreach (var kcol in enumerableKCols)
foreach (var kcol in key.ColumnIterator.OfType<Column>())
keyCols.Add(kcol.GetQuotedName(factory.Dialect));

keyColumns.Add(keyCols.ToArray());
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/SqlCommand/SqlInsertBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ public SqlCommandInfo ToSqlCommandInfo()

public SqlType[] GetParametersTypeArray()
{
return new SafetyEnumerable<SqlType>(columns.Values).ToArray();
return columns.Values.OfType<SqlType>().ToArray();
}
}
}
3 changes: 2 additions & 1 deletion src/NHibernate/SqlCommand/SqlUpdateBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,8 @@ public SqlString ToSqlString()
public SqlCommandInfo ToSqlCommandInfo()
{
SqlString text = ToSqlString();
List<SqlType> parameterTypes = new List<SqlType>(new SafetyEnumerable<SqlType>(columns.Values));

var parameterTypes = columns.Values.OfType<SqlType>().ToList();
parameterTypes.AddRange(whereParameterTypes);
return new SqlCommandInfo(text, parameterTypes.ToArray());
}
Expand Down
10 changes: 10 additions & 0 deletions src/NHibernate/Util/EnumerableExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,5 +107,15 @@ internal static IReadOnlyList<T> EmptyIfNull<T>(this IReadOnlyList<T> list)
{
return list ?? Array.Empty<T>();
}

internal static IEnumerable<T> CastOrDefault<T>(this IEnumerable list)
{
foreach (var obj in list)
{
yield return obj == null
? default(T)
: (T) obj;
}
}
}
}
7 changes: 5 additions & 2 deletions src/NHibernate/Util/SafetyEnumerable.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;

Expand All @@ -7,6 +8,8 @@ namespace NHibernate.Util
/// Used to ensure a collection filtering a given IEnumerable by a certain type.
/// </summary>
/// <typeparam name="T">The type used like filter.</typeparam>
// Since v5.3
[Obsolete("This class has no more usages and will be removed in a future version")]
public class SafetyEnumerable<T> : IEnumerable<T>
{
/*
Expand All @@ -25,8 +28,8 @@ public IEnumerator<T> GetEnumerator()
{
if (element == null)
yield return default(T);
else if (element is T)
yield return (T) element;
else if (element is T elem)
yield return elem;
}
}

Expand Down