import type { FacetDistribution, InstantMeiliSearchConfig, MeilisearchMultiSearchResult, MeilisearchSearchResponse, } from '../../types/index.js' import { adaptHits } from './hits-adapter.js' import { adaptTotalHits } from './total-hits-adapter.js' import { adaptPaginationParameters } from './pagination-adapter.js' import { adaptFacetDistribution } from './facet-distribution-adapter.js' import { adaptFacetStats } from './adapt-facet-stats.js' /** * Adapt multiple search results from Meilisearch to search results compliant * with instantsearch.js * * @param {MeilisearchMultiSearchResult[]} searchResponse * @param {Record} initialFacetDistribution * @param {InstantMeiliSearchConfig} config * @returns {{ results: MeilisearchSearchResponse[] }} */ export function adaptSearchResults>( meilisearchResults: MeilisearchMultiSearchResult[], initialFacetDistribution: Record, config: InstantMeiliSearchConfig ): { results: Array> } { const instantSearchResult: Array> = meilisearchResults.map((meilisearchResult) => { return adaptSearchResult( meilisearchResult, initialFacetDistribution[meilisearchResult.indexUid], config ) }) return { results: instantSearchResult } } /** * Adapt search result from Meilisearch to search result compliant with * instantsearch.js * * @param {MeilisearchMultiSearchResult>} searchResponse * @param {Record} initialFacetDistribution * @param {InstantMeiliSearchConfig} config * @returns {MeilisearchSearchResponse} */ export function adaptSearchResult( meiliSearchResult: MeilisearchMultiSearchResult, initialFacetDistribution: FacetDistribution, config: InstantMeiliSearchConfig ): MeilisearchSearchResponse { const { processingTimeMs, query, indexUid, facetDistribution: responseFacetDistribution = {}, facetStats = {}, metadata, } = meiliSearchResult const facets = Object.keys(responseFacetDistribution) const { hitsPerPage, page, nbPages } = adaptPaginationParameters( meiliSearchResult, meiliSearchResult.pagination ) const hits = adaptHits(meiliSearchResult, config) const nbHits = adaptTotalHits(meiliSearchResult) const facetDistribution = adaptFacetDistribution( config.keepZeroFacets, facets, initialFacetDistribution, responseFacetDistribution ) // Create result object compliant with InstantSearch const adaptedSearchResult: MeilisearchSearchResponse = { index: indexUid, hitsPerPage, page, facets: facetDistribution, nbPages, nbHits, processingTimeMS: processingTimeMs, query, hits, params: '', exhaustiveNbHits: false, facets_stats: adaptFacetStats(facetStats), } // Include Meilisearch analytics metadata if (metadata) { adaptedSearchResult._meilisearch = { metadata } } return adaptedSearchResult }