Skip to content

Commit 83e7c17

Browse files
committed
Added suggested optimizations and some more
1 parent 6bfe359 commit 83e7c17

File tree

4 files changed

+22
-13
lines changed

4 files changed

+22
-13
lines changed

src/NHibernate/Engine/Query/CallableParser.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ public static Detail Parse(string sqlString)
2121
{
2222
Detail callableDetail = new Detail();
2323

24-
callableDetail.IsCallable = sqlString.IndexOf('{') == 0 &&
25-
sqlString.IndexOf('}') == (sqlString.Length - 1) &&
26-
sqlString.IndexOf("call", StringComparison.Ordinal) > 0;
24+
int indexOfCall = -1;
25+
callableDetail.IsCallable = sqlString.Length > 5 && // to be able to check sqlString[0] we at least need to make sure that string has at least 1 character. The simplest case all other conditions are true is "{call}" which is 6 characters, so check it.
26+
sqlString[0] == '{' &&
27+
sqlString[sqlString.Length - 1] == '}' &&
28+
(indexOfCall = sqlString.IndexOf("call", StringComparison.Ordinal)) > 0;
2729

2830
if (!callableDetail.IsCallable)
2931
return callableDetail;
@@ -35,11 +37,11 @@ public static Detail Parse(string sqlString)
3537

3638
callableDetail.FunctionName = functionMatch.Groups[1].Value;
3739

38-
callableDetail.HasReturn = sqlString.IndexOf("call", StringComparison.Ordinal) > 0 &&
40+
callableDetail.HasReturn = indexOfCall > 0 &&
3941
sqlString.IndexOf('?') > 0 &&
4042
sqlString.IndexOf('=') > 0 &&
41-
sqlString.IndexOf('?') < sqlString.IndexOf("call", StringComparison.Ordinal) &&
42-
sqlString.IndexOf('=') < sqlString.IndexOf("call", StringComparison.Ordinal);
43+
sqlString.IndexOf('?') < indexOfCall &&
44+
sqlString.IndexOf('=') < indexOfCall;
4345

4446
return callableDetail;
4547
}

src/NHibernate/Engine/Query/ParameterParser.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ private ParameterParser()
4242
public static void Parse(string sqlString, IRecognizer recognizer)
4343
{
4444
// TODO: WTF? "CALL"... it may work for ORACLE but what about others RDBMS ? (by FM)
45-
bool hasMainOutputParameter = sqlString.IndexOf("call", StringComparison.Ordinal) > 0 &&
45+
var indexOfCall = sqlString.IndexOf("call", StringComparison.Ordinal);
46+
bool hasMainOutputParameter = indexOfCall > 0 &&
4647
sqlString.IndexOf('?') > 0 &&
4748
sqlString.IndexOf('=') > 0 &&
48-
sqlString.IndexOf('?') < sqlString.IndexOf("call", StringComparison.Ordinal) &&
49-
sqlString.IndexOf('=') < sqlString.IndexOf("call", StringComparison.Ordinal);
49+
sqlString.IndexOf('?') < indexOfCall &&
50+
sqlString.IndexOf('=') < indexOfCall;
5051
bool foundMainOutputParam = false;
5152

5253
int stringLength = sqlString.Length;
@@ -59,7 +60,7 @@ public static void Parse(string sqlString, IRecognizer recognizer)
5960
// check comments
6061
if (indx + 1 < stringLength && sqlString.Substring(indx,2) == "/*")
6162
{
62-
var closeCommentIdx = sqlString.IndexOf("*/", indx+2);
63+
var closeCommentIdx = sqlString.IndexOf("*/", indx + 2, StringComparison.Ordinal);
6364
recognizer.Other(sqlString.Substring(indx, (closeCommentIdx- indx)+2));
6465
indx = closeCommentIdx + 1;
6566
continue;
@@ -112,7 +113,7 @@ public static void Parse(string sqlString, IRecognizer recognizer)
112113
if (c == ':')
113114
{
114115
// named parameter
115-
int right = StringHelper.FirstIndexOfChar(sqlString, ParserHelper.HqlSeparators, indx + 1);
116+
int right = StringHelper.FirstIndexOfChar(sqlString, ParserHelper.HqlSeparatorsAsCharArray, indx + 1);
116117
int chopLocation = right < 0 ? sqlString.Length : right;
117118
string param = sqlString.Substring(indx + 1, chopLocation - (indx + 1));
118119
recognizer.NamedParameter(param, indx);
@@ -124,7 +125,7 @@ public static void Parse(string sqlString, IRecognizer recognizer)
124125
if (indx < stringLength - 1 && char.IsDigit(sqlString[indx + 1]))
125126
{
126127
// a peek ahead showed this as an ejb3-positional parameter
127-
int right = StringHelper.FirstIndexOfChar(sqlString, ParserHelper.HqlSeparators, indx + 1);
128+
int right = StringHelper.FirstIndexOfChar(sqlString, ParserHelper.HqlSeparatorsAsCharArray, indx + 1);
128129
int chopLocation = right < 0 ? sqlString.Length : right;
129130
string param = sqlString.Substring(indx + 1, chopLocation - (indx + 1));
130131
// make sure this "name" is an integral

src/NHibernate/Hql/ParserHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public static class ParserHelper
88
public const string HqlVariablePrefix = ":";
99

1010
public const string HqlSeparators = " \n\r\f\t,()=<>&|+-=/*'^![]#~\\;";
11+
internal static readonly char[] HqlSeparatorsAsCharArray = HqlSeparators.ToCharArray();
1112
//NOTICE: no " or . since they are part of (compound) identifiers
1213

1314
public const string Whitespace = " \n\r\f\t";

src/NHibernate/Util/StringHelper.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,12 @@ public static string[] Qualify(string prefix, string[] names)
548548

549549
public static int FirstIndexOfChar(string sqlString, string str, int startIndex)
550550
{
551-
return sqlString.IndexOfAny(str.ToCharArray(), startIndex);
551+
return FirstIndexOfChar(sqlString, str.ToCharArray(), startIndex);
552+
}
553+
554+
internal static int FirstIndexOfChar(string sqlString, char[] chars, int startIndex)
555+
{
556+
return sqlString.IndexOfAny(chars, startIndex);
552557
}
553558

554559
public static string Truncate(string str, int length)

0 commit comments

Comments
 (0)