[parsing] Add note visibility search query type (ISH-707)

This commit is contained in:
Laura Hausmann 2025-03-04 23:06:09 +01:00
parent fe24a11ca8
commit 4a4c674776
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
3 changed files with 57 additions and 2 deletions

View file

@ -35,6 +35,7 @@ public static class QueryableFtsExtensions
InstanceFilter instanceFilter => current.ApplyInstanceFilter(instanceFilter, config), InstanceFilter instanceFilter => current.ApplyInstanceFilter(instanceFilter, config),
MentionFilter mentionFilter => current.ApplyMentionFilter(mentionFilter, config, db), MentionFilter mentionFilter => current.ApplyMentionFilter(mentionFilter, config, db),
MiscFilter miscFilter => current.ApplyMiscFilter(miscFilter, user), MiscFilter miscFilter => current.ApplyMiscFilter(miscFilter, user),
VisibilityFilter visibilityFilter => current.ApplyVisibilityFilter(visibilityFilter),
ReplyFilter replyFilter => current.ApplyReplyFilter(replyFilter, config, db), ReplyFilter replyFilter => current.ApplyReplyFilter(replyFilter, config, db),
CwFilter cwFilter => current.ApplyCwFilter(cwFilter, caseSensitivity, matchType), CwFilter cwFilter => current.ApplyCwFilter(cwFilter, caseSensitivity, matchType),
WordFilter wordFilter => current.ApplyWordFilter(wordFilter, caseSensitivity, matchType), WordFilter wordFilter => current.ApplyWordFilter(wordFilter, caseSensitivity, matchType),
@ -163,6 +164,22 @@ public static class QueryableFtsExtensions
}; };
} }
private static IQueryable<Note> ApplyVisibilityFilter(this IQueryable<Note> query, VisibilityFilter filter)
{
var visibility = filter.Value switch
{
VisibilityFilterType.Public => Note.NoteVisibility.Public,
VisibilityFilterType.Home => Note.NoteVisibility.Home,
VisibilityFilterType.Followers => Note.NoteVisibility.Followers,
VisibilityFilterType.Specified => Note.NoteVisibility.Specified,
_ => throw new ArgumentOutOfRangeException()
};
return filter.Negated
? query.Where(p => p.Visibility != visibility)
: query.Where(p => p.Visibility == visibility);
}
[SuppressMessage("ReSharper", "EntityFramework.UnsupportedServerSideFunctionCall", Justification = "Projectables")] [SuppressMessage("ReSharper", "EntityFramework.UnsupportedServerSideFunctionCall", Justification = "Projectables")]
private static IQueryable<Note> ApplyFollowersFilter(this IQueryable<Note> query, User user, bool negated) private static IQueryable<Note> ApplyFollowersFilter(this IQueryable<Note> query, User user, bool negated)
=> query.Where(p => negated ? !p.User.IsFollowing(user) : p.User.IsFollowing(user)); => query.Where(p => negated ? !p.User.IsFollowing(user) : p.User.IsFollowing(user));

View file

@ -131,6 +131,43 @@ public record AfterFilter(DateOnly Value) : ISearchQueryFilter;
public record BeforeFilter(DateOnly Value) : ISearchQueryFilter; public record BeforeFilter(DateOnly Value) : ISearchQueryFilter;
public enum VisibilityFilterType
{
Public,
Home,
Followers,
Specified
}
public record VisibilityFilter(bool Negated, VisibilityFilterType Value) : ISearchQueryFilter
{
public static bool TryParse(
bool negated, ReadOnlySpan<char> value, [NotNullWhen(true)] out VisibilityFilter? result
)
{
VisibilityFilterType? type = value switch
{
"public" => VisibilityFilterType.Public,
"home" => VisibilityFilterType.Home,
"unlisted" => VisibilityFilterType.Home,
"followers" => VisibilityFilterType.Followers,
"specified" => VisibilityFilterType.Specified,
"direct" => VisibilityFilterType.Specified,
"private" => VisibilityFilterType.Specified,
_ => null
};
if (!type.HasValue)
{
result = null;
return false;
}
result = new VisibilityFilter(negated, type.Value);
return true;
}
}
public enum CaseFilterType public enum CaseFilterType
{ {
Sensitive, Sensitive,

View file

@ -84,6 +84,7 @@ public static class SearchQueryParser
"filter" when MiscFilter.TryParse(negated, value, out var parsed) => parsed, "filter" when MiscFilter.TryParse(negated, value, out var parsed) => parsed,
"in" when InFilter.TryParse(negated, value, out var parsed) => parsed, "in" when InFilter.TryParse(negated, value, out var parsed) => parsed,
"visibility" when VisibilityFilter.TryParse(negated, value, out var parsed) => parsed,
"has" or "attachment" or "attached" when AttachmentFilter.TryParse(negated, value, out var parsed) "has" or "attachment" or "attached" when AttachmentFilter.TryParse(negated, value, out var parsed)
=> parsed, => parsed,