[parsing] Add note visibility search query type (ISH-707)
This commit is contained in:
parent
fe24a11ca8
commit
4a4c674776
3 changed files with 57 additions and 2 deletions
|
@ -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));
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue