@@ -205,9 +205,7 @@ filterPatternFly.memo = memo(filterPatternFly, DEFAULT_OPTIONS.resourceMemoOptio
205205/**
206206 * Search for PatternFly component documentation URLs using fuzzy search.
207207 *
208- * @note Uses `filterPatternFly` for additional filtering. Future updates should
209- * consider moving the await outside the loop to improve performance, possibly a
210- * second iteration.
208+ * @note Uses `filterPatternFly` for additional filtering.
211209 *
212210 * @param searchQuery - Search query. Values are coerced to string for fuzzy search.
213211 * @param {FilterPatternFlyFilters } filters - Available filters for PatternFly data.
@@ -260,13 +258,17 @@ const searchPatternFly = async (searchQuery: unknown, filters?: FilterPatternFly
260258
261259 // Store refined results in a map for easy "did we already find this?" checks"
262260 const searchResultsMap = new Map < string , SearchPatternFlyResult > ( ) ;
261+ const searchResultsFilterMap = new Map < string , PatternFlyMcpResourceFilteredMetadata > ( ) ;
262+ const fuzzyResultsMap = new Map < string , FuzzySearchResult > ( ) ;
263263
264- // Refine search results with version filtering and mapping
264+ // Refine search results with versioning for filtering and remapping
265265 for ( const result of searchResults ) {
266266 const versionMap = updatedResources . keywordsMap . get ( result . item ) ;
267267
268268 if ( versionMap ) {
269- const versionResults = updatedFilters . version ? versionMap . get ( updatedFilters . version ) : Array . from ( versionMap . values ( ) ) . flat ( ) ;
269+ const versionResults = updatedFilters . version
270+ ? versionMap . get ( updatedFilters . version )
271+ : Array . from ( versionMap . values ( ) ) . flat ( ) ;
270272
271273 if ( versionResults ) {
272274 for ( const name of versionResults ) {
@@ -276,39 +278,32 @@ const searchPatternFly = async (searchQuery: unknown, filters?: FilterPatternFly
276278 continue ;
277279 }
278280
279- // Omit versions from the result
280- const { versions, ...filteredResource } = namedResource ;
281+ if ( ! fuzzyResultsMap . has ( name ) ) {
282+ // Set results for filtering.
283+ searchResultsFilterMap . set ( name , namedResource ) ;
281284
282- // Apply contextual filtering and flattening
283- const { byResource } = await filterPatternFly ( updatedFilters , new Map ( [ [ name , { ...filteredResource } ] ] ) ) ;
284-
285- if ( ! byResource . has ( name ) ) {
286- continue ;
287- }
288-
289- let versionContextualProperties ;
290-
291- // Apply version contextual properties, typically URIs
292- if ( updatedFilters . version && versions [ updatedFilters . version ] ) {
293- versionContextualProperties = {
294- isSchemasAvailable : versions [ updatedFilters . version ] ?. isSchemasAvailable ,
295- uri : versions [ updatedFilters . version ] ?. uri ,
296- uriSchemas : versions [ updatedFilters . version ] ?. uriSchemas
297- } ;
285+ // Set fuzzy results so we can map back the searchResultsFilterMap filtered output.
286+ fuzzyResultsMap . set ( name , result ) ;
298287 }
299-
300- // Apply property filters
301- searchResultsMap . set ( name , {
302- ...result ,
303- ...byResource . get ( name ) ,
304- ...versionContextualProperties ,
305- query : coercedSearchQuery
306- } as SearchPatternFlyResult ) ;
307288 }
308289 }
309290 }
310291 }
311292
293+ // Apply filtering
294+ const { byResource } = await filterPatternFly ( updatedFilters , searchResultsFilterMap ) ;
295+
296+ // Loop filtered results, update search results.
297+ for ( const [ name , filteredData ] of byResource ) {
298+ const fuzzyMatch = fuzzyResultsMap . get ( name ) ;
299+
300+ searchResultsMap . set ( name , {
301+ ...fuzzyMatch ,
302+ ...filteredData ,
303+ query : coercedSearchQuery
304+ } as SearchPatternFlyResult ) ;
305+ }
306+
312307 // Minor breakdown of search results
313308 const exactMatches = Array . from ( searchResultsMap . values ( ) ) . filter ( result => result . matchType === 'exact' || result . matchType === 'all' ) ;
314309 const remainingMatches = Array . from ( searchResultsMap . values ( ) ) . filter ( result => result . matchType !== 'exact' && result . matchType !== 'all' ) ;
0 commit comments