mirror of
https://github.com/ppy/osu.git
synced 2026-06-03 13:44:34 +08:00
Fix FilterCriteria only being able to support one tag filter at once
Other textual keyword filters also worked like that, wherein if you did `artist=a artist=b` the second filter would overwrite the second, but in those cases the query is against a single field, so attempting to put multiple search criteria in conjunction on a single field is kind of nonsensical, so it was sort of fine to do that. Which is not the case for user tags, which are multi-valued.
This commit is contained in:
@@ -84,12 +84,17 @@ namespace osu.Game.Screens.Select.Carousel
|
||||
match &= !criteria.DifficultyName.HasFilter || criteria.DifficultyName.Matches(BeatmapInfo.DifficultyName);
|
||||
match &= !criteria.Source.HasFilter || criteria.Source.Matches(BeatmapInfo.Metadata.Source);
|
||||
|
||||
if (criteria.UserTag.HasFilter)
|
||||
if (criteria.UserTags.Any())
|
||||
{
|
||||
bool anyTagMatched = false;
|
||||
foreach (string tag in BeatmapInfo.Metadata.UserTags)
|
||||
anyTagMatched |= criteria.UserTag.Matches(tag);
|
||||
match &= anyTagMatched;
|
||||
foreach (var tagFilter in criteria.UserTags)
|
||||
{
|
||||
bool anyTagMatched = false;
|
||||
|
||||
foreach (string tag in BeatmapInfo.Metadata.UserTags)
|
||||
anyTagMatched |= tagFilter.Matches(tag);
|
||||
|
||||
match &= anyTagMatched;
|
||||
}
|
||||
}
|
||||
|
||||
match &= !criteria.UserStarDifficulty.HasFilter || criteria.UserStarDifficulty.IsInRange(BeatmapInfo.StarRating);
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace osu.Game.Screens.Select
|
||||
public OptionalTextFilter Title;
|
||||
public OptionalTextFilter DifficultyName;
|
||||
public OptionalTextFilter Source;
|
||||
public OptionalTextFilter UserTag;
|
||||
public List<OptionalTextFilter> UserTags = [];
|
||||
|
||||
public OptionalRange<double> UserStarDifficulty = new OptionalRange<double>
|
||||
{
|
||||
|
||||
@@ -117,7 +117,10 @@ namespace osu.Game.Screens.Select
|
||||
return TryUpdateCriteriaText(ref criteria.Source, op, value);
|
||||
|
||||
case "tag":
|
||||
return TryUpdateCriteriaText(ref criteria.UserTag, op, value);
|
||||
var tagFilter = new FilterCriteria.OptionalTextFilter();
|
||||
TryUpdateCriteriaText(ref tagFilter, op, value);
|
||||
criteria.UserTags.Add(tagFilter);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return criteria.RulesetCriteria?.TryParseCustomKeywordCriteria(key, op, value) ?? false;
|
||||
|
||||
@@ -103,12 +103,17 @@ namespace osu.Game.Screens.SelectV2
|
||||
match &= !criteria.DifficultyName.HasFilter || criteria.DifficultyName.Matches(beatmap.DifficultyName);
|
||||
match &= !criteria.Source.HasFilter || criteria.Source.Matches(beatmap.Metadata.Source);
|
||||
|
||||
if (criteria.UserTag.HasFilter)
|
||||
if (criteria.UserTags.Any())
|
||||
{
|
||||
bool anyTagMatched = false;
|
||||
foreach (string tag in beatmap.Metadata.UserTags)
|
||||
anyTagMatched |= criteria.UserTag.Matches(tag);
|
||||
match &= anyTagMatched;
|
||||
foreach (var tagFilter in criteria.UserTags)
|
||||
{
|
||||
bool anyTagMatched = false;
|
||||
|
||||
foreach (string tag in beatmap.Metadata.UserTags)
|
||||
anyTagMatched |= tagFilter.Matches(tag);
|
||||
|
||||
match &= anyTagMatched;
|
||||
}
|
||||
}
|
||||
|
||||
match &= !criteria.UserStarDifficulty.HasFilter || criteria.UserStarDifficulty.IsInRange(beatmap.StarRating);
|
||||
|
||||
Reference in New Issue
Block a user