Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { adaptFilters } from './filter-adapter'
*
* @returns {MeiliSearchParams}
*/
function MeiliParamsCreator(searchContext: SearchContext) {
export function MeiliParamsCreator(searchContext: SearchContext) {
const meiliSearchParams: Record<string, any> = {}
const {
facets,
Expand Down
29 changes: 10 additions & 19 deletions src/adapter/search-request-adapter/search-resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,13 @@ import {
} from '../../types'
import { addMissingFacets, extractFacets } from './filters'

const emptySearch: MeiliSearchResponse<Record<string, any>> = {
hits: [],
query: '',
facetDistribution: {},
limit: 0,
offset: 0,
estimatedTotalHits: 0,
processingTimeMs: 0,
}

/**
* @param {ResponseCacher} cache
*/
export function SearchResolver(cache: SearchCacheInterface) {
export function SearchResolver(
client: MeiliSearch,
cache: SearchCacheInterface
) {
return {
/**
* @param {SearchContext} searchContext
Expand All @@ -30,17 +23,10 @@ export function SearchResolver(cache: SearchCacheInterface) {
*/
searchResponse: async function (
searchContext: SearchContext,
searchParams: MeiliSearchParams,
client: MeiliSearch
searchParams: MeiliSearchParams
): Promise<MeiliSearchResponse<Record<string, any>>> {
const { placeholderSearch, query } = searchContext

// query can be: empty string, undefined or null
// all of them are falsy's
if (!placeholderSearch && !query) {
return emptySearch
}

const { pagination } = searchContext

// In case we are in a `finitePagination`, only one big request is made
Expand Down Expand Up @@ -74,6 +60,11 @@ export function SearchResolver(cache: SearchCacheInterface) {
searchResponse.facetDistribution
)

// query can be: empty string, undefined or null
// all of them are falsy's
if (!placeholderSearch && !query) {
searchResponse.hits = []
}
// Cache response
cache.setEntry<MeiliSearchResponse>(key, searchResponse)
return searchResponse
Expand Down
36 changes: 25 additions & 11 deletions src/cache/first-facets-distribution.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
import { FacetDistribution } from '../types'
import { FacetDistribution, SearchContext } from '../types'
import { MeiliParamsCreator } from '../adapter'

export function cacheFirstFacetDistribution(
defaultFacetDistribution: FacetDistribution,
searchResponse: any
): FacetDistribution {
if (
searchResponse.query === '' &&
Object.keys(defaultFacetDistribution).length === 0
) {
return searchResponse.facetDistribution
export async function cacheFirstFacetDistribution(
searchResolver: any,
searchContext: SearchContext
): Promise<FacetDistribution> {
const defaultSearchContext = {
...searchContext,
// placeholdersearch true to ensure a request is made
placeholderSearch: true,
// Set paginationTotalHits to ensure limit is set to 0
// in order to retrieve 0 documents during the default search request
pagination: { ...searchContext.pagination, paginationTotalHits: 0 },
// query set to empty to ensure retrieving the default facetdistribution
query: '',
}
return defaultFacetDistribution
const meilisearchParams = MeiliParamsCreator(defaultSearchContext)
meilisearchParams.addFacets()
meilisearchParams.addPagination()

// Search response from Meilisearch
const searchResponse = await searchResolver.searchResponse(
defaultSearchContext,
meilisearchParams.getParams()
)
return searchResponse.facetDistribution || {}
}
35 changes: 20 additions & 15 deletions src/client/instant-meilisearch-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
AlgoliaSearchResponse,
AlgoliaMultipleQueriesQuery,
SearchContext,
FacetDistribution,
} from '../types'
import {
adaptSearchResponse,
Expand All @@ -28,11 +29,6 @@ export function instantMeiliSearch(
apiKey = '',
instantMeiliSearchOptions: InstantMeiliSearchOptions = {}
): InstantMeiliSearchInstance {
const searchCache = SearchCache()
// create search resolver with included cache
const searchResolver = SearchResolver(searchCache)
// paginationTotalHits can be 0 as it is a valid number
let defaultFacetDistribution: any = {}
const clientAgents = constructClientAgents(
instantMeiliSearchOptions.clientAgents
)
Expand All @@ -43,6 +39,12 @@ export function instantMeiliSearch(
clientAgents,
})

const searchCache = SearchCache()
// create search resolver with included cache
const searchResolver = SearchResolver(meilisearchClient, searchCache)

let defaultFacetDistribution: FacetDistribution

return {
clearCache: () => searchCache.clearCache(),
/**
Expand All @@ -63,26 +65,29 @@ export function instantMeiliSearch(
// Adapt search request to Meilisearch compliant search request
const adaptedSearchRequest = adaptSearchParams(searchContext)

// Search response from Meilisearch
const searchResponse = await searchResolver.searchResponse(
searchContext,
adaptedSearchRequest,
meilisearchClient
)

// Cache first facets distribution of the instantMeilisearch instance
// Needed to add in the facetDistribution the fields that were not returned
// When the user sets `keepZeroFacets` to true.
defaultFacetDistribution = cacheFirstFacetDistribution(
defaultFacetDistribution,
searchResponse
if (defaultFacetDistribution === undefined) {
defaultFacetDistribution = await cacheFirstFacetDistribution(
searchResolver,
searchContext
)
searchContext.defaultFacetDistribution = defaultFacetDistribution
}

// Search response from Meilisearch
const searchResponse = await searchResolver.searchResponse(
searchContext,
adaptedSearchRequest
)

// Adapt the Meilisearch responsne to a compliant instantsearch.js response
const adaptedSearchResponse = adaptSearchResponse<T>(
searchResponse,
searchContext
)

return adaptedSearchResponse
} catch (e: any) {
console.error(e)
Expand Down
2 changes: 1 addition & 1 deletion src/contexts/search-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export function createSearchContext(
sort: sortByArray.join(':') || '',
indexUid,
pagination,
defaultFacetDistribution,
defaultFacetDistribution: defaultFacetDistribution || {},
placeholderSearch: options.placeholderSearch !== false, // true by default
keepZeroFacets: !!options.keepZeroFacets, // false by default
finitePagination: !!options.finitePagination, // false by default
Expand Down
9 changes: 7 additions & 2 deletions tests/assets/utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { instantMeiliSearch } from '../../src'
import { MeiliSearch } from 'meilisearch'

const HOST = 'http://localhost:7700'
const API_KEY = 'masterKey'

const dataset = [
{
id: 2,
Expand Down Expand Up @@ -225,8 +228,8 @@ const wrongSearchClient = instantMeiliSearch(
'masterKey'
)
const meilisearchClient = new MeiliSearch({
host: 'http://localhost:7700',
apiKey: 'masterKey',
host: HOST,
apiKey: API_KEY,
})

export {
Expand All @@ -235,4 +238,6 @@ export {
wrongSearchClient,
geoDataset,
meilisearchClient,
HOST,
API_KEY,
}
Loading