Finished voice work search provider implementation, and added several more tests.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user