Skip to content

Commit b7213eb

Browse files
hazzikfredericDelaporte
authored andcommitted
Optimize JoinWalker.WhereString method
1 parent ae4aed2 commit b7213eb

File tree

1 file changed

+74
-20
lines changed

1 file changed

+74
-20
lines changed

src/NHibernate/Loader/JoinWalker.cs

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -980,42 +980,96 @@ protected SqlStringBuilder WhereString(string alias, string[] columnNames, int b
980980
{
981981
// if not a composite key, use "foo in (?, ?, ?)" for batching
982982
// if no batch, and not a composite key, use "foo = ?"
983-
string tableAlias = GenerateAliasForColumn(alias, columnNames[0]);
984-
InFragment inf = new InFragment().SetColumn(tableAlias, columnNames[0]);
983+
var columnName = columnNames[0];
984+
985+
var tableAlias = GenerateAliasForColumn(alias, columnName);
986+
var qualifiedName = !string.IsNullOrEmpty(tableAlias)
987+
? tableAlias + StringHelper.Dot + columnName
988+
: columnName;
989+
990+
var whereString = new SqlStringBuilder(batchSize * 5);
991+
whereString.Add(qualifiedName);
992+
if (batchSize == 1)
993+
{
994+
whereString.Add("=").Add(Parameter.Placeholder);
995+
}
996+
else
997+
{
998+
bool added = false;
985999

986-
for (int i = 0; i < batchSize; i++)
987-
inf.AddValue(Parameter.Placeholder);
1000+
whereString.Add(" in (");
1001+
for (var i = 0; i < batchSize; i++)
1002+
{
1003+
var value = Parameter.Placeholder;
1004+
if (added)
1005+
{
1006+
whereString.Add(StringHelper.CommaSpace);
1007+
}
9881008

989-
return new SqlStringBuilder(inf.ToFragmentString());
1009+
whereString.Add(value);
1010+
1011+
added = true;
1012+
}
1013+
1014+
whereString.Add(StringHelper.ClosedParen);
1015+
}
1016+
1017+
return whereString;
9901018
}
9911019
else
9921020
{
993-
var fragments = new ConditionalFragment[batchSize];
994-
for (int i = 0; i < batchSize; i++)
995-
{
996-
fragments[i] = new ConditionalFragment()
997-
.SetTableAlias(alias)
998-
.SetCondition(columnNames, Parameter.GenerateParameters(columnNames.Length));
999-
}
1000-
1001-
var whereString = new SqlStringBuilder();
1002-
1003-
if (fragments.Length == 1)
1021+
if (batchSize == 1)
10041022
{
10051023
// if no batch, use "foo = ? and bar = ?"
1006-
whereString.Add(fragments[0].ToSqlStringFragment());
1024+
var whereString = new SqlStringBuilder(columnNames.Length * 4);
1025+
ColumnFragment(whereString, alias, columnNames);
1026+
return whereString;
10071027
}
10081028
else
10091029
{
10101030
// if batching, use "( (foo = ? and bar = ?) or (foo = ? and bar = ?) )"
1011-
var df = new DisjunctionFragment(fragments);
10121031

1032+
var whereString = new SqlStringBuilder();
10131033
whereString.Add(StringHelper.OpenParen);
1014-
whereString.Add(df.ToFragmentString());
1034+
1035+
var added = false;
1036+
for (var i = 0; i < batchSize; i++)
1037+
{
1038+
if (added)
1039+
{
1040+
whereString.Add(" or ");
1041+
}
1042+
1043+
whereString.Add("(");
1044+
ColumnFragment(whereString, alias, columnNames);
1045+
whereString.Add(")");
1046+
added = true;
1047+
}
10151048
whereString.Add(StringHelper.ClosedParen);
1049+
return whereString;
1050+
}
1051+
}
1052+
}
1053+
1054+
private static void ColumnFragment(SqlStringBuilder builder, string alias, string[] columnNames)
1055+
{
1056+
//foo = ? and bar = ?
1057+
var prefix = alias + StringHelper.Dot;
1058+
var added = false;
1059+
foreach (var columnName in columnNames)
1060+
{
1061+
if (added)
1062+
{
1063+
builder.Add(" and ");
10161064
}
10171065

1018-
return whereString;
1066+
builder
1067+
.Add(prefix)
1068+
.Add(columnName)
1069+
.Add("=")
1070+
.Add(Parameter.Placeholder);
1071+
1072+
added = true;
10191073
}
10201074
}
10211075

0 commit comments

Comments
 (0)