Skip to content

Commit 40cf46b

Browse files
stanlp1esezen
andauthored
[CI-5649] Add pre filter expression per section (#447)
* add pre filter expression per section * remove only * Update and add test --------- Co-authored-by: Enes Kutay SEZEN <eneskutaysezen@gmail.com>
1 parent 36aee5e commit 40cf46b

3 files changed

Lines changed: 81 additions & 0 deletions

File tree

spec/src/modules/autocomplete.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,77 @@ describe(`ConstructorIO - Autocomplete${bundledDescriptionSuffix}`, () => {
428428
});
429429
});
430430

431+
it('Should return a response with a valid query and preFilterExpressionPerSection', (done) => {
432+
const preFilterExpressionPerSection = {
433+
Products: {
434+
or: [
435+
{
436+
and: [
437+
{ name: 'group_id', value: 'BrandXY' },
438+
{ name: 'Color', value: 'red' },
439+
],
440+
},
441+
{
442+
and: [
443+
{ name: 'Color', value: 'blue' },
444+
{ name: 'Brand', value: 'XYZ' },
445+
],
446+
},
447+
],
448+
},
449+
};
450+
const { autocomplete } = new ConstructorIO({
451+
apiKey: testApiKey,
452+
fetch: fetchSpy,
453+
});
454+
455+
autocomplete.getAutocompleteResults(query, { preFilterExpressionPerSection }).then((res) => {
456+
const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy);
457+
458+
expect(res).to.have.property('request').to.be.an('object');
459+
expect(res).to.have.property('result_id').to.be.an('string');
460+
expect(requestedUrlParams.pre_filter_expression).to.have.property('Products');
461+
// Parse before comparing so an accidental double-serialization would fail this assertion
462+
const products = JSON.parse(requestedUrlParams.pre_filter_expression.Products);
463+
expect(products).to.eql(preFilterExpressionPerSection.Products);
464+
done();
465+
});
466+
});
467+
468+
it('Should return a response with a valid query, and multiple preFilterExpressionPerSection', (done) => {
469+
const preFilterExpressionPerSection = {
470+
Products: {
471+
and: [
472+
{ name: 'group_id', value: 'BrandXY' },
473+
{ name: 'Color', value: 'red' },
474+
],
475+
},
476+
'Search Suggestions': {
477+
and: [
478+
{ name: 'Brand', value: 'XYZ' },
479+
],
480+
},
481+
};
482+
const { autocomplete } = new ConstructorIO({
483+
apiKey: testApiKey,
484+
fetch: fetchSpy,
485+
});
486+
487+
autocomplete.getAutocompleteResults(query, { preFilterExpressionPerSection }).then((res) => {
488+
const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy);
489+
490+
expect(res).to.have.property('request').to.be.an('object');
491+
expect(res).to.have.property('result_id').to.be.an('string');
492+
expect(requestedUrlParams.pre_filter_expression).to.have.property('Products');
493+
expect(requestedUrlParams.pre_filter_expression).to.have.property('Search Suggestions');
494+
const products = JSON.parse(requestedUrlParams.pre_filter_expression.Products);
495+
const searchSuggestions = JSON.parse(requestedUrlParams.pre_filter_expression['Search Suggestions']);
496+
expect(products).to.eql(preFilterExpressionPerSection.Products);
497+
expect(searchSuggestions).to.eql(preFilterExpressionPerSection['Search Suggestions']);
498+
done();
499+
});
500+
});
501+
431502
it('Should return a response with a valid query, section and fmtOptions', (done) => {
432503
const hiddenFields = ['testField', 'hiddenField2'];
433504
const fmtOptions = { hidden_fields: hiddenFields };

src/modules/autocomplete.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ function createAutocompleteUrl(query, parameters, options) {
5151
hiddenFields,
5252
variationsMap,
5353
preFilterExpression,
54+
preFilterExpressionPerSection,
5455
qsParam,
5556
fmtOptions,
5657
} = parameters;
@@ -84,6 +85,13 @@ function createAutocompleteUrl(query, parameters, options) {
8485
queryParams.pre_filter_expression = JSON.stringify(preFilterExpression);
8586
}
8687

88+
// Pull filter expression per section from parameters
89+
if (preFilterExpressionPerSection) {
90+
Object.keys(preFilterExpressionPerSection).forEach((section) => {
91+
queryParams[`pre_filter_expression[${section}]`] = JSON.stringify(preFilterExpressionPerSection[section]);
92+
});
93+
}
94+
8795
// Pull format options from parameters
8896
if (fmtOptions) {
8997
queryParams.fmt_options = fmtOptions;
@@ -144,6 +152,7 @@ class Autocomplete {
144152
* @param {object} [parameters.resultsPerSection] - Number of results to return (value) per section (key)
145153
* @param {object} [parameters.fmtOptions] - An object containing options to format different aspects of the response. Please refer to https://docs.constructor.com/reference/v1-autocomplete-get-autocomplete-results for details
146154
* @param {object} [parameters.preFilterExpression] - Faceting expression to scope autocomplete results. Please refer to https://docs.constructor.com/reference/configuration-collections for details
155+
* @param {object} [parameters.preFilterExpressionPerSection] - Faceting expression to scope autocomplete results per section (key). Please refer to https://docs.constructor.com/reference/configuration-collections for details
147156
* @param {string[]} [parameters.hiddenFields] - Hidden metadata fields to return
148157
* @param {object} [parameters.variationsMap] - The variations map object to aggregate variations. Please refer to https://docs.constructor.com/reference/shared-variations-mapping for details
149158
* @param {object} [parameters.qsParam] - object of additional query parameters to be appended to requests for results

src/types/autocomplete.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface IAutocompleteParameters {
2020
hiddenFields?: string[];
2121
variationsMap?: VariationsMap;
2222
preFilterExpression?: FilterExpression;
23+
preFilterExpressionPerSection?: Record<string, FilterExpression>;
2324
qsParam?: Record<string, any>;
2425
fmtOptions?: FmtOptions;
2526
}

0 commit comments

Comments
 (0)