using MySqlConnector; using Sony.Filtr.Database; using Sony.Filtr.DistributedCaching; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Sony.Filtr.PlaylistGeneration.Autocomplete { public class DbArtistAutocompleteFactory : IAutocompleteFactory { private readonly DistributedCacheHandler _cacheHandler; public DbArtistAutocompleteFactory(DistributedCacheHandler distributedCacheHandler) { _cacheHandler = distributedCacheHandler; } public async Task> SearchArtistsAsync(string search, int count) { var cacheKey = "DbArtistAutocompleteFactory-1.0:" + search; var artists = _cacheHandler.Get(cacheKey) as List; if (artists == null) { artists = await SearchArtistsInternalAsync(search, count); _cacheHandler.Put(cacheKey, artists, DateTime.Now.AddHours(1)); } return artists; } private async Task> SearchArtistsInternalAsync(string search, int count) { List artists = new List(); using (MySqlConnection conn = await DatabaseHandler.GetOpenReadOnlyConnectionAsync()) { const string sql = "SELECT strArtistName, dblFamiliarity FROM tblAutocompleteArtistsEchoNest WHERE strArtistName LIKE @strSearch OR strAlias LIKE @strSearch ORDER BY dblFamiliarity DESC LIMIT @count"; MySqlCommand cmd = new MySqlCommand(sql, conn); cmd.Parameters.AddWithValue("@strSearch", search + "%"); cmd.Parameters.AddWithValue("@count", count); using(var reader = await cmd.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { artists.Add(new ArtistAutocompleteResult() { Name = reader.GetString(0), Score = reader.GetDouble(1) }); } } } return artists; } } }