Esempio n. 1
0
        public PartialFindResult <ArtistForApiContract> GetList(
            string query                   = "",
            string artistTypes             = null,
            string tag                     = null,
            int?followedByUserId           = null,
            EntryStatus?status             = null,
            int start                      = 0, int maxResults = defaultMax, bool getTotalCount = false,
            ArtistSortRule sort            = ArtistSortRule.Name,
            bool preferAccurateMatches     = false,
            NameMatchMode nameMatchMode    = NameMatchMode.Exact,
            ArtistOptionalFields fields    = ArtistOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            var textQuery = ArtistSearchTextQuery.Create(query, nameMatchMode);
            var types     = EnumVal <ArtistType> .ParseMultiple(artistTypes);

            var param = new ArtistQueryParams(textQuery, types, start, Math.Min(maxResults, absoluteMax), false, getTotalCount, sort, preferAccurateMatches)
            {
                Tag            = tag,
                UserFollowerId = followedByUserId ?? 0
            };

            param.Common.EntryStatus = status;

            var ssl     = WebHelper.IsSSL(Request);
            var artists = service.FindArtists(s => new ArtistForApiContract(s, lang, thumbPersister, ssl, fields), param);

            return(artists);
        }
Esempio n. 2
0
        public PartialFindResult <ArtistForUserForApiContract> GetFollowedArtists(
            int id,
            string query                   = "",
            [FromUri] int[] tagId          = null,
            ArtistType artistType          = ArtistType.Unknown,
            int start                      = 0,
            int maxResults                 = defaultMax,
            bool getTotalCount             = false,
            ArtistSortRule sort            = ArtistSortRule.Name,
            NameMatchMode nameMatchMode    = NameMatchMode.Auto,
            ArtistOptionalFields fields    = ArtistOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            maxResults = Math.Min(maxResults, absoluteMax);
            var textQuery = ArtistSearchTextQuery.Create(query, nameMatchMode);

            var queryParams = new FollowedArtistQueryParams {
                UserId     = id,
                ArtistType = artistType,
                Paging     = new PagingProperties(start, maxResults, getTotalCount),
                SortRule   = sort,
                TagIds     = tagId,
                TextQuery  = textQuery
            };

            var artists = queries.GetArtists(queryParams, afu =>
                                             new ArtistForUserForApiContract(afu, lang, thumbPersister, fields));

            return(artists);
        }
Esempio n. 3
0
        public string[] FindNames(SearchTextQuery textQuery, int maxResults)
        {
            if (textQuery.IsEmpty)
            {
                return new string[] {}
            }
            ;

            var artistTextQuery = ArtistSearchTextQuery.Create(textQuery);
            var tagTextQuery    = TagSearchTextQuery.Create(textQuery);

            return(HandleQuery(session => {
                var artistNames = session.Query <ArtistName>()
                                  .WhereArtistNameIs(artistTextQuery)
                                  .Where(a => !a.Artist.Deleted)
                                  .Select(n => n.Value)
                                  .OrderBy(n => n)
                                  .Distinct()
                                  .Take(maxResults)
                                  .ToArray();

                var albumNames = session.Query <AlbumName>()
                                 .WhereEntryNameIs(textQuery)
                                 .Where(a => !a.Album.Deleted)
                                 .Select(n => n.Value)
                                 .OrderBy(n => n)
                                 .Distinct()
                                 .Take(maxResults)
                                 .ToArray();

                var songNames = session.Query <SongName>()
                                .WhereEntryNameIs(textQuery)
                                .Where(a => !a.Song.Deleted)
                                .Select(n => n.Value)
                                .OrderBy(n => n)
                                .Distinct()
                                .Take(maxResults)
                                .ToArray();

                var tagNames = session.Query <TagName>()
                               .WhereEntryNameIs(tagTextQuery)
                               .Where(a => !a.Entry.Deleted)
                               .Select(t => t.Value)
                               .OrderBy(t => t)
                               .Take(maxResults)
                               .ToArray();

                var allNames = artistNames
                               .Concat(albumNames)
                               .Concat(songNames)
                               .Concat(tagNames)
                               .Distinct()
                               .OrderBy(n => n)
                               .Take(maxResults)
                               .ToArray();

                return NameHelper.MoveExactNamesToTop(allNames, textQuery.Query);
            }));
        }
Esempio n. 4
0
        public ArtistDetailsContract GetArtistDetails(string term)
        {
            var artists = artistService.FindArtists(new ArtistQueryParams(ArtistSearchTextQuery.Create(term), new ArtistType[] {}, 0, 10,
                                                                          false, ArtistSortRule.Name, true));

            if (!artists.Items.Any())
            {
                return(null);
            }

            return(artistQueries.GetDetails(artists.Items[0].Id));
        }
Esempio n. 5
0
        public void Find_ByTwitter()
        {
            var result = artistSearch.Find(new ArtistQueryParams {
                Common =
                {
                    TextQuery = ArtistSearchTextQuery.Create("https://twitter.com/XenonP_XM")
                }
            });

            Assert.AreEqual(1, result.Items.Length, "Got 1 result");
            Assert.AreEqual("XenonP", result.Items[0].DefaultName, "Result as expected");
        }
Esempio n. 6
0
        public void Find_ByTwitter_EndsWithP()
        {
            var artist = db.Save(CreateEntry.Artist(ArtistType.Producer, name: "Uji"));

            db.SaveNames(artist);
            db.Save(artist.CreateWebLink("Twitter", "https://twitter.com/Uji_RaychoruiP", WebLinkCategory.Official));

            var result = artistSearch.Find(new ArtistQueryParams {
                Common =
                {
                    TextQuery = ArtistSearchTextQuery.Create("https://twitter.com/Uji_RaychoruiP")
                }
            });

            Assert.AreEqual(1, result.Items.Length, "Got 1 result");
            Assert.AreEqual("Uji", result.Items[0].DefaultName, "Result as expected");
        }
Esempio n. 7
0
        public string[] FindNames(ArtistSearchTextQuery textQuery, int maxResults)
        {
            if (textQuery.IsEmpty)
            {
                return new string[] {}
            }
            ;

            return(HandleQuery(session => {
                var names = session.Query <ArtistName>()
                            .Where(a => !a.Artist.Deleted)
                            .WhereArtistNameIs(textQuery)
                            .Select(n => n.Value)
                            .OrderBy(n => n)
                            .Distinct()
                            .Take(maxResults)
                            .ToArray();

                return NameHelper.MoveExactNamesToTop(names, textQuery.Query);
            }));
        }
Esempio n. 8
0
        public ActionResult ByName(string query, ContentLanguagePreference?lang, int?start, int?maxResults, NameMatchMode?nameMatchMode,
                                   string callback, DataFormat format = DataFormat.Auto)
        {
            if (string.IsNullOrEmpty(query))
            {
                return(Object(new PartialFindResult <SongForApiContract>(), format, callback));
            }

            var param = new ArtistQueryParams(ArtistSearchTextQuery.Create(query, nameMatchMode ?? NameMatchMode.Exact), new ArtistType[] { }, 0, defaultMax, false, true, ArtistSortRule.Name, false);

            if (start.HasValue)
            {
                param.Paging.Start = start.Value;
            }

            if (maxResults.HasValue)
            {
                param.Paging.MaxEntries = Math.Min(maxResults.Value, defaultMax);
            }

            var songs = Service.FindArtists(s => new ArtistForApiContractOld(s, null, lang ?? ContentLanguagePreference.Default), param);

            return(Object(songs, format, callback));
        }
Esempio n. 9
0
        public PartialFindResult <ArtistForApiContract> GetList(
            string query             = "",
            string artistTypes       = null,
            bool allowBaseVoicebanks = true,
            [FromQuery(Name = "tagName[]")] string[] tagName = null,
            [FromQuery(Name = "tagId[]")] int[] tagId        = null,
            bool childTags       = false,
            int?followedByUserId = null,
            EntryStatus?status   = null,
            [FromQuery(Name = "advancedFilters")] AdvancedSearchFilterParams[] advancedFilters = null,
            int start                      = 0, int maxResults = DefaultMax, bool getTotalCount = false,
            ArtistSortRule sort            = ArtistSortRule.Name,
            bool preferAccurateMatches     = false,
            NameMatchMode nameMatchMode    = NameMatchMode.Exact,
            ArtistOptionalFields fields    = ArtistOptionalFields.None,
            ContentLanguagePreference lang = ContentLanguagePreference.Default)
        {
            var textQuery = ArtistSearchTextQuery.Create(query, nameMatchMode);
            var types     = EnumVal <ArtistType> .ParseMultiple(artistTypes);

            var param = new ArtistQueryParams(textQuery, types, start, Math.Min(maxResults, AbsoluteMax), getTotalCount, sort, preferAccurateMatches)
            {
                Tags                = tagName,
                TagIds              = tagId,
                ChildTags           = childTags,
                UserFollowerId      = followedByUserId ?? 0,
                AllowBaseVoicebanks = allowBaseVoicebanks,
                AdvancedFilters     = advancedFilters?.Select(advancedFilter => advancedFilter.ToAdvancedSearchFilter()).ToArray(),
            };

            param.Common.EntryStatus = status;

            var artists = _service.FindArtists(s => new ArtistForApiContract(s, lang, _thumbPersister, fields), param);

            return(artists);
        }
Esempio n. 10
0
 public PartialFindResult <ArtistContract> FindArtists(string term, int maxResults, NameMatchMode nameMatchMode = NameMatchMode.Auto)
 {
     return(artistService.FindArtists(new ArtistQueryParams(ArtistSearchTextQuery.Create(term, nameMatchMode), new ArtistType[] {}, 0, maxResults, true, ArtistSortRule.Name, true)));
 }
Esempio n. 11
0
        private ActionResult TryRedirect(string filter, EntryType searchType)
        {
            var textQuery       = SearchTextQuery.Create(filter);
            var artistTextQuery = ArtistSearchTextQuery.Create(filter);

            switch (searchType)
            {
            case EntryType.Undefined:
            {
                var result = _entryQueries.GetList(filter, null, null, false, null, null, 0, 1, true, EntrySortRule.Name,
                                                   NameMatchMode.Auto, Model.DataContracts.Api.EntryOptionalFields.None, Model.Domain.Globalization.ContentLanguagePreference.Default,
                                                   searchTags: true, searchEvents: true);

                if (result.TotalCount == 1)
                {
                    var item    = result.Items.First();
                    var entryId = item.Id;

                    switch (item.EntryType)
                    {
                    case EntryType.Album:
                        return(RedirectToAlbum(entryId));

                    case EntryType.Artist:
                        return(RedirectToArtist(entryId));

                    case EntryType.ReleaseEvent:
                        return(RedirectToReleaseEvent(entryId, item.UrlSlug));

                    case EntryType.Song:
                        return(RedirectToSong(entryId));

                    case EntryType.Tag:
                        return(RedirectToTag(entryId, item.UrlSlug));
                    }
                }
            }
            break;

            case EntryType.Artist:
                var artist = _artistService.FindArtists(new ArtistQueryParams(artistTextQuery, null, 0, 2, false, ArtistSortRule.None, false)
                {
                    LanguagePreference = PermissionContext.LanguagePreference
                });
                if (artist.Items.Length == 1)
                {
                    return(RedirectToArtist(artist.Items[0].Id));
                }
                break;

            case EntryType.Album:
                var album = _albumService.Find(new AlbumQueryParams(textQuery, DiscType.Unknown, 0, 2, false, AlbumSortRule.None, false)
                {
                    LanguagePreference = PermissionContext.LanguagePreference
                });
                if (album.Items.Length == 1)
                {
                    return(RedirectToAlbum(album.Items[0].Id));
                }
                break;

            case EntryType.ReleaseEvent:
                var queryParams = new EventQueryParams
                {
                    TextQuery = textQuery,
                    Paging    = new PagingProperties(0, 2, false)
                };
                var ev = _eventQueries.Find(s => new { s.Id, s.UrlSlug }, queryParams);
                if (ev.Items.Length == 1)
                {
                    return(RedirectToReleaseEvent(ev.Items[0].Id, ev.Items[0].UrlSlug));
                }
                break;

            case EntryType.Song:
                var song = _songService.Find(new SongQueryParams(textQuery, null, 0, 2, false, SongSortRule.None, false, false, null)
                {
                    LanguagePreference = PermissionContext.LanguagePreference
                });
                if (song.Items.Length == 1)
                {
                    return(RedirectToSong(song.Items[0].Id));
                }
                break;

            case EntryType.SongList:
                var list = _songListQueries.Find(s => s.Id, new SongListQueryParams {
                    TextQuery = textQuery, Paging = new PagingProperties(0, 2, false), SortRule = SongListSortRule.Name
                });
                if (list.Items.Length == 1)
                {
                    return(RedirectToSongList(list.Items[0]));
                }
                return(RedirectToAction("Featured", "SongList"));

            case EntryType.Tag:
                var tags = _tagQueries.Find(new TagQueryParams(new CommonSearchParams(textQuery, true, true), PagingProperties.FirstPage(2))
                {
                    AllowChildren      = true,
                    LanguagePreference = PermissionContext.LanguagePreference
                }, TagOptionalFields.None, _permissionContext.LanguagePreference);
                if (tags.Items.Length == 1)
                {
                    return(RedirectToTag(tags.Items.First().Id, tags.Items.First().Name));
                }
                break;

            default:
            {
                var action     = "Index";
                var controller = searchType.ToString();
                return(RedirectToAction(action, controller, new { filter }));
            }
            }

            return(null);
        }
Esempio n. 12
0
        public AllEntriesSearchResult Find(string query, int maxResults, bool getTotalCount)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                return(new AllEntriesSearchResult());
            }

            var textQuery       = SearchTextQuery.Create(query);
            var artistTextQuery = ArtistSearchTextQuery.Create(query, textQuery.MatchMode);             // Can't use the existing words collection here as they are noncanonized
            var tagTextQuery    = TagSearchTextQuery.Create(query, textQuery.MatchMode);

            return(HandleQuery(session => {
                var artists =
                    session.Query <ArtistName>()
                    .FilterByArtistName(artistTextQuery)
                    .Where(a => !a.Artist.Deleted)
                    .Select(n => n.Artist)
                    .AddNameOrder(LanguagePreference)
                    .Distinct()
                    .Take(maxResults)
                    .ToArray();

                var artistCount = (getTotalCount ?
                                   session.Query <ArtistName>()
                                   .FilterByArtistName(artistTextQuery)
                                   .Where(a => !a.Artist.Deleted)
                                   .Select(n => n.Artist)
                                   .Distinct()
                                   .Count()
                                        : 0);

                var albums =
                    session.Query <AlbumName>()
                    .AddEntryNameFilter(textQuery)
                    .Where(a => !a.Album.Deleted)
                    .Select(n => n.Album)
                    .AddNameOrder(LanguagePreference)
                    .Distinct()
                    .Take(maxResults)
                    .ToArray();

                var albumCount = (getTotalCount ?
                                  session.Query <AlbumName>()
                                  .AddEntryNameFilter(textQuery)
                                  .Where(a => !a.Album.Deleted)
                                  .Select(n => n.Album)
                                  .Distinct()
                                  .Count()
                                        : 0);

                var songs =
                    session.Query <SongName>()
                    .AddEntryNameFilter(textQuery)
                    .Where(a => !a.Song.Deleted)
                    .Select(n => n.Song)
                    .AddNameOrder(LanguagePreference)
                    .Distinct()
                    .Take(maxResults)
                    .ToArray();

                var songCount = (getTotalCount ?
                                 session.Query <SongName>()
                                 .AddEntryNameFilter(textQuery)
                                 .Where(a => !a.Song.Deleted)
                                 .Select(n => n.Song)
                                 .Distinct()
                                 .Count()
                                        : 0);

                var tags = session.Query <Tag>()
                           .AddTagNameFilter(tagTextQuery)
                           .OrderBy(t => t.Name)
                           .Take(maxResults)
                           .ToArray();

                var tagCount = (getTotalCount ? session.Query <Tag>()
                                .AddTagNameFilter(tagTextQuery)
                                .Distinct()
                                .Count()
                                        : 0);

                var artistResult = new PartialFindResult <ArtistContract>(
                    artists.Select(a => new ArtistContract(a, PermissionContext.LanguagePreference)).ToArray(), artistCount);

                var albumResult = new PartialFindResult <AlbumContract>(
                    albums.Select(a => new AlbumContract(a, PermissionContext.LanguagePreference)).ToArray(), albumCount);

                var songResult = new PartialFindResult <SongWithAlbumContract>(
                    songs.Select(a => new SongWithAlbumContract(a, PermissionContext.LanguagePreference)).ToArray(), songCount);

                var tagResult = new PartialFindResult <TagContract>(
                    tags.Select(a => new TagContract(a)).ToArray(), tagCount);

                return new AllEntriesSearchResult(query, albumResult, artistResult, songResult, tagResult);
            }));
        }
 private IQueryable <ArtistName> FilterByArtistName(string artistName)
 {
     return(artists.AsQueryable().FilterByArtistName(ArtistSearchTextQuery.Create(artistName)));
 }
Esempio n. 14
0
        public static IQueryable <T> WhereArtistHasName <T>(this IQueryable <T> query, ArtistSearchTextQuery textQuery) where T : IArtistLink
        {
            if (textQuery == null || textQuery.IsEmpty)
            {
                return(query);
            }

            var nameFilter = textQuery.Query;

            switch (textQuery.MatchMode)
            {
            case NameMatchMode.Exact:
                return(query.Where(m => m.Artist.Names.Names.Any(n => n.Value == nameFilter)));

            case NameMatchMode.Partial:
                return(query.Where(m => m.Artist.Names.Names.Any(n => n.Value.Contains(nameFilter))));

            case NameMatchMode.StartsWith:
                return(query.Where(m => m.Artist.Names.Names.Any(n => n.Value.StartsWith(nameFilter))));

            case NameMatchMode.Words:
                return(textQuery.Words
                       .Take(FindHelpers.MaxSearchWords)
                       .Aggregate(query, (q, word) => q.Where(link => link.Artist.Names.Names.Any(n => n.Value.Contains(word)))));
            }

            return(query);
        }
Esempio n. 15
0
        /// <summary>
        /// Filters query by canonized artist name.
        /// This means that any P suffixes are ignored.
        /// </summary>
        /// <param name="query">Artist query. Cannot be null.</param>
        /// <param name="textQuery">Textual filter. Cannot be null.</param>
        /// <returns>Filtered query. Cannot be null.</returns>
        public static IQueryable <Artist> WhereHasName_Canonized(this IQueryable <Artist> query, ArtistSearchTextQuery textQuery)
        {
            if (textQuery.IsEmpty)
            {
                return(query);
            }

            var canonizedName = textQuery.Query;

            if (textQuery.IsExact)
            {
                return(query.Where(m => m.Names.Names.Any(n =>
                                                          n.Value == canonizedName ||
                                                          n.Value == string.Format("{0}P", canonizedName) ||
                                                          n.Value == string.Format("{0}-P", canonizedName))));
            }
            else
            {
                return(query.WhereHasName(textQuery));
            }
        }
Esempio n. 16
0
 public string[] GetNames(string query = "", NameMatchMode nameMatchMode = NameMatchMode.Auto, int maxResults = 15) => _service.FindNames(ArtistSearchTextQuery.Create(query, nameMatchMode), maxResults);
Esempio n. 17
0
        public PartialFindResult <EntryForApiContract> GetList(
            string query,
            string tag,
            EntryStatus?status,
            int start, int maxResults, bool getTotalCount,
            NameMatchMode nameMatchMode,
            EntryOptionalFields fields,
            ContentLanguagePreference lang,
            bool ssl
            )
        {
            var textQuery       = SearchTextQuery.Create(query, nameMatchMode);
            var artistTextQuery = ArtistSearchTextQuery.Create(query, textQuery.MatchMode);             // Can't use the existing words collection here as they are noncanonized

            return(repository.HandleQuery(ctx => {
                // Get all applicable names per entry type
                var artistNames = ctx.OfType <Artist>().Query()
                                  .Where(a => !a.Deleted)
                                  .WhereHasName_Canonized(artistTextQuery)
                                  .WhereHasTag(tag)
                                  .WhereStatusIs(status)
                                  .OrderBy(ArtistSortRule.Name, lang)
                                  .Take(start + maxResults)
                                  .SelectEntryBase(lang, EntryType.Artist)
                                  .ToArray();

                var albumNames = ctx.OfType <Album>().Query()
                                 .Where(a => !a.Deleted)
                                 .WhereHasName(textQuery)
                                 .WhereHasTag(tag)
                                 .WhereStatusIs(status)
                                 .OrderBy(AlbumSortRule.Name, lang)
                                 .Take(start + maxResults)
                                 .SelectEntryBase(lang, EntryType.Album)
                                 .ToArray();

                var songNames = ctx.OfType <Song>().Query()
                                .Where(a => !a.Deleted)
                                .WhereHasName(textQuery)
                                .WhereHasTag(tag)
                                .WhereStatusIs(status)
                                .OrderBy(SongSortRule.Name, lang)
                                .Take(start + maxResults)
                                .SelectEntryBase(lang, EntryType.Song)
                                .ToArray();

                // Get page of combined names
                var entryNames = artistNames.Concat(albumNames).Concat(songNames)
                                 .OrderBy(e => e.DefaultName)
                                 .Skip(start)
                                 .Take(maxResults)
                                 .ToArray();

                var artistIds = entryNames.Where(e => e.EntryType == EntryType.Artist).Select(a => a.Id).ToArray();
                var albumIds = entryNames.Where(e => e.EntryType == EntryType.Album).Select(a => a.Id).ToArray();
                var songIds = entryNames.Where(e => e.EntryType == EntryType.Song).Select(a => a.Id).ToArray();

                // Get the actual entries in the page
                var artists = artistIds.Any() ? ctx.OfType <Artist>().Query()
                              .Where(a => artistIds.Contains(a.Id))
                              .ToArray()
                              .Select(a => new EntryForApiContract(a, lang, entryThumbPersister, ssl, fields)) : new EntryForApiContract[0];

                var albums = albumIds.Any() ? ctx.OfType <Album>().Query()
                             .Where(a => albumIds.Contains(a.Id))
                             .ToArray()
                             .Select(a => new EntryForApiContract(a, lang, entryThumbPersister, ssl, fields)) : new EntryForApiContract[0];

                var songs = songIds.Any() ? ctx.OfType <Song>().Query()
                            .Where(a => songIds.Contains(a.Id))
                            .ToArray()
                            .Select(a => new EntryForApiContract(a, lang, fields)) : new EntryForApiContract[0];

                // Merge and sort the final list
                var entries = artists.Concat(albums).Concat(songs)
                              .OrderBy(a => a.Name);

                var count = 0;

                if (getTotalCount)
                {
                    count =
                        ctx.OfType <Artist>().Query()
                        .Where(a => !a.Deleted)
                        .WhereHasName_Canonized(artistTextQuery)
                        .WhereHasTag(tag)
                        .WhereStatusIs(status)
                        .Count() +
                        ctx.OfType <Album>().Query()
                        .Where(a => !a.Deleted)
                        .WhereHasName(textQuery)
                        .WhereHasTag(tag)
                        .WhereStatusIs(status)
                        .Count() +
                        ctx.OfType <Song>().Query()
                        .Where(a => !a.Deleted)
                        .WhereHasName(textQuery)
                        .WhereHasTag(tag)
                        .WhereStatusIs(status)
                        .Count();
                }

                return new PartialFindResult <EntryForApiContract>(entries.ToArray(), count);
            }));
        }
Esempio n. 18
0
        private ActionResult TryRedirect(string filter, EntryType searchType)
        {
            var textQuery       = SearchTextQuery.Create(filter);
            var artistTextQuery = ArtistSearchTextQuery.Create(filter);

            switch (searchType)
            {
            case EntryType.Undefined: {
                var result = entryQueries.GetList(filter, null, null, false, null, 0, 1, true, EntrySortRule.Name,
                                                  NameMatchMode.Auto, Model.DataContracts.Api.EntryOptionalFields.None, Model.Domain.Globalization.ContentLanguagePreference.Default, false, true);

                if (result.TotalCount == 1)
                {
                    var item      = result.Items.First();
                    var entryType = item.EntryType;
                    var entryId   = item.Id;

                    if (entryType == EntryType.Album)
                    {
                        return(RedirectToAlbum(entryId));
                    }

                    if (entryType == EntryType.Artist)
                    {
                        return(RedirectToArtist(entryId));
                    }

                    if (entryType == EntryType.Song)
                    {
                        return(RedirectToSong(entryId));
                    }

                    if (entryType == EntryType.Tag)
                    {
                        return(RedirectToTag(entryId, item.UrlSlug));
                    }
                }
            }
            break;

            case EntryType.Artist:
                var artist = artistService.FindArtists(new ArtistQueryParams(artistTextQuery, null, 0, 2, false, ArtistSortRule.None, false));
                if (artist.Items.Length == 1)
                {
                    return(RedirectToArtist(artist.Items[0].Id));
                }
                break;

            case EntryType.Album:
                var album = albumService.Find(new AlbumQueryParams(textQuery, DiscType.Unknown, 0, 2, false, AlbumSortRule.None, false));
                if (album.Items.Length == 1)
                {
                    return(RedirectToAlbum(album.Items[0].Id));
                }
                break;

            case EntryType.ReleaseEvent:
                var ev = eventQueries.Find(s => s.Id, textQuery, 0, null, null, 0, 2, false, EventSortRule.Name);
                if (ev.Items.Length == 1)
                {
                    return(RedirectToReleaseEvent(ev.Items[0]));
                }
                return(RedirectToAction("EventsBySeries", "Event"));

            case EntryType.Song:
                var song = songService.Find(new SongQueryParams(textQuery, null, 0, 2, false, SongSortRule.None, false, false, null));
                if (song.Items.Length == 1)
                {
                    return(RedirectToSong(song.Items[0].Id));
                }
                break;

            case EntryType.SongList:
                var list = songListQueries.Find(s => s.Id, textQuery, null, 0, 2, false, SongListSortRule.Name);
                if (list.Items.Length == 1)
                {
                    return(RedirectToSongList(list.Items[0]));
                }
                return(RedirectToAction("Featured", "SongList"));

            case EntryType.Tag:
                var tags = tagQueries.Find(new TagQueryParams(new CommonSearchParams(textQuery, true, true), PagingProperties.FirstPage(2)),
                                           TagOptionalFields.None, WebHelper.IsSSL(Request), permissionContext.LanguagePreference);
                if (tags.Items.Length == 1)
                {
                    return(RedirectToTag(tags.Items.First().Id, tags.Items.First().Name));
                }
                break;

            default: {
                var action     = "Index";
                var controller = searchType.ToString();
                return(RedirectToAction(action, controller, new { filter }));
            }
            }

            return(null);
        }
Esempio n. 19
0
        public static IQueryable <ArtistName> WhereArtistNameIs(this IQueryable <ArtistName> query, ArtistSearchTextQuery textQuery)
        {
            var canonizedName = textQuery.Query;

            if (textQuery.IsExact)
            {
                return(query.Where(m => m.Value == canonizedName ||
                                   m.Value == $"{canonizedName}P" ||
                                   m.Value == $"{canonizedName}-P"));
            }
            else
            {
                return(query.WhereEntryNameIs(textQuery));
            }
        }
Esempio n. 20
0
        // TODO: should be combined with common name query somehow, but NH is making it hard
        /// <summary>
        /// Filters an artist query by a name query.
        /// </summary>
        /// <param name="query">Artist query. Cannot be null.</param>
        /// <param name="nameFilter">Name filter string. If null or empty, no filtering is done.</param>
        /// <param name="matchMode">Desired mode for matching names.</param>
        /// <param name="words">
        /// List of words for the words search mode.
        /// Can be null, in which case the words list will be parsed from <paramref name="nameFilter"/>.
        /// </param>
        /// <returns>Filtered query. Cannot be null.</returns>
        public static IQueryable <Artist> WhereHasName(this IQueryable <Artist> query, ArtistSearchTextQuery textQuery)
        {
            if (textQuery.IsEmpty)
            {
                return(query);
            }

            var nameFilter = textQuery.Query;

            switch (textQuery.MatchMode)
            {
            case NameMatchMode.Exact:
                return(query.Where(m => m.Names.Names.Any(n => n.Value == nameFilter)));

            case NameMatchMode.Partial:
                return(query.Where(m => m.Names.Names.Any(n => n.Value.Contains(nameFilter))));

            case NameMatchMode.StartsWith:
                return(query.Where(m => m.Names.Names.Any(n => n.Value.StartsWith(nameFilter))));

            case NameMatchMode.Words:
                var words = textQuery.Words;

                switch (words.Length)
                {
                case 1:
                    query = query.Where(q => q.Names.Names.Any(n => n.Value.Contains(words[0])));
                    break;

                case 2:
                    query = query.Where(q =>
                                        q.Names.Names.Any(n => n.Value.Contains(words[0])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[1]))
                                        );
                    break;

                case 3:
                    query = query.Where(q =>
                                        q.Names.Names.Any(n => n.Value.Contains(words[0])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[1])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[2]))
                                        );
                    break;

                case 4:
                    query = query.Where(q =>
                                        q.Names.Names.Any(n => n.Value.Contains(words[0])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[1])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[2])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[3]))
                                        );
                    break;

                case 5:
                    query = query.Where(q =>
                                        q.Names.Names.Any(n => n.Value.Contains(words[0])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[1])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[2])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[3])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[4]))
                                        );
                    break;

                case 6:
                    query = query.Where(q =>
                                        q.Names.Names.Any(n => n.Value.Contains(words[0])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[1])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[2])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[3])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[4])) &&
                                        q.Names.Names.Any(n => n.Value.Contains(words[5]))
                                        );
                    break;
                }
                return(query);
            }

            return(query);
        }
Esempio n. 21
0
 /// <summary>
 /// Filters an artist query by a name query.
 /// </summary>
 /// <param name="query">Artist query. Cannot be null.</param>
 /// <param name="textQuery">Textual filter. Cannot be null.</param>
 /// <returns>Filtered query. Cannot be null.</returns>
 public static IQueryable <Artist> WhereHasName(this IQueryable <Artist> query, ArtistSearchTextQuery textQuery)
 {
     return(query.WhereHasNameGeneric <Artist, ArtistName>(textQuery));
 }
Esempio n. 22
0
        public PartialFindResult <EntryForApiContract> GetList(
            string query,
            int[] tagIds,
            string[] tags,
            bool childTags,
            EntryStatus?status,
            int start, int maxResults, bool getTotalCount,
            EntrySortRule sort,
            NameMatchMode nameMatchMode,
            EntryOptionalFields fields,
            ContentLanguagePreference lang,
            bool ssl,
            bool searchTags = false
            )
        {
            var textQuery       = SearchTextQuery.Create(query, nameMatchMode);
            var artistTextQuery = ArtistSearchTextQuery.Create(query, nameMatchMode);             // Can't use the existing words collection here as they are noncanonized

            return(repository.HandleQuery(ctx => {
                // Get all applicable names per entry type
                var artistQuery = ctx.OfType <Artist>().Query()
                                  .Where(a => !a.Deleted)
                                  .WhereHasName_Canonized(artistTextQuery)
                                  .WhereHasTags(tagIds, childTags)
                                  .WhereHasTags(tags)
                                  .WhereStatusIs(status);

                var artistNames = artistQuery
                                  .OrderBy(sort, lang)
                                  .Take(start + maxResults)
                                  .SelectEntryBase(lang, EntryType.Artist)
                                  .ToArray();

                var albumQuery = ctx.OfType <Album>().Query()
                                 .Where(a => !a.Deleted)
                                 .WhereHasName(textQuery)
                                 .WhereHasTags(tagIds, childTags)
                                 .WhereHasTags(tags)
                                 .WhereStatusIs(status);

                var albumNames = albumQuery
                                 .OrderBy(sort, lang)
                                 .Take(start + maxResults)
                                 .SelectEntryBase(lang, EntryType.Album)
                                 .ToArray();

                var songQuery = ctx.OfType <Song>().Query()
                                .Where(a => !a.Deleted)
                                .WhereHasName(textQuery)
                                .WhereHasTags(tagIds, childTags)
                                .WhereHasTags(tags)
                                .WhereStatusIs(status);

                var songNames = songQuery
                                .OrderBy(sort, lang)
                                .Take(start + maxResults)
                                .SelectEntryBase(lang, EntryType.Song)
                                .ToArray();

                var tagQuery = searchTags ? ctx.OfType <Tag>().Query()
                               .WhereHasName(textQuery)
                               .WhereStatusIs(status) : null;

                var tagNames = searchTags ? tagQuery
                               .OrderBy(sort, lang)
                               .Take(start + maxResults)
                               .SelectEntryBase(lang, EntryType.Tag)
                               .ToArray() : null;

                // Get page of combined names
                var entryNames = artistNames.Concat(albumNames).Concat(songNames).Concat(tagNames ?? new DataContracts.EntryBaseContract[0])
                                 .OrderBy(e => e.DefaultName)
                                 .Skip(start)
                                 .Take(maxResults)
                                 .ToArray();

                var artistIds = entryNames.Where(e => e.EntryType == EntryType.Artist).Select(a => a.Id).ToArray();
                var albumIds = entryNames.Where(e => e.EntryType == EntryType.Album).Select(a => a.Id).ToArray();
                var songIds = entryNames.Where(e => e.EntryType == EntryType.Song).Select(a => a.Id).ToArray();
                var searchedTagIds = searchTags ? entryNames.Where(e => e.EntryType == EntryType.Tag).Select(a => a.Id).ToArray() : new int[0];

                // Get the actual entries in the page
                var artists = artistIds.Any() ? ctx.OfType <Artist>().Query()
                              .Where(a => artistIds.Contains(a.Id))
                              .ToArray()
                              .Select(a => new EntryForApiContract(a, lang, entryThumbPersister, ssl, fields)) : new EntryForApiContract[0];

                var albums = albumIds.Any() ? ctx.OfType <Album>().Query()
                             .Where(a => albumIds.Contains(a.Id))
                             .ToArray()
                             .Select(a => new EntryForApiContract(a, lang, entryThumbPersister, ssl, fields)) : new EntryForApiContract[0];

                var songs = songIds.Any() ? ctx.OfType <Song>().Query()
                            .Where(a => songIds.Contains(a.Id))
                            .ToArray()
                            .Select(a => new EntryForApiContract(a, lang, fields)) : new EntryForApiContract[0];

                var searchedTags = searchTags && searchedTagIds.Any() ? ctx.OfType <Tag>().Query()
                                   .Where(a => searchedTagIds.Contains(a.Id))
                                   .ToArray()
                                   .Select(a => new EntryForApiContract(a, lang, entryImagePersisterOld, ssl, fields)) : new EntryForApiContract[0];

                // Merge and sort the final list
                var entries = artists.Concat(albums).Concat(songs).Concat(searchedTags);

                if (sort == EntrySortRule.Name)
                {
                    entries = entries.OrderBy(a => a.Name);
                }

                if (sort == EntrySortRule.AdditionDate)
                {
                    entries = entries.OrderByDescending(a => a.CreateDate);
                }

                var count = 0;

                if (getTotalCount)
                {
                    var artistCount =
                        (artistNames.Length >= maxResults ? artistQuery.Count() : artistNames.Length);

                    var albumCount =
                        (albumNames.Length >= maxResults ? albumQuery.Count() : albumNames.Length);

                    var songCount =
                        (songNames.Length >= maxResults ? songQuery.Count() : songNames.Length);

                    var tagCount =
                        searchTags ? (tagNames.Length >= maxResults ? tagQuery.Count() : tagNames.Length) : 0;

                    count = artistCount + albumCount + songCount + tagCount;
                }

                return new PartialFindResult <EntryForApiContract>(entries.ToArray(), count);
            }));
        }
Esempio n. 23
0
        public SongDetailsContract XGetSongByNameArtistAndAlbum(string name, string artist, string album)
        {
            return(HandleQuery(session =>
            {
                var matches = session.Query <SongName>().Where(n => n.Value == name)
                              .Select(n => n.Song)
                              .ToArray();

                Artist[] artists = null;

                if (!string.IsNullOrEmpty(artist))
                {
                    artists = session.Query <ArtistName>()
                              .WhereArtistNameIs(ArtistSearchTextQuery.Create(artist))
                              .Select(n => n.Artist)
                              .Take(10)
                              .ToArray();
                }

                if (artists != null && artists.Any())
                {
                    matches = matches.Where(s => s.ArtistList.Any(a => artists.Contains(a))).ToArray();
                }

                Album[] albums = null;

                if (!string.IsNullOrEmpty(album))
                {
                    albums = session.Query <Album>()
                             .WhereHasName(SearchTextQuery.Create(album))
                             .Take(10)
                             .ToArray();
                }

                if (albums != null && albums.Any())
                {
                    matches = matches.Where(s => s.Albums.Any(a => albums.Contains(a.Album))).ToArray();
                }

                if (matches.Length == 1)
                {
                    return new SongDetailsContract(matches.First(), PermissionContext.LanguagePreference, new SongListBaseContract[0], null, null, PermissionContext, null);
                }

                if (matches.Length == 0)
                {
                    return null;
                }

                matches = session.Query <SongName>()
                          .WhereEntryNameIs(SearchTextQuery.Create(name))
                          .Select(n => n.Song)
                          .ToArray();

                if (artists != null && artists.Any())
                {
                    matches = matches.Where(s => s.ArtistList.Any(a => artists.Contains(a))).ToArray();
                }

                if (albums != null && albums.Any())
                {
                    matches = matches.Where(s => s.Albums.Any(a => albums.Contains(a.Album))).ToArray();
                }

                if (matches.Length == 1)
                {
                    return new SongDetailsContract(matches.First(), PermissionContext.LanguagePreference, new SongListBaseContract[0], null, null, PermissionContext, null);
                }

                return null;
            }));
        }
Esempio n. 24
0
        private ActionResult TryRedirect(string filter, EntryType searchType)
        {
            var textQuery       = SearchTextQuery.Create(filter);
            var artistTextQuery = ArtistSearchTextQuery.Create(filter);

            switch (searchType)
            {
            case EntryType.Undefined: {
                var result = services.Find(filter, 1, true);

                if (result.OnlyOneItem)
                {
                    if (result.Albums.TotalCount == 1)
                    {
                        return(RedirectToAlbum(result.Albums.Items[0].Id));
                    }

                    if (result.Artists.TotalCount == 1)
                    {
                        return(RedirectToArtist(result.Artists.Items[0].Id));
                    }

                    if (result.Songs.TotalCount == 1)
                    {
                        return(RedirectToSong(result.Songs.Items[0].Id));
                    }

                    if (result.Tags.TotalCount == 1)
                    {
                        return(RedirectToAction("Details", "Tag", new { id = result.Tags.Items[0].Name }));
                    }
                }
            }
            break;

            case EntryType.Artist:
                var artist = artistService.FindArtists(new ArtistQueryParams(artistTextQuery, null, 0, 2, false, false, ArtistSortRule.None, false));
                if (artist.Items.Length == 1)
                {
                    return(RedirectToArtist(artist.Items[0].Id));
                }
                break;

            case EntryType.Album:
                var album = albumService.Find(new AlbumQueryParams(textQuery, DiscType.Unknown, 0, 2, false, false, AlbumSortRule.None, false));
                if (album.Items.Length == 1)
                {
                    return(RedirectToAlbum(album.Items[0].Id));
                }
                break;

            case EntryType.Song:
                var song = songService.Find(new SongQueryParams(textQuery, null, 0, 2, false, false, SongSortRule.None, false, false, null));
                if (song.Items.Length == 1)
                {
                    return(RedirectToSong(song.Items[0].Id));
                }
                break;

            default: {
                var action     = "Index";
                var controller = searchType.ToString();
                return(RedirectToAction(action, controller, new { filter }));
            }
            }

            return(null);
        }
Esempio n. 25
0
        public static IQueryable <ArtistName> WhereArtistNameIs(this IQueryable <ArtistName> query, ArtistSearchTextQuery textQuery)
        {
            var canonizedName = textQuery.Query;

            if (textQuery.IsExact)
            {
                return(query.Where(m => m.Value == canonizedName ||
                                   m.Value == string.Format("{0}P", canonizedName) ||
                                   m.Value == string.Format("{0}-P", canonizedName)));
            }
            else
            {
                return(FindHelpers.AddEntryNameFilter(query, textQuery));
            }
        }