|
|
|
|
@@ -18,15 +18,15 @@ public class VoiceWorkQuery
|
|
|
|
|
//public VoiceWorkSearch? VoiceWorkSearch { get; init; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class VoiceWorkSearchProvider(AppDbContext context) : SearchProvider<VoiceWorkSearchResult, VoiceWorkSearchCriteria, VoiceWorkSortField, VoiceWorkQuery>, IVoiceWorkSearchProvider
|
|
|
|
|
public class VoiceWorkSearchProvider(AppDbContext context, IVoiceWorkFullTextSearch fullTextSearch) : SearchProvider<VoiceWorkSearchResult, VoiceWorkSearchCriteria, VoiceWorkSortField, VoiceWorkQuery>, IVoiceWorkSearchProvider
|
|
|
|
|
{
|
|
|
|
|
protected override IQueryable<VoiceWorkQuery> GetBaseQuery()
|
|
|
|
|
{
|
|
|
|
|
return
|
|
|
|
|
from voiceWork in context.VoiceWorks
|
|
|
|
|
join englishVoiceWork in context.EnglishVoiceWorks on voiceWork.VoiceWorkId equals englishVoiceWork.VoiceWorkId into ps
|
|
|
|
|
from voiceWork in context.VoiceWorks.AsNoTracking()
|
|
|
|
|
join englishVoiceWork in context.EnglishVoiceWorks.AsNoTracking() on voiceWork.VoiceWorkId equals englishVoiceWork.VoiceWorkId into ps
|
|
|
|
|
from englishVoiceWork in ps.DefaultIfEmpty()
|
|
|
|
|
join circle in context.Circles on voiceWork.CircleId equals circle.CircleId into cs
|
|
|
|
|
join circle in context.Circles.AsNoTracking() on voiceWork.CircleId equals circle.CircleId into cs
|
|
|
|
|
from circle in cs.DefaultIfEmpty()
|
|
|
|
|
//join voiceWorkLocalization in context.VoiceWorkLocalizations on voiceWork.VoiceWorkId equals voiceWorkLocalization.VoiceWorkId into vwl
|
|
|
|
|
//from voiceWorkLocalization in vwl.DefaultIfEmpty()
|
|
|
|
|
@@ -44,10 +44,12 @@ public class VoiceWorkSearchProvider(AppDbContext context) : SearchProvider<Voic
|
|
|
|
|
{
|
|
|
|
|
IQueryable<VoiceWorkQuery> filteredQuery = query;
|
|
|
|
|
|
|
|
|
|
// TODO: Full Text Search implementation
|
|
|
|
|
//filteredQuery = FuzzyKeywordSearch(filteredQuery, searchProperties.Keywords);
|
|
|
|
|
//filteredQuery = FuzzyTitleSearch(filteredQuery, searchProperties.Title);
|
|
|
|
|
//filteredQuery = FuzzyCircleSearch(filteredQuery, searchProperties.Circle);
|
|
|
|
|
filteredQuery = ApplyKeywordsFilter(filteredQuery, criteria);
|
|
|
|
|
filteredQuery = ApplyCircleStatusFilter(filteredQuery, criteria);
|
|
|
|
|
filteredQuery = ApplyTagStatusFilter(filteredQuery, criteria);
|
|
|
|
|
//filteredQuery = FilterCreatorStatus(filteredQuery, searchProperties.CreatorStatus, _voiceWorkContext);
|
|
|
|
|
filteredQuery = ApplyTagIdsFilter(filteredQuery, criteria);
|
|
|
|
|
filteredQuery = ApplyCreatorIdsFilter(filteredQuery, criteria);
|
|
|
|
|
|
|
|
|
|
switch (criteria.SaleStatus)
|
|
|
|
|
{
|
|
|
|
|
@@ -86,25 +88,43 @@ public class VoiceWorkSearchProvider(AppDbContext context) : SearchProvider<Voic
|
|
|
|
|
if (criteria.MaxDownloads is not null)
|
|
|
|
|
filteredQuery = filteredQuery.Where(x => x.VoiceWork.Downloads <= criteria.MaxDownloads.Value);
|
|
|
|
|
|
|
|
|
|
return filteredQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<VoiceWorkQuery> ApplyKeywordsFilter(IQueryable<VoiceWorkQuery> query, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrWhiteSpace(criteria.Keywords))
|
|
|
|
|
return query;
|
|
|
|
|
|
|
|
|
|
var voiceWorkIds = fullTextSearch.MatchingIds(context, criteria.Keywords);
|
|
|
|
|
|
|
|
|
|
return query.Where(x => voiceWorkIds.Contains(x.VoiceWork.VoiceWorkId));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<VoiceWorkQuery> ApplyCircleStatusFilter(IQueryable<VoiceWorkQuery> query, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
{
|
|
|
|
|
if (criteria.CircleStatus is null)
|
|
|
|
|
return query;
|
|
|
|
|
|
|
|
|
|
switch (criteria.CircleStatus)
|
|
|
|
|
{
|
|
|
|
|
case CircleStatus.NotBlacklisted:
|
|
|
|
|
filteredQuery = filteredQuery.Where(x => x.Circle.Blacklisted == false);
|
|
|
|
|
break;
|
|
|
|
|
case CircleStatus.Favorited:
|
|
|
|
|
filteredQuery = filteredQuery.Where(x => x.Circle.Favorite);
|
|
|
|
|
query = query.Where(q =>
|
|
|
|
|
!context.Circles.Any(c => c.CircleId == q.VoiceWork.CircleId && c.Blacklisted));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CircleStatus.Blacklisted:
|
|
|
|
|
filteredQuery = filteredQuery.Where(x => x.Circle.Blacklisted);
|
|
|
|
|
query = query.Where(q =>
|
|
|
|
|
context.Circles.Any(c => c.CircleId == q.VoiceWork.CircleId && c.Blacklisted));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CircleStatus.Favorited:
|
|
|
|
|
query = query.Where(q =>
|
|
|
|
|
context.Circles.Any(c => c.CircleId == q.VoiceWork.CircleId && c.Favorite));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
filteredQuery = ApplyTagStatusFilter(filteredQuery, criteria);
|
|
|
|
|
//filteredQuery = FilterCreatorStatus(filteredQuery, searchProperties.CreatorStatus, _voiceWorkContext);
|
|
|
|
|
filteredQuery = FilterTagIds(filteredQuery, criteria);
|
|
|
|
|
filteredQuery = FilterCreatorIds(filteredQuery, criteria);
|
|
|
|
|
|
|
|
|
|
return filteredQuery;
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<VoiceWorkQuery> ApplyTagStatusFilter(IQueryable<VoiceWorkQuery> query, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
@@ -155,7 +175,7 @@ public class VoiceWorkSearchProvider(AppDbContext context) : SearchProvider<Voic
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<VoiceWorkQuery> FilterTagIds(IQueryable<VoiceWorkQuery> filteredQuery, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
private IQueryable<VoiceWorkQuery> ApplyTagIdsFilter(IQueryable<VoiceWorkQuery> filteredQuery, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
{
|
|
|
|
|
if (criteria.TagIds.Length == 0)
|
|
|
|
|
return filteredQuery;
|
|
|
|
|
@@ -195,7 +215,7 @@ public class VoiceWorkSearchProvider(AppDbContext context) : SearchProvider<Voic
|
|
|
|
|
return filteredQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<VoiceWorkQuery> FilterCreatorIds(IQueryable<VoiceWorkQuery> filteredQuery, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
private IQueryable<VoiceWorkQuery> ApplyCreatorIdsFilter(IQueryable<VoiceWorkQuery> filteredQuery, VoiceWorkSearchCriteria criteria)
|
|
|
|
|
{
|
|
|
|
|
if (criteria.CreatorIds.Length == 0)
|
|
|
|
|
return filteredQuery;
|
|
|
|
|
|