using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Gma.DataStructures.StringSearch; using MySql.Data.MySqlClient; using Sony.Filtr.Database; namespace Sony.Filtr.PlaylistGeneration.Autocomplete { public class DBMemoryFactory : IAutocompleteFactory { private static readonly Lazy> Trie = new Lazy>( () => { var trie = new ConcurrentTrie(); var artists = GetArtists(); foreach (var artist in artists) { trie.Add(artist.ToLowerInvariant(), artist); } return trie; } ); private static readonly Lazy> ArtistList = new Lazy>(GetArtists); public async Task> SearchArtistsAsync(string search, int count) { //var artists = ArtistList.Value.Where(a=> Matches(search, a)).Take(count).ToList(); var artists = Trie.Value.Retrieve(search.ToLowerInvariant()).Take(count).ToList(); return artists.Select(a => new ArtistAutocompleteResult() { Name = a, Score = 1 }).ToList(); } private static bool Matches(string search, string a) { return a.StartsWith(search, StringComparison.InvariantCultureIgnoreCase) || a.StartsWith(string.Format("the {0}", search), StringComparison.InvariantCultureIgnoreCase); } private static List GetArtists() { List artists = new List(); using (MySqlConnection conn = new MySqlConnection(DatabaseHandler.GetConnectionString())) { conn.Open(); MySqlCommand cmd = new MySqlCommand("SELECT strArtistName FROM tblAutocompleteArtists", conn); var reader = cmd.ExecuteReader(); while (reader.Read()) { artists.Add(reader.GetString(0)); } conn.Close(); } return artists; } public async Task IndexArtistAsync(string artistName) { using (var conn = DatabaseHandler.GetOpenConnection()) { var cmd = conn.CreateCommand(); cmd.CommandText = "INSERT IGNORE INTO tblAutocompleteArtists (strArtistName) VALUES (@strArtistName)"; cmd.Parameters.AddWithValue("@strArtistName", artistName); await cmd.ExecuteNonQueryAsync(); } } } }