Skip to content

Commit 105e0f7

Browse files
authored
Refactor SearchObject to eliminate duplicate code in search result handling (#6917)
1 parent 481a7dd commit 105e0f7

1 file changed

Lines changed: 52 additions & 29 deletions

File tree

  • src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Services

src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Services/SearchObject.cs

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,12 @@ public async ValueTask<SearchResultContextInfo> SearchAsync(string searchText, S
6161
_lastMainFeedSearchResult = feedResults; // Store this so we can ContinueSearch, we don't store recommended as we only do that on the first search
6262
_lastSearchFilter = filter;
6363

64-
var packageSearchMetadataContextInfoCollection = new List<PackageSearchMetadataContextInfo>(feedResults.Items.Count);
65-
foreach (IPackageSearchMetadata packageSearchMetadata in feedResults.Items)
66-
{
67-
IPackageSearchMetadata? localPackageSearchMetadata = null;
68-
69-
// Attach local metadata in case we do not have an icon remotely, can try local metadata.
70-
localPackageSearchMetadata = await _packageMetadataProvider.GetOnlyLocalPackageMetadataAsync(packageSearchMetadata.Identity, cancellationToken);
71-
72-
CacheBackgroundData(packageSearchMetadata, localPackageSearchMetadata, filter.IncludePrerelease);
73-
var knownOwners = CreateKnownOwners(packageSearchMetadata);
74-
packageSearchMetadataContextInfoCollection.Add(PackageSearchMetadataContextInfo.Create(packageSearchMetadata, knownOwners));
75-
}
64+
var packageSearchMetadataContextInfoCollection = await ProcessSearchResultsAsync(
65+
feedResults.Items,
66+
filter.IncludePrerelease,
67+
includeLocalMetadata: true,
68+
createKnownOwners: true,
69+
cancellationToken);
7670

7771
return new SearchResultContextInfo(
7872
packageSearchMetadataContextInfoCollection,
@@ -91,13 +85,12 @@ public async ValueTask<SearchResultContextInfo> RefreshSearchAsync(CancellationT
9185
cancellationToken);
9286
_lastMainFeedSearchResult = refreshSearchResult;
9387

94-
var packageItems = new List<PackageSearchMetadataContextInfo>(_lastMainFeedSearchResult.Items.Count);
95-
96-
foreach (IPackageSearchMetadata packageSearchMetadata in _lastMainFeedSearchResult.Items)
97-
{
98-
CacheBackgroundData(packageSearchMetadata, _lastSearchFilter.IncludePrerelease);
99-
packageItems.Add(PackageSearchMetadataContextInfo.Create(packageSearchMetadata));
100-
}
88+
var packageItems = await ProcessSearchResultsAsync(
89+
_lastMainFeedSearchResult.Items,
90+
_lastSearchFilter.IncludePrerelease,
91+
includeLocalMetadata: false,
92+
createKnownOwners: false,
93+
cancellationToken);
10194

10295
return new SearchResultContextInfo(
10396
packageItems,
@@ -141,14 +134,12 @@ public async ValueTask<SearchResultContextInfo> ContinueSearchAsync(Cancellation
141134
cancellationToken);
142135
_lastMainFeedSearchResult = continueSearchResult;
143136

144-
var packageItems = new List<PackageSearchMetadataContextInfo>(_lastMainFeedSearchResult.Items.Count);
145-
146-
foreach (IPackageSearchMetadata packageSearchMetadata in _lastMainFeedSearchResult.Items)
147-
{
148-
CacheBackgroundData(packageSearchMetadata, _lastSearchFilter.IncludePrerelease);
149-
var knownOwners = CreateKnownOwners(packageSearchMetadata);
150-
packageItems.Add(PackageSearchMetadataContextInfo.Create(packageSearchMetadata, knownOwners));
151-
}
137+
var packageItems = await ProcessSearchResultsAsync(
138+
_lastMainFeedSearchResult.Items,
139+
_lastSearchFilter.IncludePrerelease,
140+
includeLocalMetadata: false,
141+
createKnownOwners: true,
142+
cancellationToken);
152143

153144
return new SearchResultContextInfo(
154145
packageItems,
@@ -183,9 +174,41 @@ public async ValueTask<int> GetTotalCountAsync(int maxCount, SearchFilter filter
183174
return totalCount;
184175
}
185176

186-
private void CacheBackgroundData(IPackageSearchMetadata packageSearchMetadata, bool includesPrerelease)
177+
/// <summary>
178+
/// Processes search results by caching background data and creating PackageSearchMetadataContextInfo objects.
179+
/// This method consolidates the common logic used across SearchAsync, RefreshSearchAsync, and ContinueSearchAsync.
180+
/// </summary>
181+
/// <param name="searchResults">The search results to process</param>
182+
/// <param name="includePrerelease">Whether prerelease packages are included in the search</param>
183+
/// <param name="includeLocalMetadata">Whether to include local package metadata for icons</param>
184+
/// <param name="createKnownOwners">Whether to create known owners for the packages</param>
185+
/// <param name="cancellationToken">Cancellation token</param>
186+
/// <returns>A list of processed PackageSearchMetadataContextInfo objects</returns>
187+
private async ValueTask<List<PackageSearchMetadataContextInfo>> ProcessSearchResultsAsync(
188+
IEnumerable<IPackageSearchMetadata> searchResults,
189+
bool includePrerelease,
190+
bool includeLocalMetadata,
191+
bool createKnownOwners,
192+
CancellationToken cancellationToken)
187193
{
188-
CacheBackgroundData(packageSearchMetadata, localPackageSearchMetadata: null, includesPrerelease);
194+
var packageSearchMetadataContextInfoCollection = new List<PackageSearchMetadataContextInfo>();
195+
196+
foreach (IPackageSearchMetadata packageSearchMetadata in searchResults)
197+
{
198+
IPackageSearchMetadata? localPackageSearchMetadata = null;
199+
200+
// Attach local metadata in case we do not have an icon remotely, can try local metadata.
201+
if (includeLocalMetadata)
202+
{
203+
localPackageSearchMetadata = await _packageMetadataProvider.GetOnlyLocalPackageMetadataAsync(packageSearchMetadata.Identity, cancellationToken);
204+
}
205+
206+
CacheBackgroundData(packageSearchMetadata, localPackageSearchMetadata, includePrerelease);
207+
IReadOnlyList<KnownOwner>? knownOwners = createKnownOwners ? CreateKnownOwners(packageSearchMetadata) : null;
208+
packageSearchMetadataContextInfoCollection.Add(PackageSearchMetadataContextInfo.Create(packageSearchMetadata, knownOwners));
209+
}
210+
211+
return packageSearchMetadataContextInfoCollection;
189212
}
190213

191214
private void CacheBackgroundData(IPackageSearchMetadata packageSearchMetadata, IPackageSearchMetadata? localPackageSearchMetadata, bool includesPrerelease)

0 commit comments

Comments
 (0)