Skip to content

Commit 4c3fa06

Browse files
committed
CommandFactory Improvements
- string operation improvements
1 parent 70845b6 commit 4c3fa06

2 files changed

Lines changed: 24 additions & 28 deletions

File tree

Orm/Xtensive.Orm/Orm/Providers/CommandProcessing/CommandFactory.cs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ namespace Xtensive.Orm.Providers
1919
/// </summary>
2020
public class CommandFactory
2121
{
22-
private const string ParameterNameFormat = "{0}{1}";
23-
private const string RowFilterParameterNameFormat = "{0}_{1}_{2}";
2422
private const string DefaultParameterNamePrefix = "p0_";
2523
private const int LobBlockSize = ushort.MaxValue;
2624

@@ -58,7 +56,7 @@ public virtual IEnumerable<CommandPart> CreatePersistParts(SqlPersistTask task,
5856
foreach (var binding in request.ParameterBindings) {
5957
var parameterValue = GetParameterValue(task, binding);
6058
if (binding.BindingType==PersistParameterBindingType.VersionFilter && IsHandledLikeNull(parameterValue)) {
61-
configuration.AlternativeBranches.Add(binding);
59+
_ = configuration.AlternativeBranches.Add(binding);
6260
}
6361
else {
6462
var parameterName = GetParameterName(parameterNamePrefix, ref parameterIndex);
@@ -106,14 +104,14 @@ public virtual CommandPart CreateQueryPart(IQueryRequest request, string paramet
106104
case QueryParameterBindingType.SmartNull:
107105
// replacing "x = @p" with "x is null" when @p = null (or empty string in case of Oracle)
108106
if (IsHandledLikeNull(parameterValue)) {
109-
configuration.AlternativeBranches.Add(binding);
107+
_ = configuration.AlternativeBranches.Add(binding);
110108
continue;
111109
}
112110
break;
113111
case QueryParameterBindingType.BooleanConstant:
114112
// expanding true/false parameters to constants to help query optimizer with branching
115113
if ((bool) parameterValue)
116-
configuration.AlternativeBranches.Add(binding);
114+
_ = configuration.AlternativeBranches.Add(binding);
117115
continue;
118116
case QueryParameterBindingType.LimitOffset:
119117
// not parameter, just inlined constant
@@ -123,27 +121,28 @@ public virtual CommandPart CreateQueryPart(IQueryRequest request, string paramet
123121
// Like "LimitOffset" but we handle zero value specially
124122
// We replace value with 1 and activate special branch that evaluates "where" part to "false"
125123
var stringValue = parameterValue.ToString();
126-
if (stringValue=="0") {
124+
if (stringValue.Equals("0", StringComparison.Ordinal)) {
127125
configuration.PlaceholderValues.Add(binding, "1");
128-
configuration.AlternativeBranches.Add(binding);
126+
_ = configuration.AlternativeBranches.Add(binding);
129127
}
130-
else
128+
else {
131129
configuration.PlaceholderValues.Add(binding, stringValue);
130+
}
132131
continue;
133132
case QueryParameterBindingType.RowFilter:
134133
var filterData = (List<Tuple>) parameterValue;
135-
var rowTypeMapping = ((QueryRowFilterParameterBinding) binding).RowTypeMapping;
136-
if (filterData==null) {
137-
configuration.AlternativeBranches.Add(binding);
134+
if (filterData is null) {
135+
_ = configuration.AlternativeBranches.Add(binding);
138136
continue;
139137
}
138+
var rowTypeMapping = ((QueryRowFilterParameterBinding) binding).RowTypeMapping;
140139
var commonPrefix = GetParameterName(parameterNamePrefix, ref parameterIndex);
141-
var filterValues = new List<string[]>();
142-
for (int tupleIndex = 0; tupleIndex < filterData.Count; tupleIndex++) {
140+
var filterValues = new List<string[]>(filterData.Count);
141+
for (int tupleIndex = 0, overallCount = filterData.Count; tupleIndex < overallCount; tupleIndex++) {
143142
var tuple = filterData[tupleIndex];
144143
var parameterReferences = new string[tuple.Count];
145-
for (int fieldIndex = 0; fieldIndex < tuple.Count; fieldIndex++) {
146-
var name = string.Format(RowFilterParameterNameFormat, commonPrefix, tupleIndex, fieldIndex);
144+
for (int fieldIndex = 0, fieldCount = tuple.Count; fieldIndex < fieldCount; fieldIndex++) {
145+
var name = $"{commonPrefix}_{tupleIndex.ToString("G")}_{fieldIndex.ToString("G")}";
147146
var value = tuple.GetValueOrDefault(fieldIndex);
148147
parameterReferences[fieldIndex] = Driver.BuildParameterReference(name);
149148
AddRegularParameter(result, rowTypeMapping[fieldIndex], name, value);
@@ -156,7 +155,7 @@ public virtual CommandPart CreateQueryPart(IQueryRequest request, string paramet
156155
throw new ArgumentOutOfRangeException("binding.BindingType");
157156
}
158157
// regular case -> just adding the parameter
159-
string parameterName = GetParameterName(parameterNamePrefix, ref parameterIndex);
158+
var parameterName = GetParameterName(parameterNamePrefix, ref parameterIndex);
160159
configuration.PlaceholderValues.Add(binding, Driver.BuildParameterReference(parameterName));
161160
AddParameter(result, binding, parameterName, parameterValue);
162161
}
@@ -183,12 +182,12 @@ private static object GetParameterValue(QueryParameterBinding binding, Parameter
183182
private object GetParameterValue(SqlPersistTask task, PersistParameterBinding binding)
184183
{
185184
switch (binding.BindingType) {
186-
case PersistParameterBindingType.Regular:
187-
return task.Tuple.GetValueOrDefault(binding.FieldIndex);
188-
case PersistParameterBindingType.VersionFilter:
189-
return task.OriginalTuple.GetValueOrDefault(binding.FieldIndex);
190-
default:
191-
throw new ArgumentOutOfRangeException("binding.Source");
185+
case PersistParameterBindingType.Regular:
186+
return task.Tuple.GetValueOrDefault(binding.FieldIndex);
187+
case PersistParameterBindingType.VersionFilter:
188+
return task.OriginalTuple.GetValueOrDefault(binding.FieldIndex);
189+
default:
190+
throw new ArgumentOutOfRangeException("binding.Source");
192191
}
193192
}
194193

@@ -262,7 +261,7 @@ private void AddParameter(
262261

263262
private string GetParameterName(string prefix, ref int index)
264263
{
265-
var result = string.Format(ParameterNameFormat, prefix, index);
264+
var result = $"{prefix}{index.ToString("G")}"; //leave ToString(). it is faster
266265
index++;
267266
return result;
268267
}

Orm/Xtensive.Orm/Orm/Providers/CommandProcessing/CursorCommandFactory.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@ namespace Xtensive.Orm.Providers
1616
/// </summary>
1717
public class CursorCommandFactory : CommandFactory
1818
{
19-
private const string CursorParameterNameFormat = "{0}c";
20-
private const string StatementFormat = "OPEN :{0} FOR {1}";
21-
2219
public override CommandPart CreateQueryPart(IQueryRequest request, string parameterNamePrefix, ParameterContext parameterContext)
2320
{
2421
var part = base.CreateQueryPart(request, parameterNamePrefix, parameterContext);
25-
var parameterName = string.Format(CursorParameterNameFormat, parameterNamePrefix);
26-
part.Statement = string.Format(StatementFormat, parameterName, part.Statement);
22+
var parameterName = $"{parameterNamePrefix}c";
23+
part.Statement = $"OPEN :{parameterName} FOR {part.Statement}";
2724
var parameter = Connection.CreateCursorParameter();
2825
parameter.ParameterName = parameterName;
2926
part.Parameters.Add(parameter);

0 commit comments

Comments
 (0)