Finished voice work search provider implementation, and added several more tests.

This commit is contained in:
2025-09-01 21:13:52 -04:00
parent a73a2ea1c9
commit cb15940d34
3 changed files with 629 additions and 25 deletions

View File

@@ -47,7 +47,7 @@ public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSea
filteredQuery = ApplyKeywordsFilter(filteredQuery, criteria);
filteredQuery = ApplyCircleStatusFilter(filteredQuery, criteria);
filteredQuery = ApplyTagStatusFilter(filteredQuery, criteria);
//filteredQuery = FilterCreatorStatus(filteredQuery, searchProperties.CreatorStatus, _voiceWorkContext);
filteredQuery = ApplyCreatorStatusFilter(filteredQuery, criteria);
filteredQuery = ApplyTagIdsFilter(filteredQuery, criteria);
filteredQuery = ApplyCreatorIdsFilter(filteredQuery, criteria);
@@ -175,6 +175,54 @@ public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSea
};
}
private IQueryable<VoiceWorkQuery> ApplyCreatorStatusFilter(IQueryable<VoiceWorkQuery> query, VoiceWorkSearchCriteria criteria)
{
if (criteria.CreatorStatus is null)
return query;
// Handy local predicates that translate to EXISTS subqueries
bool HasFav(int voiceWorkId) =>
context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == voiceWorkId && x.c.Favorite);
bool HasBlk(int voiceWorkId) =>
context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == voiceWorkId && x.c.Blacklisted);
return criteria.CreatorStatus switch
{
CreatorStatus.NotBlacklisted =>
query.Where(q => !context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == q.VoiceWork.VoiceWorkId && x.c.Blacklisted)),
CreatorStatus.Blacklisted =>
query.Where(q => context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == q.VoiceWork.VoiceWorkId && x.c.Blacklisted)),
CreatorStatus.FavoriteIncludeBlacklist =>
query.Where(q => context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == q.VoiceWork.VoiceWorkId && x.c.Favorite)),
CreatorStatus.FavoriteExcludeBlacklist =>
query.Where(q =>
context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == q.VoiceWork.VoiceWorkId && x.c.Favorite)
&&
!context.VoiceWorkCreators
.Join(context.Creators, vwc => vwc.CreatorId, c => c.CreatorId, (vwc, c) => new { vwc, c })
.Any(x => x.vwc.VoiceWorkId == q.VoiceWork.VoiceWorkId && x.c.Blacklisted)
),
_ => query
};
}
private IQueryable<VoiceWorkQuery> ApplyTagIdsFilter(IQueryable<VoiceWorkQuery> filteredQuery, VoiceWorkSearchCriteria criteria)
{
if (criteria.TagIds.Length == 0)