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)); }
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(); }
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; }
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; }
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 }); } }
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; }