public async Task AggregateAsync_MergesVersions() { var indexer = new RelevanceSearchResultsIndexer(); var aggregator = new SearchResultsAggregator(indexer, new PackageSearchMetadataSplicer()); var queryString = "nuget"; var rawSearch1 = TestUtility.LoadTestResponse("mergeVersions1.json"); var package1 = FindNuGetCorePackage(rawSearch1); var v1 = await GetPackageVersionsAsync(package1); Assert.NotEmpty(v1); var rawSearch2 = TestUtility.LoadTestResponse("mergeVersions2.json"); var package2 = FindNuGetCorePackage(rawSearch2); var v2 = await GetPackageVersionsAsync(package2); Assert.NotEmpty(v2); var results = await aggregator.AggregateAsync(queryString, rawSearch1, rawSearch2); var mergedPackage = FindNuGetCorePackage(results); var vm = await GetPackageVersionsAsync(mergedPackage); Assert.Superset(v1, vm); Assert.Superset(v2, vm); }
private async Task <SearchResult <IPackageSearchMetadata> > AggregateSearchResultsAsync( string searchText, IEnumerable <SearchResult <IPackageSearchMetadata> > results, TelemetryState telemetryState) { SearchResult <IPackageSearchMetadata> result; var nonEmptyResults = results.Where(r => r.Any()).ToArray(); if (nonEmptyResults.Length == 0) { result = SearchResult.Empty <IPackageSearchMetadata>(); } else if (nonEmptyResults.Length == 1) { result = SearchResult.FromItems(nonEmptyResults[0].Items); } else { var items = nonEmptyResults.Select(r => r.Items).ToArray(); var indexer = new RelevanceSearchResultsIndexer(); var aggregator = new SearchResultsAggregator(indexer, new PackageSearchMetadataSplicer()); var aggregatedItems = await aggregator.AggregateAsync( searchText, items); result = SearchResult.FromItems(aggregatedItems.ToArray()); // set correct count of unmerged items result.RawItemsCount = items.Aggregate(0, (r, next) => r + next.Count); } result.SourceSearchStatus = results .SelectMany(r => r.SourceSearchStatus) .ToDictionary(kv => kv.Key, kv => kv.Value); var cursors = results .Where(r => r.NextToken != null) .ToDictionary(r => r.SourceSearchStatus.Single().Key, r => r.NextToken); if (cursors.Keys.Any()) { result.NextToken = new AggregatedContinuationToken { TelemetryState = telemetryState, SearchString = searchText, SourceSearchCursors = cursors }; } return(result); }
public async Task AggregateAsync_IdenticalFeeds() { var indexer = new DownloadCountResultsIndexer(); var aggregator = new SearchResultsAggregator(indexer, new PackageSearchMetadataSplicer()); var queryString = "nuget"; var rawSearch1 = TestUtility.LoadTestResponse("relativeOrder1.json"); var rawSearch2 = TestUtility.LoadTestResponse("relativeOrder1.json"); var results = await aggregator.AggregateAsync(queryString, rawSearch1, rawSearch2); Assert.Equal(rawSearch1.Select(r => r.Identity), results.Select(r => r.Identity)); }
public async Task AggregateAsync_MaintainsOrder() { var indexer = new DownloadCountResultsIndexer(); var aggregator = new SearchResultsAggregator(indexer, new PackageSearchMetadataSplicer()); var queryString = "nuget"; var rawSearch1 = TestUtility.LoadTestResponse("relativeOrder1.json"); var rawSearch2 = TestUtility.LoadTestResponse("relativeOrder2.json"); var rawSearch3 = TestUtility.LoadTestResponse("relativeOrder3.json"); var results = await aggregator.AggregateAsync(queryString, rawSearch1, rawSearch2, rawSearch3); AssertRelativeOrder(rawSearch1, results); AssertRelativeOrder(rawSearch2, results); AssertRelativeOrder(rawSearch3, results); }
private async Task<SearchResult<IPackageSearchMetadata>> AggregateSearchResultsAsync( string searchText, IEnumerable<SearchResult<IPackageSearchMetadata>> results) { SearchResult<IPackageSearchMetadata> result; var nonEmptyResults = results.Where(Enumerable.Any).ToArray(); if (nonEmptyResults.Length == 0) { result = SearchResult.Empty<IPackageSearchMetadata>(); } else if (nonEmptyResults.Length == 1) { result = SearchResult.FromItems(nonEmptyResults[0].Items); } else { var items = nonEmptyResults.Select(r => r.Items).ToArray(); var indexer = new RelevanceSearchResultsIndexer(); var aggregator = new SearchResultsAggregator(indexer, new PackageSearchMetadataSplicer()); var aggregatedItems = await aggregator.AggregateAsync( searchText, items); result = SearchResult.FromItems(aggregatedItems.ToArray()); // set correct count of unmerged items result.RawItemsCount = items.Aggregate(0, (r, next) => r + next.Count); } result.SourceSearchStatus = results .SelectMany(r => r.SourceSearchStatus) .ToDictionary(kv => kv.Key, kv => kv.Value); var cursors = results .Where(r => r.NextToken != null) .ToDictionary(r => r.SourceSearchStatus.Single().Key, r => r.NextToken); if (cursors.Keys.Any()) { result.NextToken = new AggregatedContinuationToken { SearchString = searchText, SourceSearchCursors = cursors }; } return result; }