public async Task <PageRankingProcessorResponse> PageRankingProcessorHandler(PageRankingProcessorRequest request) { string targetPath = PathGenerator.Generate(request.SearchEngine, request.Keywords, request.TargetDate); StorageClientListFolderResponse files = await _storageClient.ListFolder(new StorageClientListFolderRequest { FolderPath = targetPath }); List <Task <StorageClientDownloadResponse> > downloadTasks = files.FilePaths .Select(f => _storageClient.Download(new StorageClientDownloadRequest { DownloadPath = f })) .ToList(); List <PageRankingProcessorWithSequenceResponse> processedResponses = new List <PageRankingProcessorWithSequenceResponse>(); while (downloadTasks.Any()) { Task <StorageClientDownloadResponse> finishedTask = await Task.WhenAny(downloadTasks); downloadTasks.Remove(finishedTask); StorageClientDownloadResponse downloadedData = await finishedTask; processedResponses.Add(await GenerateResponse(request.SearchEngine, downloadedData.FilePath, downloadedData.FileData)); } //combine List <PageRank> pageRanks = new List <PageRank>(); int rank = 1; foreach (var r in processedResponses.OrderBy(c => c.Sequence)) { foreach (var p in r.Pages.OrderBy(c => c.Rank)) { pageRanks.Add(new PageRank { Rank = rank++, Url = p.Url }); } } return(new PageRankingProcessorResponse { Date = request.TargetDate, Pages = pageRanks }); }
public async Task <string> Results([FromQuery] PageRankingProcessorRequest request) //SearchEngine searchEngine, DateTime? date, string keywords, string match, bool showDetails = false) { PageRankingProcessorResponse pTask = await _processor.PageRankingProcessorHandler(request); if (pTask?.Pages?.Count < 100) { return("Results unavailable"); } IEnumerable <PageRank> matchingRanks = pTask.Pages.Take(100); //only take the first 100 if (!string.IsNullOrEmpty(request.Match)) { matchingRanks = matchingRanks.Where(c => c.Url.ToUpper().Contains(request.Match.ToUpper())); //ranks that matches requested } if (request.ShowDetails) { return(JsonConvert.SerializeObject(matchingRanks)); } return(String.Join(",", matchingRanks.Select(c => c.Rank))); //show rank only }