public async Task <IReadOnlyCollection <Nerd> > GetSearchResultsAsync(string query) { //Try to get data in following order, should do asynchornous where // 1st return wins // 1: cache // 2: Elastic Search // 3: MongoDB var results = new List <Task <IReadOnlyCollection <Nerd> > >(); IReadOnlyCollection <Nerd> res = new List <Nerd>(); string serializedResults; //Let's cancel remaining tasks after we have one complete with results //CancellationTokenSource cts = new CancellationTokenSource(); RedisSearchService redisSearch = new RedisSearchService(); results.Add(redisSearch.GetSearchResultsAsync(query)); ElasticSearchService elasticSearch = new ElasticSearchService(); results.Add(elasticSearch.GetSearchResultsAsync(query)); MongoDBSearchService mongoSearch = new MongoDBSearchService(); results.Add(mongoSearch.GetSearchResultsAsync(query)); while (results.Count > 0) { var result = await Task.WhenAny(results); results.Remove(result); res = await result; if (res.Count > 0) { serializedResults = JsonConvert.SerializeObject(res); redisSearch.CacheResultsAsync(query, serializedResults); return(res); } } return(res); //return await Task.WhenAny(results).Results; }
public IReadOnlyCollection <Nerd> GetSearchResults(string query) { //Try to get data in following order, should do asynchornous where // 1st return wins // 1: cache // 2: Elastic Search // 3: MongoDB IReadOnlyCollection <Nerd> results = new List <Nerd>(); string serializedResults; RedisSearchService redisSearch = new RedisSearchService(); results = redisSearch.GetSearchResults(query); if (results.Count > 0) { return(results); } ElasticSearchService elasticSearch = new ElasticSearchService(); results = elasticSearch.GetSearchResults(query); if (results.Count > 0) { serializedResults = JsonConvert.SerializeObject(results); redisSearch.CacheResults(query, serializedResults); return(results); } MongoDBSearchService mongoSearch = new MongoDBSearchService(); results = mongoSearch.GetSearchResults(query); if (results.Count > 0) { serializedResults = JsonConvert.SerializeObject(results); redisSearch.CacheResults(query, serializedResults); return(results); } return(results); }