Skip to content

Commit 2bdf69b

Browse files
committed
separate acronym count and check
1 parent d9a4836 commit 2bdf69b

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

Flow.Launcher.Infrastructure/StringMatcher.cs

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption
7272
var fullStringToCompareWithoutCase = opt.IgnoreCase ? stringToCompare.ToLower() : stringToCompare;
7373
var queryWithoutCase = opt.IgnoreCase ? query.ToLower() : query;
7474

75-
var querySubstrings = queryWithoutCase.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
75+
var querySubstrings = queryWithoutCase.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
7676
int currentQuerySubstringIndex = 0;
7777
var currentQuerySubstring = querySubstrings[currentQuerySubstringIndex];
7878
var currentQuerySubstringCharacterIndex = 0;
@@ -92,7 +92,7 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption
9292
// If acronyms matching successfully finished, this gets the remaining not matched acronyms for score calculation
9393
if (currentAcronymQueryIndex >= query.Length && acronymsMatched == query.Length)
9494
{
95-
if (IsAcronym(stringToCompare, compareStringIndex))
95+
if (IsAcronymCount(stringToCompare, compareStringIndex))
9696
acronymsTotalCount++;
9797
continue;
9898
}
@@ -117,9 +117,11 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption
117117

118118
currentAcronymQueryIndex++;
119119
}
120+
}
120121

122+
if (IsAcronymCount(stringToCompare, compareStringIndex))
121123
acronymsTotalCount++;
122-
}
124+
123125
// Acronym end
124126

125127
if (allQuerySubstringsMatched || fullStringToCompareWithoutCase[compareStringIndex] !=
@@ -214,14 +216,46 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption
214216
}
215217

216218
private bool IsAcronym(string stringToCompare, int compareStringIndex)
219+
{
220+
if (IsAcronymChar(stringToCompare, compareStringIndex) || IsAcronymNumber(stringToCompare, compareStringIndex))
221+
return true;
222+
223+
return false;
224+
}
225+
226+
// When counting acronyms, treat a set of numbers as one acronym ie. Visual 2019 as 2 acronyms instead of 5
227+
private bool IsAcronymCount(string stringToCompare, int compareStringIndex)
228+
{
229+
if (IsAcronymChar(stringToCompare, compareStringIndex))
230+
return true;
231+
232+
if (char.IsNumber(stringToCompare[compareStringIndex]) || char.IsDigit(stringToCompare[compareStringIndex]))
233+
{
234+
return compareStringIndex switch
235+
{
236+
int i when i == 0 => true,
237+
int i when char.IsWhiteSpace(stringToCompare[i - 1]) => true,
238+
_ => false,
239+
};
240+
}
241+
242+
return false;
243+
}
244+
245+
private bool IsAcronymChar(string stringToCompare, int compareStringIndex)
217246
{
218247
if (char.IsUpper(stringToCompare[compareStringIndex]) ||
219-
char.IsNumber(stringToCompare[compareStringIndex]) ||
220-
char.IsDigit(stringToCompare[compareStringIndex]) ||
221-
compareStringIndex == 0) //0 index means char is the start of the compare string, which is an acronym
248+
compareStringIndex == 0 || //0 index means char is the start of the compare string, which is an acronym
249+
compareStringIndex != 0 && char.IsWhiteSpace(stringToCompare[compareStringIndex - 1]))
222250
return true;
223251

224-
if (compareStringIndex != 0 && char.IsWhiteSpace(stringToCompare[compareStringIndex - 1]))
252+
return false;
253+
}
254+
255+
private bool IsAcronymNumber(string stringToCompare, int compareStringIndex)
256+
{
257+
if (char.IsNumber(stringToCompare[compareStringIndex]) ||
258+
char.IsDigit(stringToCompare[compareStringIndex]))
225259
return true;
226260

227261
return false;

Flow.Launcher.Test/FuzzyMatcherTest.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,11 @@ public void WhenGivenQueryString_ThenShouldReturn_TheDesiredScoring(
163163
[TestCase("vs", VisualStudioCode, SearchPrecisionScore.Regular, true)]
164164
[TestCase("vc", VisualStudioCode, SearchPrecisionScore.Regular, true)]
165165
[TestCase("vts", VisualStudioCode, SearchPrecisionScore.Regular, false)]
166+
[TestCase("vcs", VisualStudioCode, SearchPrecisionScore.Regular, false)]
166167
[TestCase("wt", "Windows Terminal From Microsoft Store", SearchPrecisionScore.Regular, false)]
168+
[TestCase("vsp", "Visual Studio 2019 Preview", SearchPrecisionScore.Regular, true)]
169+
[TestCase("vsp", "2019 Visual Studio Preview", SearchPrecisionScore.Regular, true)]
170+
[TestCase("2019p", "Visual Studio 2019 Preview", SearchPrecisionScore.Regular, true)]
167171
public void WhenGivenDesiredPrecision_ThenShouldReturn_AllResultsGreaterOrEqual(
168172
string queryString,
169173
string compareString,

0 commit comments

Comments
 (0)