public RelatedAlbums GetRelatedAlbums(Album album) {

			ParamIs.NotNull(() => album);

			var albums = new RelatedAlbums();
			var albumId = album.Id;
			var creditableArtists = album.Artists.Where(a => a.Artist != null && !a.IsSupport).ToArray();
			var loadedAlbums = new List<int>(20) { albumId };

			var mainArtists = GetMainArtists(album, creditableArtists);

			if (mainArtists != null && mainArtists.Any()) {

				var mainArtistIds = mainArtists.Select(a => a.Id).ToArray();
				var albumsByMainArtists = ctx.Query()
					.Where(al => 
						al.Id != albumId
						&& !al.Deleted 
						//&& al.ArtistString.Default != ArtistHelper.VariousArtists 
						&& al.AllArtists.Any(a => 
							!a.Artist.Deleted
							&& (a.Artist.ArtistType == ArtistType.Circle || a.Artist.ArtistType == ArtistType.Label || al.ArtistString.Default != ArtistHelper.VariousArtists)
							&& !a.IsSupport 
							&& mainArtistIds.Contains(a.Artist.Id)))
					.OrderBy(a => a.RatingTotal)
					.Distinct()
					.Take(30)
					.ToArray();

				albums.ArtistMatches = albumsByMainArtists;
				loadedAlbums.AddRange(albumsByMainArtists.Select(s => s.Id));

			}

			if (album.RatingTotal > 0) {
				
				var userIds = album.UserCollections.Where(c => c.Rating > 3).Take(30).Select(u => u.User.Id).ToArray();
				var likeMatches = ctx.OfType<AlbumForUser>()
					.Query()
					.Where(f => 
						userIds.Contains(f.User.Id) 
						&& !loadedAlbums.Contains(f.Album.Id)
						&& !f.Album.Deleted)
					.GroupBy(f => f.Album.Id)
					.Select(f => new { Album = f.Key, Ratings = f.Sum(r => r.Rating) })
					.OrderByDescending(f => f.Ratings)
					.Select(s => s.Album)
					.Take(12)
					.ToArray();

				albums.LikeMatches = ctx.Query().Where(s => likeMatches.Contains(s.Id)).ToArray();
				loadedAlbums.AddRange(likeMatches);

			}

			if (album.Tags.Tags.Any()) {

				// Take top 5 tags
				var tagNames = album.Tags.Usages.OrderByDescending(u => u.Count).Take(5).Select(t => t.Tag.Name).ToArray();

				var albumsWithTags =
					ctx.Query().Where(al => 
						al.Id != albumId
						&& !loadedAlbums.Contains(al.Id) 
						&& !al.Deleted 
						&& al.Tags.Usages.Any(t => tagNames.Contains(t.Tag.Name)))
					.OrderBy(a => a.RatingTotal)
					.Take(20)
					.ToArray();

				albums.TagMatches = albumsWithTags;

			}

			return albums;

		}
Example #2
0
        public RelatedAlbums GetRelatedAlbums(Album album)
        {
            ParamIs.NotNull(() => album);

            var albums            = new RelatedAlbums();
            var albumId           = album.Id;
            var creditableArtists = album.Artists.Where(a => a.Artist != null && !a.IsSupport).ToArray();
            var loadedAlbums      = new List <int>(20)
            {
                albumId
            };

            var mainArtists = GetMainArtists(album, creditableArtists);

            if (mainArtists != null && mainArtists.Any())
            {
                var mainArtistIds       = mainArtists.Select(a => a.Id).ToArray();
                var albumsByMainArtists = ctx.Query()
                                          .Where(al =>
                                                 al.Id != albumId &&
                                                 !al.Deleted
                                                 //&& al.ArtistString.Default != ArtistHelper.VariousArtists
                                                 && al.AllArtists.Any(a =>
                                                                      !a.Artist.Deleted &&
                                                                      (a.Artist.ArtistType == ArtistType.Circle || a.Artist.ArtistType == ArtistType.Label || al.ArtistString.Default != ArtistHelper.VariousArtists) &&
                                                                      !a.IsSupport &&
                                                                      mainArtistIds.Contains(a.Artist.Id)))
                                          .OrderBy(a => a.RatingTotal)
                                          .Distinct()
                                          .Take(30)
                                          .ToArray();

                albums.ArtistMatches = albumsByMainArtists;
                loadedAlbums.AddRange(albumsByMainArtists.Select(s => s.Id));
            }

            if (album.RatingTotal > 0)
            {
                var userIds     = album.UserCollections.Where(c => c.Rating > 3).Take(30).Select(u => u.User.Id).ToArray();
                var likeMatches = ctx.OfType <AlbumForUser>()
                                  .Query()
                                  .Where(f =>
                                         userIds.Contains(f.User.Id) &&
                                         !loadedAlbums.Contains(f.Album.Id) &&
                                         !f.Album.Deleted)
                                  .GroupBy(f => f.Album.Id)
                                  .Select(f => new { Album = f.Key, Ratings = f.Sum(r => r.Rating) })
                                  .OrderByDescending(f => f.Ratings)
                                  .Select(s => s.Album)
                                  .Take(12)
                                  .ToArray();

                albums.LikeMatches = ctx.Query().Where(s => likeMatches.Contains(s.Id)).ToArray();
                loadedAlbums.AddRange(likeMatches);
            }

            if (album.Tags.Tags.Any())
            {
                // Take top 5 tags
                var tagNames = album.Tags.Usages.OrderByDescending(u => u.Count).Take(5).Select(t => t.Tag.Name).ToArray();

                var albumsWithTags =
                    ctx.Query().Where(al =>
                                      al.Id != albumId &&
                                      !loadedAlbums.Contains(al.Id) &&
                                      !al.Deleted &&
                                      al.Tags.Usages.Any(t => tagNames.Contains(t.Tag.Name)))
                    .OrderBy(a => a.RatingTotal)
                    .Take(20)
                    .ToArray();

                albums.TagMatches = albumsWithTags;
            }

            return(albums);
        }