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
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"test:build": "yarn build && jest --runInBand --selectProjects build",
"test:e2e": "yarn local:env:setup && concurrently --kill-others -s first \"yarn local:env:react\" \"cypress run --env playground=local \"",
"test:e2e:watch": "yarn local:env:setup && concurrently --kill-others -s first \"yarn local:env:react\" \"cypress open --env playground=local\"",
"test:all": "yarn test:e2e:all && yarn test && test:build",
"test:all": "yarn test:e2e && yarn test && yarn test:build",
"cy:open": "cypress open",
"playground:vue": "yarn --cwd ./playgrounds/vue && yarn --cwd ./playgrounds/vue serve",
"playground:react": "yarn --cwd ./playgrounds/react && yarn --cwd ./playgrounds/react start",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,29 @@ test('Adapt SearchContext with no finite pagination and pagination total hits lo

expect(searchParams.limit).toBe(4)
})

test('Adapt SearchContext placeholderSearch set to false', () => {
const searchParams = adaptSearchParams({
indexUid: 'test',
query: '',
pagination: { paginationTotalHits: 4, page: 0, hitsPerPage: 6 },
defaultFacetDistribution: {},
finitePagination: false,
placeholderSearch: false,
})

expect(searchParams.limit).toBe(0)
})

test('Adapt SearchContext placeholderSearch set to false', () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test has the same description as the first one :)

const searchParams = adaptSearchParams({
indexUid: 'test',
query: '',
pagination: { paginationTotalHits: 200, page: 0, hitsPerPage: 6 },
defaultFacetDistribution: {},
finitePagination: false,
placeholderSearch: true,
})

expect(searchParams.limit).toBe(7)
})
5 changes: 4 additions & 1 deletion src/adapter/search-request-adapter/search-params-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,11 @@ export function adaptSearchParams(

const placeholderSearch = searchContext.placeholderSearch
const query = searchContext.query

// Pagination
const { pagination } = searchContext
// Limit

// Limit based on pagination preferences
if (
(!placeholderSearch && query === '') ||
pagination.paginationTotalHits === 0
Expand Down
26 changes: 22 additions & 4 deletions src/adapter/search-request-adapter/search-resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ import {
} from '../../types'
import { addMissingFacets, extractFacets } from './filters'

const emptySearch: MeiliSearchResponse<Record<string, any>> = {
hits: [],
query: '',
facetsDistribution: {},
limit: 0,
offset: 0,
exhaustiveNbHits: false,
nbHits: 0,
processingTimeMs: 0,
}

/**
* @param {ResponseCacher} cache
*/
Expand All @@ -23,6 +34,14 @@ export function SearchResolver(cache: SearchCacheInterface) {
searchParams: MeiliSearchParams,
client: MeiliSearch
): 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 All @@ -38,12 +57,11 @@ export function SearchResolver(cache: SearchCacheInterface) {
searchContext.query,
paginationCache,
])
const entry = cache.getEntry(key)
const cachedResponse = cache.getEntry(key)

// Request is cached.
if (entry) return entry
// Check if specific request is already cached with its associated search response.
if (cachedResponse) return cachedResponse

// Cache filters: todo components
const facetsCache = extractFacets(searchContext, searchParams)

// Make search request
Expand Down
5 changes: 2 additions & 3 deletions src/client/instant-meilisearch-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,9 @@ export function instantMeiliSearch(
const searchResolver = SearchResolver(SearchCache())
// paginationTotalHits can be 0 as it is a valid number
let defaultFacetDistribution: any = {}
const meilisearchClient = new MeiliSearch({ host: hostUrl, apiKey: apiKey })

return {
MeiliSearchClient: new MeiliSearch({ host: hostUrl, apiKey: apiKey }),

/**
* @param {readonlyAlgoliaMultipleQueriesQuery[]} instantSearchRequests
* @returns {Array}
Expand All @@ -57,7 +56,7 @@ export function instantMeiliSearch(
const searchResponse = await searchResolver.searchResponse(
searchContext,
adaptedSearchRequest,
this.MeiliSearchClient
meilisearchClient
)

// Cache first facets distribution of the instantMeilisearch instance
Expand Down
3 changes: 2 additions & 1 deletion src/contexts/search-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ export function createSearchContext(
hitsPerPage: instantSearchParams?.hitsPerPage,
page: instantSearchParams?.page,
})

const searchContext: SearchContext = {
...options,
...instantSearchParams,
sort: sortByArray.join(':') || '',
indexUid,
pagination,
defaultFacetDistribution,
placeholderSearch: !options.placeholderSearch, // true by default
placeholderSearch: options.placeholderSearch !== false, // true by default
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This option is protected by type? Because if the user add 123, 0 in this option, the option will be true :)

keepZeroFacets: !!options.keepZeroFacets, // false by default
finitePagination: !!options.finitePagination, // false by default
}
Expand Down
5 changes: 2 additions & 3 deletions src/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export type PaginationContext = {
hitsPerPage: number
page: number
}

export type PaginationParams = {
paginationTotalHits?: number
hitsPerPage?: number
Expand All @@ -84,6 +85,4 @@ export type SearchContext = Omit<
pagination: PaginationContext
}

export type InstantMeiliSearchInstance = SearchClient & {
MeiliSearchClient: MeiliSearch
}
export type InstantMeiliSearchInstance = SearchClient
13 changes: 12 additions & 1 deletion tests/assets/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { instantMeiliSearch } from '../../src'
import { MeiliSearch } from 'meilisearch'

const dataset = [
{
Expand Down Expand Up @@ -223,5 +224,15 @@ const wrongSearchClient = instantMeiliSearch(
'http://localhost:7777',
'masterKey'
)
const meilisearchClient = new MeiliSearch({
host: 'http://localhost:7700',
apiKey: 'masterKey',
})

export { searchClient, dataset, wrongSearchClient, geoDataset }
export {
searchClient,
dataset,
wrongSearchClient,
geoDataset,
meilisearchClient,
}
7 changes: 0 additions & 7 deletions tests/base.tests.ts

This file was deleted.

12 changes: 4 additions & 8 deletions tests/build.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ const CJSclient = CJSinstantMeiliSearch('http://localhost:7700', 'masterKey')
const instantsearch = require('instantsearch.js')

test('UMD client should correctly created', () => {
expect(UMDclient.MeiliSearchClient.config.apiKey).toBe('masterKey')
expect(UMDclient.search).not.toBeUndefined()
})

test('CJS client should correctly created', () => {
expect(CJSclient.MeiliSearchClient.config.apiKey).toBe('masterKey')
expect(CJSclient.search).not.toBeUndefined()
})

test('CJS instantsearch client should correctly created', () => {
Expand All @@ -23,9 +23,7 @@ test('CJS instantsearch client should correctly created', () => {
searchClient: CJSclient,
})
expect(CJSInstantSearch.indexName).toBe('cjs_index')
expect(CJSInstantSearch.client.MeiliSearchClient.config.apiKey).toBe(
'masterKey'
)
expect(CJSInstantSearch.client.search).not.toBeUndefined()
})

test('UMD instantsearch client should correctly created', () => {
Expand All @@ -34,7 +32,5 @@ test('UMD instantsearch client should correctly created', () => {
searchClient: UMDclient,
})
expect(UMDInstantSearch.indexName).toBe('umd_index')
expect(UMDInstantSearch.client.MeiliSearchClient.config.apiKey).toBe(
'masterKey'
)
expect(UMDInstantSearch.client.search).not.toBeUndefined()
})
23 changes: 12 additions & 11 deletions tests/configure.attributes-to-retrieve.tests.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import { searchClient, dataset, Movies } from './assets/utils'
import {
searchClient,
dataset,
Movies,
meilisearchClient,
} from './assets/utils'

describe('Instant Meilisearch Browser test', () => {
beforeAll(async () => {
const deleteTask = await searchClient.MeiliSearchClient.deleteIndex(
'movies'
)
await searchClient.MeiliSearchClient.waitForTask(deleteTask.uid)
const deleteTask = await meilisearchClient.deleteIndex('movies')
await meilisearchClient.waitForTask(deleteTask.uid)

const documentsTask = await searchClient.MeiliSearchClient.index(
'movies'
).addDocuments(dataset)
await searchClient.MeiliSearchClient.index('movies').waitForTask(
documentsTask.uid
)
const documentsTask = await meilisearchClient
.index('movies')
.addDocuments(dataset)
await meilisearchClient.index('movies').waitForTask(documentsTask.uid)
})

test('Test attributesToRetrieve on no attributes', async () => {
Expand Down
24 changes: 10 additions & 14 deletions tests/facets-distribution.tests.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
import { searchClient, dataset } from './assets/utils'
import { searchClient, dataset, meilisearchClient } from './assets/utils'

describe('Instant Meilisearch Browser test', () => {
beforeAll(async () => {
const deleteTask = await searchClient.MeiliSearchClient.deleteIndex(
'movies'
)
await searchClient.MeiliSearchClient.waitForTask(deleteTask.uid)
await searchClient.MeiliSearchClient.index(
'movies'
).updateFilterableAttributes(['genres'])
const documentsTask = await searchClient.MeiliSearchClient.index(
'movies'
).addDocuments(dataset)
await searchClient.MeiliSearchClient.index('movies').waitForTask(
documentsTask.uid
)
const deleteTask = await meilisearchClient.deleteIndex('movies')
await meilisearchClient.waitForTask(deleteTask.uid)
await meilisearchClient
.index('movies')
.updateFilterableAttributes(['genres'])
const documentsTask = await meilisearchClient
.index('movies')
.addDocuments(dataset)
await meilisearchClient.index('movies').waitForTask(documentsTask.uid)
})

test('Test empty array on facetsDistribution', async () => {
Expand Down
29 changes: 15 additions & 14 deletions tests/filter.tests.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { searchClient, dataset, Movies } from './assets/utils'
import {
searchClient,
dataset,
Movies,
meilisearchClient,
} from './assets/utils'

describe('Instant Meilisearch Browser test', () => {
beforeAll(async () => {
const deleteTask = await searchClient.MeiliSearchClient.deleteIndex(
'movies'
)
await searchClient.MeiliSearchClient.waitForTask(deleteTask.uid)
await searchClient.MeiliSearchClient.index(
'movies'
).updateFilterableAttributes(['genres', 'title'])
const documentsTask = await searchClient.MeiliSearchClient.index(
'movies'
).addDocuments(dataset)
await searchClient.MeiliSearchClient.index('movies').waitForTask(
documentsTask.uid
)
const deleteTask = await meilisearchClient.deleteIndex('movies')
await meilisearchClient.waitForTask(deleteTask.uid)
await meilisearchClient
.index('movies')
.updateFilterableAttributes(['genres', 'title'])
const documentsTask = await meilisearchClient
.index('movies')
.addDocuments(dataset)
await meilisearchClient.index('movies').waitForTask(documentsTask.uid)
})

test('Test one string facet on filter without a query', async () => {
Expand Down
33 changes: 16 additions & 17 deletions tests/geosearch.tests.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
import { searchClient, geoDataset, City } from './assets/utils'
import {
searchClient,
geoDataset,
City,
meilisearchClient,
} from './assets/utils'

describe('Instant Meilisearch Browser test', () => {
beforeAll(async () => {
const deleteTask = await searchClient.MeiliSearchClient.deleteIndex(
'geotest'
)
await searchClient.MeiliSearchClient.waitForTask(deleteTask.uid)
await searchClient.MeiliSearchClient.index(
'geotest'
).updateFilterableAttributes(['_geo'])
await searchClient.MeiliSearchClient.index(
'geotest'
).updateSortableAttributes(['_geo'])
const documentsTask = await searchClient.MeiliSearchClient.index(
'geotest'
).addDocuments(geoDataset)
await searchClient.MeiliSearchClient.index('movies').waitForTask(
documentsTask.uid
)
const deleteTask = await meilisearchClient.deleteIndex('geotest')
await meilisearchClient.waitForTask(deleteTask.uid)
await meilisearchClient
.index('geotest')
.updateFilterableAttributes(['_geo'])
await meilisearchClient.index('geotest').updateSortableAttributes(['_geo'])
const documentsTask = await meilisearchClient
.index('geotest')
.addDocuments(geoDataset)
await meilisearchClient.index('movies').waitForTask(documentsTask.uid)
})

test('Test aroundRadius and aroundLatLng in geo search', async () => {
Expand Down
29 changes: 15 additions & 14 deletions tests/highlight.tests.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { searchClient, dataset, Movies } from './assets/utils'
import {
searchClient,
dataset,
Movies,
meilisearchClient,
} from './assets/utils'

describe('Highlight Browser test', () => {
beforeAll(async () => {
const deleteTask = await searchClient.MeiliSearchClient.deleteIndex(
'movies'
)
await searchClient.MeiliSearchClient.waitForTask(deleteTask.uid)
await searchClient.MeiliSearchClient.index(
'movies'
).updateFilterableAttributes(['genres'])
const documentsTask = await searchClient.MeiliSearchClient.index(
'movies'
).addDocuments(dataset)
await searchClient.MeiliSearchClient.index('movies').waitForTask(
documentsTask.uid
)
const deleteTask = await meilisearchClient.deleteIndex('movies')
await meilisearchClient.waitForTask(deleteTask.uid)
await meilisearchClient
.index('movies')
.updateFilterableAttributes(['genres'])
const documentsTask = await meilisearchClient
.index('movies')
.addDocuments(dataset)
await meilisearchClient.index('movies').waitForTask(documentsTask.uid)
})

test('Test one attributesToHighlight on wrong attribute placeholder', async () => {
Expand Down
Loading