Skip to content

Commit 3041c49

Browse files
bahusoidhazzik
authored andcommitted
Optimize usages of SqlString.Append (#2166)
1 parent 4d0da00 commit 3041c49

12 files changed

+41
-25
lines changed

src/NHibernate/Criterion/Distinct.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ public Distinct(IProjection proj)
1717

1818
public virtual SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery)
1919
{
20-
return new SqlString("distinct ")
21-
.Append(projection.ToSqlString(criteria, position, criteriaQuery));
20+
return new SqlString("distinct ", projection.ToSqlString(criteria, position, criteriaQuery));
2221
}
2322

2423
public virtual SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
@@ -77,4 +76,4 @@ public override string ToString()
7776
return "distinct " + projection.ToString();
7877
}
7978
}
80-
}
79+
}

src/NHibernate/Criterion/Order.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,9 @@ public virtual SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteria
4040
{
4141
if (projection != null)
4242
{
43-
SqlString sb = SqlString.Empty;
44-
SqlString produced = this.projection.ToSqlString(criteria, 0, criteriaQuery);
43+
SqlString produced = projection.ToSqlString(criteria, 0, criteriaQuery);
4544
SqlString truncated = SqlStringHelper.RemoveAsAliasesFromSql(produced);
46-
sb = sb.Append(truncated);
47-
sb = sb.Append(ascending ? " asc" : " desc");
48-
return sb;
45+
return new SqlString(truncated, ascending ? " asc" : " desc");
4946
}
5047

5148
string[] columns = criteriaQuery.GetColumnAliasesUsingProjection(criteria, propertyName);

src/NHibernate/Criterion/SubqueryProjection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer
4242
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery)
4343
{
4444
return _subQuery.ToSqlString(criteria, criteriaQuery)
45-
.Append(new SqlString(" as y", loc.ToString(), "_"));
45+
.Append(" as y", loc.ToString(), "_");
4646
}
4747

4848
public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)

src/NHibernate/Dialect/PostgreSQL81Dialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public override SqlString AppendIdentitySelectToInsert(SqlString insertSql)
111111

112112
public override SqlString AppendIdentitySelectToInsert(SqlString insertString, string identifierColumnName)
113113
{
114-
return insertString.Append(" returning ").Append(identifierColumnName);
114+
return insertString.Append(" returning ", identifierColumnName);
115115
}
116116

117117
public override bool SupportsInsertSelectIdentity

src/NHibernate/Dialect/PostgreSQLDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public override string GetDropSequenceString(string sequenceName)
177177

178178
public override SqlString AddIdentifierOutParameterToInsert(SqlString insertString, string identifierColumnName, string parameterName)
179179
{
180-
return insertString.Append(" returning ").Append(identifierColumnName);
180+
return insertString.Append(" returning ", identifierColumnName);
181181
}
182182

183183
public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod

src/NHibernate/Driver/BasicResultSetsCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public BasicResultSetsCommand(ISessionImplementor session)
2222
{
2323
Commands = new List<ISqlCommand>();
2424
Session = session;
25-
_statementTerminator = session.Factory.Dialect.StatementTerminator.ToString();
25+
_statementTerminator = session.Factory.Dialect.StatementTerminator.ToString() + Environment.NewLine;
2626
}
2727

2828
protected List<ISqlCommand> Commands { get; private set; }
@@ -32,7 +32,7 @@ public BasicResultSetsCommand(ISessionImplementor session)
3232
public virtual void Append(ISqlCommand command)
3333
{
3434
Commands.Add(command);
35-
sqlString = sqlString.Append(command.Query).Append(_statementTerminator).Append(Environment.NewLine);
35+
sqlString = sqlString.Append(command.Query, _statementTerminator);
3636
}
3737

3838
public bool HasQueries

src/NHibernate/Engine/JoinSequence.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ internal virtual JoinFragment ToJoinFragment(
204204
{
205205
if (join.Alias.Equals(withClauseJoinAlias))
206206
{
207-
condition = condition.Append(" and ").Append(withClauseFragment);
207+
condition = condition.Append(" and ", withClauseFragment);
208208
}
209209
}
210210

src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,16 @@ internal override JoinFragment ToJoinFragment(
3030
{
3131
var joinFragment = new ANSIJoinFragment();
3232

33-
var on = withClauseFragment ?? new SqlString();
34-
var filters = _entityType.GetOnCondition(_tableAlias, Factory, enabledFilters);
35-
if (!string.IsNullOrEmpty(filters))
36-
{
37-
on.Append(" and ").Append(filters);
38-
}
33+
var on = withClauseFragment ?? SqlString.Empty;
34+
//Note: filters logic commented due to following issues
35+
//1) Original code is non functional as SqlString is immutable and so all Append results are lost. Correct code would look like: on = on.Append(filters);
36+
//2) Also it seems GetOnCondition always returns empty string for entity join (as IsReferenceToPrimaryKey is always true).
37+
// So if filters for entity join really make sense we need to inline GetOnCondition part that retrieves filters
38+
// var filters = _entityType.GetOnCondition(_tableAlias, Factory, enabledFilters);
39+
// if (!string.IsNullOrEmpty(filters))
40+
// {
41+
// on.Append(" and ").Append(filters);
42+
// }
3943
joinFragment.AddJoin(_tableName, _tableAlias, Array.Empty<string>(), Array.Empty<string>(), _joinType, on);
4044
return joinFragment;
4145
}

src/NHibernate/Loader/JoinWalker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ protected SqlString MergeOrderings(SqlString ass, SqlString orderBy)
805805
else if (orderBy.Length == 0)
806806
return ass;
807807
else
808-
return ass.Append(StringHelper.CommaSpace).Append(orderBy);
808+
return ass.Append(StringHelper.CommaSpace, orderBy);
809809
}
810810

811811
protected SqlString MergeOrderings(string ass, SqlString orderBy) {

src/NHibernate/Loader/OuterJoinableAssociation.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public OuterJoinableAssociation(IAssociationType joinableType, String lhsAlias,
4949
rhsColumns = JoinHelper.GetRHSColumnNames(joinableType, factory);
5050
on = new SqlString(joinableType.GetOnCondition(rhsAlias, factory, enabledFilters));
5151
if (SqlStringHelper.IsNotEmpty(withClause))
52-
on = on.Append(" and ( ").Append(withClause).Append(" )");
52+
on = on.Append(" and ( ", withClause, " )");
5353
this.enabledFilters = enabledFilters; // needed later for many-to-many/filter application
5454
}
5555

@@ -166,7 +166,7 @@ public void AddManyToManyJoin(JoinFragment outerjoin, IQueryableCollection colle
166166
SqlString condition = string.Empty.Equals(manyToManyFilter)
167167
? on
168168
: SqlStringHelper.IsEmpty(on) ? new SqlString(manyToManyFilter) :
169-
on.Append(" and ").Append(manyToManyFilter);
169+
on.Append(" and ", manyToManyFilter);
170170

171171
outerjoin.AddJoin(joinable.TableName, rhsAlias, lhsColumns, rhsColumns, joinType, condition);
172172
outerjoin.AddJoins(joinable.FromJoinFragment(rhsAlias, false, true),

src/NHibernate/SqlCommand/SqlString.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,23 @@ public SqlString Append(string text)
347347
{
348348
if (string.IsNullOrEmpty(text)) return this;
349349
if (_length == 0) return new SqlString(text);
350-
return new SqlString(new object[] { this, text });
350+
return new SqlString(this, text);
351+
}
352+
353+
public SqlString Append(params object[] parts)
354+
{
355+
return _length == 0
356+
? new SqlString(parts)
357+
: new SqlString(GetAppendParts(parts));
358+
}
359+
360+
private IEnumerable<object> GetAppendParts(object[] parts)
361+
{
362+
yield return this;
363+
foreach (var part in parts)
364+
{
365+
yield return part;
366+
}
351367
}
352368

353369
/// <summary>

src/NHibernate/SqlCommand/SqlUpdateBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ private void AddColumnWithValueOrType(string columnName, object valueOrType)
134134
public SqlUpdateBuilder AppendAssignmentFragment(SqlString fragment)
135135
{
136136
// SqlString is immutable
137-
assignments = assignments == null ? fragment : assignments.Append(", ").Append(fragment);
137+
assignments = assignments == null ? fragment : assignments.Append(", ", fragment);
138138
return this;
139139
}
140140

0 commit comments

Comments
 (0)