diff --git a/src/lib.js b/src/lib.js index a4bdcb1..85a688e 100644 --- a/src/lib.js +++ b/src/lib.js @@ -12,12 +12,9 @@ export function search(items, input, configuration, fulltext, facets) { const page = parseInt(input.page || 1); const is_all_filtered_items = input.is_all_filtered_items || false; - if ( - configuration.native_search_enabled === false && - (input.query || input.filter) - ) { + if (configuration.native_search_enabled === false && input.query) { throw new Error( - '"query" and "filter" options are not working once native search is disabled', + 'The "query" option is not working once native search is disabled' ); } @@ -34,6 +31,13 @@ export function search(items, input, configuration, fulltext, facets) { _ids = input._ids; } else if (input.ids) { _ids = facets.internal_ids_from_ids_map(input.ids); + + if (input.filter) { + _ids = items + .filter((v) => _ids.includes(v._id)) + .filter(input.filter) + .map((v) => v._id); + } //console.log(_ids); query_ids = new FastBitSet(_ids); } else if (fulltext && (input.query || input.filter)) { diff --git a/tests/searchSpec.js b/tests/searchSpec.js index 2dcece5..c62ec03 100644 --- a/tests/searchSpec.js +++ b/tests/searchSpec.js @@ -263,7 +263,7 @@ describe('search', function () { } catch (err) { assert.equal( err.message, - '"query" and "filter" options are not working once native search is disabled' + 'The "query" option is not working once native search is disabled' ); } @@ -362,6 +362,37 @@ describe('custom fulltext integration', function () { assert.equal(result.data.items.length, 2); done(); }); + it('makes faceted search after separated quasi fulltext with ids and filter', function test(done) { + let i = 10; + const temp_movies = movies.map((v) => { + v.id = i; + i += 10; + return v; + }); + + itemsjs = itemsJS(temp_movies, configuration); + + let result = itemsjs.search({ + ids: [50, 20, 10], + filter: function (v) { + return v.id === 10; + }, + }); + + assert.equal(result.data.items[0].id, 10); + assert.equal(result.data.items[0]._id, 1); + assert.equal(result.data.items.length, 1); + + result = itemsjs.search({ + ids: [50, 20], + filter: function (v) { + return v.id === 10; + }, + }); + + assert.equal(result.data.items.length, 0); + done(); + }); it('makes faceted search after separated quasi fulltext with custom id field', function test(done) { let i = 10;