示例#1
0
    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
        });
    }
示例#2
0
        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
        }