예제 #1
0
        private Song PickSongForUser(User user)
        {
            // This is NOT an unbounded result set:
            // This queries the Songs_RankStandings index, which will reduce the results. Max number of results will be the number of CommunityRankStanding enum constants.
            var songRankStandings = this.RavenDb
                .Query<Song, Songs_RankStandings>()
                .As<Songs_RankStandings.Results>()
                .ToArray();

            var veryPoorRankSongCount = songRankStandings.Where(s => s.Standing == CommunityRankStanding.VeryPoor).Select(s => s.Count).FirstOrDefault();
            var poorRankSongCount = songRankStandings.Where(s => s.Standing == CommunityRankStanding.Poor).Select(s => s.Count).FirstOrDefault();
            var normalRankSongCount = songRankStandings.Where(s => s.Standing == CommunityRankStanding.Normal).Select(s => s.Count).FirstOrDefault();
            var goodRankSongCount = songRankStandings.Where(s => s.Standing == CommunityRankStanding.Good).Select(s => s.Count).FirstOrDefault();
            var greatRankSongCount = songRankStandings.Where(s => s.Standing == CommunityRankStanding.Great).Select(s => s.Count).FirstOrDefault();
            var bestRankSongCount = songRankStandings.Where(s => s.Standing == CommunityRankStanding.Best).Select(s => s.Count).FirstOrDefault();

            var pickRankedSong = new Func<CommunityRankStanding, Func<Song>>(standing => new Func<Song>(() => PickRankedSongForUser(standing, user)));
            var songPick = user.Preferences.PickSong(veryPoorRankSongCount, poorRankSongCount, normalRankSongCount, goodRankSongCount, greatRankSongCount, bestRankSongCount);
            var songPicker = Match.Value(songPick)
                .With(SongPick.VeryPoorRank, pickRankedSong(CommunityRankStanding.VeryPoor))
                .With(SongPick.PoorRank, pickRankedSong(CommunityRankStanding.Poor))
                .With(SongPick.NormalRank, pickRankedSong(CommunityRankStanding.Normal))
                .With(SongPick.GoodRank, pickRankedSong(CommunityRankStanding.Good))
                .With(SongPick.GreatRank, pickRankedSong(CommunityRankStanding.Great))
                .With(SongPick.BestRank, pickRankedSong(CommunityRankStanding.Best))
                .With(SongPick.LikedAlbum, () => PickLikedAlbumForUser(user))
                .With(SongPick.LikedArtist, () => PickLikedArtistForUser(user))
                .With(SongPick.LikedSong, () => PickLikedSongForUser(user))
                .With(SongPick.RandomSong, PickRandomSong)
                .Evaluate();
            var song = songPicker();
            if (song == null)
            {
                song = PickRandomSong();
            }

            return song.ToDto(user.Preferences.GetLikeStatus(song));
        }
예제 #2
0
 private Song PickRankedSongForUser(CommunityRankStanding rank, User user)
 {
     var dislikedSongIds = user.Preferences.GetDislikedSongs().Select(s => s.Name).ToArray();
     return this.RavenDb.Query<Song>()
         .Where(s => s.CommunityRankStanding == rank && !s.Id.In(dislikedSongIds))
         .Customize(x => x.RandomOrdering())
         .FirstOrDefault();
 }
예제 #3
0
 private Song PickLikedSongForUser(User user)
 {
     var randomLikedSong = user.Preferences.Songs.Where(s => s.LikeCount == 1).RandomElement();
     if (randomLikedSong != null)
     {
         return RavenDb.Query<Song>().FirstOrDefault(s => s.Id == randomLikedSong.Name);
     }
     return null;
 }
예제 #4
0
        private Song PickLikedArtistForUser(User user)
        {
            var randomLikedArtist = user.Preferences.GetLikedArtists().RandomElement();
            if (randomLikedArtist != null)
            {
                return this.RavenDb.Query<Song>()
                    .Where(s => s.Artist == randomLikedArtist.Name)
                    .Customize(c => c.RandomOrdering())
                    .FirstOrDefault();
            }

            return null;
        }
예제 #5
0
        private void IncrementTotalPlayed(User user)
        {
            user.TotalPlays += 1;

            var todaysDate = DateTime.Now.Date;
            var visit = this.RavenDb.Query<Visit>().FirstOrDefault(v => v.UserId == user.Id && v.DateTime == todaysDate);
            if (visit != null)
            {
                visit.TotalPlays += 1;
            }
            else
            {
                this.RavenDb.Store(new Visit()
                {
                    TotalPlays = 1,
                    UserId = user.Id,
                    DateTime = todaysDate
                });
            }
        }
예제 #6
0
 private User CreateUserIfNecessary(Guid clientId)
 {
     var user = this.RavenDb
         .Query<User>()
         .FirstOrDefault(u => u.ClientIdentifier == clientId);
     if (user == null)
     {
         user = new User { ClientIdentifier = clientId };
         this.RavenDb.Store(user);
     }
     return user;
 }