@@ -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