From bf99fc61b863761b08e40345fcbb8d8eb287a771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 27 Jun 2023 21:34:49 +0200 Subject: [PATCH] Trim full phrase filters in a more precise manner --- .../Filtering/FilterQueryParserTest.cs | 4 ++-- osu.Game/Screens/Select/FilterCriteria.cs | 20 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index be8b39b296..ce95e921b9 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -76,8 +76,8 @@ namespace osu.Game.Tests.NonVisual.Filtering Assert.AreEqual("\"!", filterCriteria.SearchText); Assert.AreEqual(1, filterCriteria.SearchTerms.Length); - Assert.That(filterCriteria.SearchTerms[0].SearchTerm, Is.EqualTo("\"!")); - Assert.That(filterCriteria.SearchTerms[0].MatchMode, Is.EqualTo(FilterCriteria.MatchMode.Substring)); + Assert.That(filterCriteria.SearchTerms[0].SearchTerm, Is.EqualTo("!")); + Assert.That(filterCriteria.SearchTerms[0].MatchMode, Is.EqualTo(FilterCriteria.MatchMode.IsolatedPhrase)); } /* diff --git a/osu.Game/Screens/Select/FilterCriteria.cs b/osu.Game/Screens/Select/FilterCriteria.cs index 36e048fd3d..ab4f85fc92 100644 --- a/osu.Game/Screens/Select/FilterCriteria.cs +++ b/osu.Game/Screens/Select/FilterCriteria.cs @@ -174,15 +174,19 @@ namespace osu.Game.Screens.Select { searchTerm = value; - if (searchTerm.EndsWith("\"!", StringComparison.Ordinal)) + if (searchTerm.StartsWith('\"')) { - searchTerm = searchTerm.Trim('!', '\"'); - MatchMode = MatchMode.FullPhrase; - } - else if (searchTerm.StartsWith('\"')) - { - searchTerm = searchTerm.Trim('\"'); - MatchMode = MatchMode.IsolatedPhrase; + // length check ensures that the quote character in the `StartsWith()` check above and the `EndsWith()` check below is not the same character. + if (searchTerm.EndsWith("\"!", StringComparison.Ordinal) && searchTerm.Length >= 3) + { + searchTerm = searchTerm.TrimEnd('!').Trim('\"'); + MatchMode = MatchMode.FullPhrase; + } + else + { + searchTerm = searchTerm.Trim('\"'); + MatchMode = MatchMode.IsolatedPhrase; + } } else MatchMode = MatchMode.Substring;