示例#1
0
        public static IQueryable <Song> OrderBy(this IQueryable <Song> query, SongSortRule sortRule,
                                                ContentLanguagePreference languagePreference = ContentLanguagePreference.Default, int tagId = 0)
        {
            switch (sortRule)
            {
            case SongSortRule.Name:
                return(query.OrderByEntryName(languagePreference));

            case SongSortRule.AdditionDate:
                return(query.OrderByDescending(a => a.CreateDate));

            case SongSortRule.FavoritedTimes:
                return(query.OrderByDescending(a => a.FavoritedTimes));

            case SongSortRule.PublishDate:
                return(query.OrderByPublishDate(SortDirection.Descending));

            case SongSortRule.RatingScore:
                return(query.OrderByDescending(a => a.RatingScore));

            case SongSortRule.TagUsageCount:
                return(query.OrderByTagUsage(tagId));
            }

            return(query);
        }
示例#2
0
 public FavoriteSongs(UserContract user, SongVoteRating rating, SongSortRule sort, bool groupByRating)
     : this()
 {
     GroupByRating = groupByRating;
     Rating        = rating;
     Sort          = sort;
     User          = user;
 }
示例#3
0
 public FavoriteSongs(UserContract user, SongVoteRating rating, SongSortRule? sort, bool? groupByRating)
     : this()
 {
     GroupByRating = groupByRating;
     Rating = rating;
     Sort = sort;
     User = user;
 }
示例#4
0
        public PartialFindResult <SongForApiContract> GetList(
            string query               = "",
            string songTypes           = null,
            [FromUri] string[] tagName = null,
            [FromUri] int[] tagId      = null,
            bool childTags             = false,
            [FromUri] int[] artistId   = null,
            ArtistAlbumParticipationStatus artistParticipationStatus = ArtistAlbumParticipationStatus.Everything,
            bool childVoicebanks            = false,
            bool includeMembers             = false,
            bool onlyWithPvs                = false,
            [FromUri] PVServices?pvServices = null,
            int?since            = null,
            int?minScore         = null,
            int?userCollectionId = null,
            int?releaseEventId   = null,
            EntryStatus?status   = null,
            [FromUri] AdvancedSearchFilter[] advancedFilters = null,
            int start                      = 0, int maxResults = defaultMax, bool getTotalCount = false,
            SongSortRule sort              = SongSortRule.Name,
            bool preferAccurateMatches     = false,
            NameMatchMode nameMatchMode    = NameMatchMode.Exact,
            SongOptionalFields fields      = SongOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            var textQuery = SearchTextQuery.Create(query, nameMatchMode);
            var types     = EnumVal <SongType> .ParseMultiple(songTypes);

            var param = new SongQueryParams(textQuery, types, start, Math.Min(maxResults, absoluteMax), getTotalCount, sort, false, preferAccurateMatches, null)
            {
                ArtistParticipation =
                {
                    ArtistIds       = artistId,
                    Participation   = artistParticipationStatus,
                    ChildVoicebanks = childVoicebanks,
                    IncludeMembers  = includeMembers
                },
                TagIds             = tagId,
                Tags               = tagName,
                ChildTags          = childTags,
                OnlyWithPVs        = onlyWithPvs,
                TimeFilter         = since.HasValue ? TimeSpan.FromHours(since.Value) : TimeSpan.Zero,
                MinScore           = minScore ?? 0,
                PVServices         = pvServices,
                UserCollectionId   = userCollectionId ?? 0,
                ReleaseEventId     = releaseEventId ?? 0,
                AdvancedFilters    = advancedFilters,
                LanguagePreference = lang
            };

            param.Common.EntryStatus = status;

            var artists = service.Find(s => new SongForApiContract(s, null, lang, fields), param);

            return(artists);
        }
示例#5
0
        /// <param name="query">Query search string. Can be null or empty, in which case no filtering by name is done.</param>
        /// <param name="songTypes">Allowed song types. Can be null or empy, in which case no filtering by song type is done.</param>
        /// <param name="start">0-based order number of the first item to be returned.</param>
        /// <param name="maxResults">Maximum number of results to be returned.</param>
        /// <param name="getTotalCount">Whether to return the total number of entries matching the criteria.</param>
        /// <param name="nameMatchMode">Mode for name maching. Ignored when query string is null or empty.</param>
        /// <param name="sortRule">Sort rule for results.</param>
        /// <param name="onlyByName">Whether to search items only by name, and not for example NicoId. Ignored when query string is null or empty.</param>
        /// <param name="moveExactToTop">Whether to move exact match to the top of search results.</param>
        /// <param name="ignoredIds">List of entries to be ignored. Can be null in which case no filtering is done.</param>
        public SongQueryParams(SearchTextQuery textQuery, SongType[] songTypes, int start, int maxResults,
                               bool getTotalCount, SongSortRule sortRule,
                               bool onlyByName, bool moveExactToTop, int[] ignoredIds)
        {
            Common = new CommonSearchParams(textQuery, onlyByName, moveExactToTop);
            Paging = new PagingProperties(start, maxResults, getTotalCount);

            SongTypes   = songTypes;
            SortRule    = sortRule;
            IgnoredIds  = ignoredIds;
            TimeFilter  = TimeSpan.Zero;
            OnlyWithPVs = false;
        }
示例#6
0
        /// <param name="query">Query search string. Can be null or empty, in which case no filtering by name is done.</param>
        /// <param name="songTypes">Allowed song types. Can be null or empy, in which case no filtering by song type is done.</param>
        /// <param name="start">0-based order number of the first item to be returned.</param>
        /// <param name="maxResults">Maximum number of results to be returned.</param>
        /// <param name="draftsOnly">Whether to return only entries with a draft status.</param>
        /// <param name="getTotalCount">Whether to return the total number of entries matching the criteria.</param>
        /// <param name="nameMatchMode">Mode for name maching. Ignored when query string is null or empty.</param>
        /// <param name="sortRule">Sort rule for results.</param>
        /// <param name="onlyByName">Whether to search items only by name, and not for example NicoId. Ignored when query string is null or empty.</param>
        /// <param name="moveExactToTop">Whether to move exact match to the top of search results.</param>
        /// <param name="ignoredIds">List of entries to be ignored. Can be null in which case no filtering is done.</param>
        public SongQueryParams(string query, SongType[] songTypes, int start, int maxResults,
            bool draftsOnly, bool getTotalCount, NameMatchMode nameMatchMode, SongSortRule sortRule,
            bool onlyByName, bool moveExactToTop, int[] ignoredIds)
        {
            Common = new CommonSearchParams(query, draftsOnly, nameMatchMode, onlyByName, moveExactToTop);
            Paging = new PagingProperties(start, maxResults, getTotalCount);

            SongTypes = songTypes;
            SortRule = sortRule;
            IgnoredIds = ignoredIds;
            TimeFilter = TimeSpan.Zero;
            OnlyWithPVs = false;
        }
示例#7
0
        /// <param name="query">Query search string. Can be null or empty, in which case no filtering by name is done.</param>
        /// <param name="songTypes">Allowed song types. Can be null or empy, in which case no filtering by song type is done.</param>
        /// <param name="start">0-based order number of the first item to be returned.</param>
        /// <param name="maxResults">Maximum number of results to be returned.</param>
        /// <param name="draftsOnly">Whether to return only entries with a draft status.</param>
        /// <param name="getTotalCount">Whether to return the total number of entries matching the criteria.</param>
        /// <param name="nameMatchMode">Mode for name maching. Ignored when query string is null or empty.</param>
        /// <param name="sortRule">Sort rule for results.</param>
        /// <param name="onlyByName">Whether to search items only by name, and not for example NicoId. Ignored when query string is null or empty.</param>
        /// <param name="moveExactToTop">Whether to move exact match to the top of search results.</param>
        /// <param name="ignoredIds">List of entries to be ignored. Can be null in which case no filtering is done.</param>
        public SongQueryParams(string query, SongType[] songTypes, int start, int maxResults,
                               bool draftsOnly, bool getTotalCount, NameMatchMode nameMatchMode, SongSortRule sortRule,
                               bool onlyByName, bool moveExactToTop, int[] ignoredIds)
        {
            Common = new CommonSearchParams(query, draftsOnly, nameMatchMode, onlyByName, moveExactToTop);
            Paging = new PagingProperties(start, maxResults, getTotalCount);

            ArtistParticipationStatus = ArtistAlbumParticipationStatus.Everything;
            SongTypes   = songTypes;
            SortRule    = sortRule;
            IgnoredIds  = ignoredIds;
            TimeFilter  = TimeSpan.Zero;
            OnlyWithPVs = false;
        }
示例#8
0
文件: Index.cs 项目: sethura/vocadb
 public Index(PartialFindResult <SongWithAlbumAndPVsContract> result, string filter, NameMatchMode nameMatchMode, SongType songType, string timeFilter, bool onlyWithPVs,
              SongSortRule sortRule, SongViewMode viewMode,
              bool draftsOnly, int page, int pageSize, IndexRouteParams routeParams)
 {
     ArtistId   = routeParams.artistId ?? 0;
     DraftsOnly = draftsOnly;
     Songs      = new StaticPagedList <SongWithAlbumAndPVsContract>(result.Items,
                                                                    page, pageSize, result.TotalCount);
     Filter        = filter;
     NameMatchMode = nameMatchMode;
     SongType      = songType;
     Since         = timeFilter;
     OnlyWithPVs   = onlyWithPVs;
     Sort          = sortRule;
     ViewMode      = viewMode;
     RouteParams   = routeParams;
 }
示例#9
0
 public Index(PartialFindResult<SongWithAlbumAndPVsContract> result, string filter, NameMatchMode nameMatchMode, SongType songType, string timeFilter, bool onlyWithPVs, 
     SongSortRule sortRule, SongViewMode viewMode,
     bool draftsOnly, int page, int pageSize, IndexRouteParams routeParams)
 {
     ArtistId = routeParams.artistId ?? 0;
     DraftsOnly = draftsOnly;
     Songs = new StaticPagedList<SongWithAlbumAndPVsContract>(result.Items,
         page, pageSize, result.TotalCount);
     Filter = filter;
     NameMatchMode = nameMatchMode;
     SongType = songType;
     Since = timeFilter;
     OnlyWithPVs = onlyWithPVs;
     Sort = sortRule;
     ViewMode = viewMode;
     RouteParams = routeParams;
 }
示例#10
0
        public PartialFindResult <SongForApiContract> GetList(
            string query     = "",
            string songTypes = null,
            string tag       = null,
            int?artistId     = null,
            ArtistAlbumParticipationStatus artistParticipationStatus = ArtistAlbumParticipationStatus.Everything,
            bool childVoicebanks            = false,
            bool onlyWithPvs                = false,
            [FromUri] PVServices?pvServices = null,
            int?since    = null,
            int?minScore = null,
            [FromUri] ContentLanguageSelections?lyrics = null,
            int?userCollectionId           = null,
            EntryStatus?status             = null,
            int start                      = 0, int maxResults = defaultMax, bool getTotalCount = false,
            SongSortRule sort              = SongSortRule.Name,
            bool preferAccurateMatches     = false,
            NameMatchMode nameMatchMode    = NameMatchMode.Exact,
            SongOptionalFields fields      = SongOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            var textQuery = SearchTextQuery.Create(query, nameMatchMode);
            var types     = EnumVal <SongType> .ParseMultiple(songTypes);

            var param = new SongQueryParams(textQuery, types, start, Math.Min(maxResults, absoluteMax), false, getTotalCount, sort, false, preferAccurateMatches, null)
            {
                Tag         = tag,
                OnlyWithPVs = onlyWithPvs,
                ArtistId    = artistId ?? 0,
                ArtistParticipationStatus = artistParticipationStatus,
                ChildVoicebanks           = childVoicebanks,
                TimeFilter      = since.HasValue ? TimeSpan.FromHours(since.Value) : TimeSpan.Zero,
                LyricsLanguages = lyrics != null?lyrics.Value.ToIndividualSelections().ToArray() : null,
                                      MinScore         = minScore ?? 0,
                                      PVServices       = pvServices,
                                      UserCollectionId = userCollectionId ?? 0
            };

            param.Common.EntryStatus = status;

            var artists = service.Find(s => new SongForApiContract(s, null, lang, fields), param);

            return(artists);
        }
示例#11
0
        public static IQueryable <Song> AddOrder(this IQueryable <Song> criteria, SongSortRule sortRule, ContentLanguagePreference languagePreference)
        {
            switch (sortRule)
            {
            case SongSortRule.Name:
                return(criteria.AddNameOrder(languagePreference));

            case SongSortRule.AdditionDate:
                return(criteria.OrderByDescending(a => a.CreateDate));

            case SongSortRule.FavoritedTimes:
                return(criteria.OrderByDescending(a => a.FavoritedTimes));

            case SongSortRule.RatingScore:
                return(criteria.OrderByDescending(a => a.RatingScore));
            }

            return(criteria);
        }
示例#12
0
        public PartialFindResult <SongForApiContract> GetList(
            string query       = "",
            SongType songTypes = SongType.Unspecified,
            string tag         = null,
            int?artistId       = null,
            ArtistAlbumParticipationStatus artistParticipationStatus = ArtistAlbumParticipationStatus.Everything,
            bool childVoicebanks = false,
            bool onlyWithPvs     = false,
            int?since            = null,
            [FromUri] ContentLanguageSelections?lyrics = null,
            int?userCollectionId           = null,
            EntryStatus?status             = null,
            int start                      = 0, int maxResults = defaultMax, bool getTotalCount = false,
            SongSortRule sort              = SongSortRule.Name,
            NameMatchMode nameMatchMode    = NameMatchMode.Exact,
            SongOptionalFields fields      = SongOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            query = FindHelpers.GetMatchModeAndQueryForSearch(query, ref nameMatchMode);
            var types = songTypes != SongType.Unspecified ? new[] { songTypes } : new SongType[0];

            var param = new SongQueryParams(query, types, start, Math.Min(maxResults, absoluteMax), false, getTotalCount, nameMatchMode, sort, false, false, null)
            {
                Tag         = tag,
                OnlyWithPVs = onlyWithPvs,
                ArtistId    = artistId ?? 0,
                ArtistParticipationStatus = artistParticipationStatus,
                ChildVoicebanks           = childVoicebanks,
                TimeFilter      = since.HasValue ? TimeSpan.FromHours(since.Value) : TimeSpan.Zero,
                LyricsLanguages = lyrics != null?lyrics.Value.ToIndividualSelections().ToArray() : null,
                                      UserCollectionId = userCollectionId ?? 0
            };

            param.Common.EntryStatus = status;

            var artists = service.Find(s => new SongForApiContract(s, null, lang, fields), param);

            return(artists);
        }
示例#13
0
        public static IQueryable <T> OrderBy <T>(this IQueryable <T> query, SongSortRule sortRule, ContentLanguagePreference languagePreference)
            where T : ISongLink
        {
            switch (sortRule)
            {
            case SongSortRule.Name:
                return(query.OrderBySongName(languagePreference));

            case SongSortRule.AdditionDate:
                return(query.OrderByDescending(a => a.Song.CreateDate));

            case SongSortRule.FavoritedTimes:
                return(query.OrderByDescending(a => a.Song.FavoritedTimes));

            case SongSortRule.RatingScore:
                return(query.OrderByDescending(a => a.Song.RatingScore));

            case SongSortRule.PublishDate:
                return(query.OrderByDescending(a => a.Song.PublishDate.DateTime));
            }

            return(query);
        }
示例#14
0
        public PartialFindResult<SongForApiContract> GetList(
            string query = "",
            SongType songTypes = SongType.Unspecified,
            string tag = null,
            int? artistId = null,
            ArtistAlbumParticipationStatus artistParticipationStatus = ArtistAlbumParticipationStatus.Everything,
            bool childVoicebanks = false,
            bool onlyWithPvs = false,
            int? since = null,
            [FromUri] ContentLanguageSelections? lyrics = null,
            int? userCollectionId = null,
            EntryStatus? status = null,
            int start = 0, int maxResults = defaultMax, bool getTotalCount = false,
            SongSortRule sort = SongSortRule.Name,
            NameMatchMode nameMatchMode = NameMatchMode.Exact,
            SongOptionalFields fields = SongOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            query = FindHelpers.GetMatchModeAndQueryForSearch(query, ref nameMatchMode);
            var types = songTypes != SongType.Unspecified ? new[] { songTypes } : new SongType[0];

            var param = new SongQueryParams(query, types, start, Math.Min(maxResults, absoluteMax), false, getTotalCount, nameMatchMode, sort, false, false, null) {
                Tag = tag,
                OnlyWithPVs = onlyWithPvs,
                ArtistId = artistId ?? 0,
                ArtistParticipationStatus = artistParticipationStatus,
                ChildVoicebanks = childVoicebanks,
                TimeFilter = since.HasValue ? TimeSpan.FromHours(since.Value) : TimeSpan.Zero,
                LyricsLanguages = lyrics != null ? lyrics.Value.ToIndividualSelections().ToArray() : null,
                UserCollectionId = userCollectionId ?? 0
            };
            param.Common.EntryStatus = status;

            var artists = service.Find(s => new SongForApiContract(s, null, lang, fields), param);

            return artists;
        }
示例#15
0
        public ActionResult FavoriteSongsPaged(int id, int? page, SongVoteRating? rating = null, SongSortRule sort = SongSortRule.Name, bool groupByRating = true)
        {
            const int songsPerPage = 50;

            var pageIndex = (page - 1) ?? 0;
            var r = rating ?? SongVoteRating.Nothing;
            var queryParams = new RatedSongQueryParams(id, PagingProperties.CreateFromPage(pageIndex, songsPerPage, true)) { FilterByRating = r, SortRule = sort, GroupByRating = groupByRating };
            var result = Service.GetFavoriteSongs(queryParams);
            var data = new PagingData<FavoriteSongForUserContract>(result.Items.ToPagedList(pageIndex, songsPerPage, result.TotalCount), id, "FavoriteSongs", "ui-tabs-3");
            data.RouteValues = new RouteValueDictionary(new { action = "FavoriteSongs", id, rating, sort, groupByRating });

            return PartialView("FavoriteSongsPaged", data);
        }
示例#16
0
 public ActionResult FavoriteSongs(int id, int? page, SongVoteRating? rating = null, SongSortRule sort = SongSortRule.Name, bool groupByRating = true)
 {
     if (Request.IsAjaxRequest()) {
         return FavoriteSongsPaged(id, page, rating, sort);
     } else {
         return View(new FavoriteSongs(Service.GetUser(id), rating ?? SongVoteRating.Nothing, sort, groupByRating));
     }
 }
示例#17
0
        public PartialFindResult<RatedSongForUserForApiContract> GetRatedSongs(
            int userId,
            string query = "",
            string tag = null,
            int? artistId = null,
            bool childVoicebanks = false,
            SongVoteRating? rating = null,
            int? songListId = null,
            bool groupByRating = true,
            int start = 0, int maxResults = defaultMax, bool getTotalCount = false,
            SongSortRule? sort = null,
            NameMatchMode nameMatchMode = NameMatchMode.Auto,
            SongOptionalFields fields = SongOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            maxResults = Math.Min(maxResults, absoluteMax);
            query = FindHelpers.GetMatchModeAndQueryForSearch(query, ref nameMatchMode);

            var queryParams = new RatedSongQueryParams(userId, new PagingProperties(start, maxResults, getTotalCount)) {
                Query = query,
                NameMatchMode = nameMatchMode,
                SortRule = sort ?? SongSortRule.Name,
                ArtistId = artistId ?? 0,
                ChildVoicebanks = childVoicebanks,
                FilterByRating = rating ?? SongVoteRating.Nothing,
                GroupByRating = groupByRating,
                SonglistId = songListId ?? 0,
                Tag = tag
            };

            var songs = queries.GetRatedSongs(queryParams, ratedSong => new RatedSongForUserForApiContract(ratedSong, lang, fields));
            return songs;
        }
示例#18
0
 public static IQueryable <Song> OrderBy(this IQueryable <Song> criteria, SongSortRule sortRule, ContentLanguagePreference languagePreference)
 {
     return(AddOrder(criteria, sortRule, languagePreference));
 }
示例#19
0
 public static IQueryable <Song> OrderBy(this IQueryable <Song> query, SongSortRule sortRule,
                                         ContentLanguagePreference languagePreference = ContentLanguagePreference.Default, int tagId = 0) => sortRule switch
 {
示例#20
0
        public ActionResult FavoriteSongs(int id = invalidId, int? page = null, SongVoteRating? rating = null, SongSortRule? sort = null, bool? groupByRating = null)
        {
            if (id == invalidId)
                return NoId();

            return View(new FavoriteSongs(Service.GetUser(id), rating ?? SongVoteRating.Nothing, sort, groupByRating));
        }
示例#21
0
        public ActionResult FavoriteSongsPaged(int id, int?page, SongVoteRating?rating = null, SongSortRule sort = SongSortRule.Name, bool groupByRating = true)
        {
            const int songsPerPage = 50;

            var pageIndex   = (page - 1) ?? 0;
            var r           = rating ?? SongVoteRating.Nothing;
            var queryParams = new RatedSongQueryParams(id, PagingProperties.CreateFromPage(pageIndex, songsPerPage, true))
            {
                FilterByRating = r, SortRule = sort, GroupByRating = groupByRating
            };
            var result = Service.GetFavoriteSongs(queryParams);
            var data   = new PagingData <FavoriteSongForUserContract>(result.Items.ToPagedList(pageIndex, songsPerPage, result.TotalCount), id, "FavoriteSongs", "ui-tabs-3");

            data.RouteValues = new RouteValueDictionary(new { action = "FavoriteSongs", id, rating, sort, groupByRating });

            return(PartialView("FavoriteSongsPaged", data));
        }
示例#22
0
 public ActionResult FavoriteSongs(int id, int?page, SongVoteRating?rating = null, SongSortRule sort = SongSortRule.Name, bool groupByRating = true)
 {
     if (Request.IsAjaxRequest())
     {
         return(FavoriteSongsPaged(id, page, rating, sort));
     }
     else
     {
         return(View(new FavoriteSongs(Service.GetUser(id), rating ?? SongVoteRating.Nothing, sort, groupByRating)));
     }
 }