UNPKG

@ecomplus/search-engine

Version:

JS lib to handle products search with E-Com Plus stores

75 lines (67 loc) 2.06 kB
export default (self, gridId, textOptions) => { // nested ELS object // http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html if (Array.isArray(textOptions)) { // add/update filter return self.mergeFilter({ nested: { path: 'specs', query: { bool: { filter: [{ term: { 'specs.grid': gridId } }, { terms: { 'specs.text': textOptions } }] } } } }) } if (textOptions === null) { // remove filter for current grid const filters = self.dsl.query && self.dsl.query.bool && self.dsl.query.bool.filter if (Array.isArray(filters)) { for (let i = 0; i < filters.length; i++) { if (filters[i] && filters[i].nested) { const { path, query } = filters[i].nested if (path === 'specs' && query && query.bool) { // search from grid ID on nested filters const rules = query.bool.filter if (Array.isArray(rules) && rules.find(({ term }) => term && term['specs.grid'] === gridId)) { // grid ID found // remove filters array element filters.splice(i, 1) return self } } } } } } return self } /** * @method * @name EcomSearch#setSpec * @description Add, update or remove search filter * by product specification based on grid ID and list of text options to match. * * @param {string} gridId - Grid ID such as 'size' * @param {array|null} textOptions - List of chosen options such as `['M', 'G']` * or null to clear current grid filter * @returns {self} * * @example // Set filter by size specification and run search request search.setSpec('size', ['M', 'G']).fetch() // Update size options and search again search.setSpec('size', ['P', 'M', 'G']).fetch() * @example // Remove filter by size for next search search.setSpec('size', null) */