'use strict';
var defaultsPure = require('../functions/defaultsPure');
var find = require('../functions/find');
var intersection = require('../functions/intersection');
var merge = require('../functions/merge');
var objectHasKeys = require('../functions/objectHasKeys');
var omit = require('../functions/omit');
var valToNumber = require('../functions/valToNumber');
var isValidUserToken = require('../utils/isValidUserToken');
var RefinementList = require('./RefinementList');
function isEqualNumericRefinement(a, b) {
if (Array.isArray(a) && Array.isArray(b)) {
return (
a.length === b.length &&
a.every(function (el, i) {
return isEqualNumericRefinement(b[i], el);
})
);
}
return a === b;
}
function findArray(array, searchedValue) {
return find(array, function (currentValue) {
return isEqualNumericRefinement(currentValue, searchedValue);
});
}
function SearchParameters(newParameters) {
var params = newParameters
? SearchParameters._parseNumbers(newParameters)
: {};
if (params.userToken !== undefined && !isValidUserToken(params.userToken)) {
console.warn(
'[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}'
);
}
this.facets = params.facets || [];
this.disjunctiveFacets = params.disjunctiveFacets || [];
this.hierarchicalFacets = params.hierarchicalFacets || [];
this.facetsRefinements = params.facetsRefinements || {};
this.facetsExcludes = params.facetsExcludes || {};
this.disjunctiveFacetsRefinements = params.disjunctiveFacetsRefinements || {};
this.numericRefinements = params.numericRefinements || {};
this.tagRefinements = params.tagRefinements || [];
this.hierarchicalFacetsRefinements =
params.hierarchicalFacetsRefinements || {};
var self = this;
Object.keys(params).forEach(function (paramName) {
var isKeyKnown = SearchParameters.PARAMETERS.indexOf(paramName) !== -1;
var isValueDefined = params[paramName] !== undefined;
if (!isKeyKnown && isValueDefined) {
self[paramName] = params[paramName];
}
});
}
SearchParameters.PARAMETERS = Object.keys(new SearchParameters());
SearchParameters._parseNumbers = function (partialState) {
if (partialState instanceof SearchParameters) return partialState;
var numbers = {};
var numberKeys = [
'aroundPrecision',
'aroundRadius',
'getRankingInfo',
'minWordSizefor2Typos',
'minWordSizefor1Typo',
'page',
'maxValuesPerFacet',
'distinct',
'minimumAroundRadius',
'hitsPerPage',
'minProximity',
];
numberKeys.forEach(function (k) {
var value = partialState[k];
if (typeof value === 'string') {
var parsedValue = parseFloat(value);
numbers[k] = isNaN(parsedValue) ? value : parsedValue;
}
});
if (Array.isArray(partialState.insideBoundingBox)) {
numbers.insideBoundingBox = partialState.insideBoundingBox.map(function (
geoRect
) {
if (Array.isArray(geoRect)) {
return geoRect.map(function (value) {
return parseFloat(value);
});
}
return geoRect;
});
}
if (partialState.numericRefinements) {
var numericRefinements = {};
Object.keys(partialState.numericRefinements).forEach(function (attribute) {
var operators = partialState.numericRefinements[attribute] || {};
numericRefinements[attribute] = {};
Object.keys(operators).forEach(function (operator) {
var values = operators[operator];
var parsedValues = values.map(function (v) {
if (Array.isArray(v)) {
return v.map(function (vPrime) {
if (typeof vPrime === 'string') {
return parseFloat(vPrime);
}
return vPrime;
});
} else if (typeof v === 'string') {
return parseFloat(v);
}
return v;
});
numericRefinements[attribute][operator] = parsedValues;
});
});
numbers.numericRefinements = numericRefinements;
}
return merge(partialState, numbers);
};
SearchParameters.make = function makeSearchParameters(newParameters) {
var instance = new SearchParameters(newParameters);
var hierarchicalFacets = newParameters.hierarchicalFacets || [];
hierarchicalFacets.forEach(function (facet) {
if (facet.rootPath) {
var currentRefinement = instance.getHierarchicalRefinement(facet.name);
if (
currentRefinement.length > 0 &&
currentRefinement[0].indexOf(facet.rootPath) !== 0
) {
instance = instance.clearRefinements(facet.name);
}
currentRefinement = instance.getHierarchicalRefinement(facet.name);
if (currentRefinement.length === 0) {
instance = instance.toggleHierarchicalFacetRefinement(
facet.name,
facet.rootPath
);
}
}
});
return instance;
};
SearchParameters.validate = function (currentState, parameters) {
var params = parameters || {};
if (
currentState.tagFilters &&
params.tagRefinements &&
params.tagRefinements.length > 0
) {
return new Error(
'[Tags] Cannot switch from the managed tag API to the advanced API. It is probably ' +
'an error, if it is really what you want, you should first clear the tags with clearTags method.'
);
}
if (currentState.tagRefinements.length > 0 && params.tagFilters) {
return new Error(
'[Tags] Cannot switch from the advanced tag API to the managed API. It is probably ' +
'an error, if it is not, you should first clear the tags with clearTags method.'
);
}
if (
currentState.numericFilters &&
params.numericRefinements &&
objectHasKeys(params.numericRefinements)
) {
return new Error(
"[Numeric filters] Can't switch from the advanced to the managed API. It" +
' is probably an error, if this is really what you want, you have to first' +
' clear the numeric filters.'
);
}
if (objectHasKeys(currentState.numericRefinements) && params.numericFilters) {
return new Error(
"[Numeric filters] Can't switch from the managed API to the advanced. It" +
' is probably an error, if this is really what you want, you have to first' +
' clear the numeric filters.'
);
}
return null;
};
SearchParameters.prototype = {
constructor: SearchParameters,
clearRefinements: function clearRefinements(attribute) {
var patch = {
numericRefinements: this._clearNumericRefinements(attribute),
facetsRefinements: RefinementList.clearRefinement(
this.facetsRefinements,
attribute,
'conjunctiveFacet'
),
facetsExcludes: RefinementList.clearRefinement(
this.facetsExcludes,
attribute,
'exclude'
),
disjunctiveFacetsRefinements: RefinementList.clearRefinement(
this.disjunctiveFacetsRefinements,
attribute,
'disjunctiveFacet'
),
hierarchicalFacetsRefinements: RefinementList.clearRefinement(
this.hierarchicalFacetsRefinements,
attribute,
'hierarchicalFacet'
),
};
if (
patch.numericRefinements === this.numericRefinements &&
patch.facetsRefinements === this.facetsRefinements &&
patch.facetsExcludes === this.facetsExcludes &&
patch.disjunctiveFacetsRefinements ===
this.disjunctiveFacetsRefinements &&
patch.hierarchicalFacetsRefinements === this.hierarchicalFacetsRefinements
) {
return this;
}
return this.setQueryParameters(patch);
},
clearTags: function clearTags() {
if (this.tagFilters === undefined && this.tagRefinements.length === 0)
return this;
return this.setQueryParameters({
tagFilters: undefined,
tagRefinements: [],
});
},
setIndex: function setIndex(index) {
if (index === this.index) return this;
return this.setQueryParameters({
index: index,
});
},
setQuery: function setQuery(newQuery) {
if (newQuery === this.query) return this;
return this.setQueryParameters({
query: newQuery,
});
},
setPage: function setPage(newPage) {
if (newPage === this.page) return this;
return this.setQueryParameters({
page: newPage,
});
},
setFacets: function setFacets(facets) {
return this.setQueryParameters({
facets: facets,
});
},
setDisjunctiveFacets: function setDisjunctiveFacets(facets) {
return this.setQueryParameters({
disjunctiveFacets: facets,
});
},
setHitsPerPage: function setHitsPerPage(n) {
if (this.hitsPerPage === n) return this;
return this.setQueryParameters({
hitsPerPage: n,
});
},
setTypoTolerance: function setTypoTolerance(typoTolerance) {
if (this.typoTolerance === typoTolerance) return this;
return this.setQueryParameters({
typoTolerance: typoTolerance,
});
},
addNumericRefinement: function (attribute, operator, value) {
var val = valToNumber(value);
if (this.isNumericRefined(attribute, operator, val)) return this;
var mod = merge({}, this.numericRefinements);
mod[attribute] = merge({}, mod[attribute]);
if (mod[attribute][operator]) {
mod[attribute][operator] = mod[attribute][operator].slice();
mod[attribute][operator].push(val);
} else {
mod[attribute][operator] = [val];
}
return this.setQueryParameters({
numericRefinements: mod,
});
},
getConjunctiveRefinements: function (facetName) {
if (!this.isConjunctiveFacet(facetName)) {
return [];
}
return this.facetsRefinements[facetName] || [];
},
getDisjunctiveRefinements: function (facetName) {
if (!this.isDisjunctiveFacet(facetName)) {
return [];
}
return this.disjunctiveFacetsRefinements[facetName] || [];
},
getHierarchicalRefinement: function (facetName) {
return this.hierarchicalFacetsRefinements[facetName] || [];
},
getExcludeRefinements: function (facetName) {
if (!this.isConjunctiveFacet(facetName)) {
return [];
}
return this.facetsExcludes[facetName] || [];
},
removeNumericRefinement: function (attribute, operator, number) {
var paramValue = number;
if (paramValue !== undefined) {
if (!this.isNumericRefined(attribute, operator, paramValue)) {
return this;
}
return this.setQueryParameters({
numericRefinements: this._clearNumericRefinements(function (
value,
key
) {
return (
key === attribute &&
value.op === operator &&
isEqualNumericRefinement(value.val, valToNumber(paramValue))
);
}),
});
} else if (operator !== undefined) {
if (!this.isNumericRefined(attribute, operator)) return this;
return this.setQueryParameters({
numericRefinements: this._clearNumericRefinements(function (
value,
key
) {
return key === attribute && value.op === operator;
}),
});
}
if (!this.isNumericRefined(attribute)) return this;
return this.setQueryParameters({
numericRefinements: this._clearNumericRefinements(function (value, key) {
return key === attribute;
}),
});
},
getNumericRefinements: function (facetName) {
return this.numericRefinements[facetName] || {};
},
getNumericRefinement: function (attribute, operator) {
return (
this.numericRefinements[attribute] &&
this.numericRefinements[attribute][operator]
);
},
_clearNumericRefinements: function _clearNumericRefinements(attribute) {
if (attribute === undefined) {
if (!objectHasKeys(this.numericRefinements)) {
return this.numericRefinements;
}
return {};
} else if (typeof attribute === 'string') {
return omit(this.numericRefinements, [attribute]);
} else if (typeof attribute === 'function') {
var hasChanged = false;
var numericRefinements = this.numericRefinements;
var newNumericRefinements = Object.keys(numericRefinements).reduce(
function (memo, key) {
var operators = numericRefinements[key];
var operatorList = {};
operators = operators || {};
Object.keys(operators).forEach(function (operator) {
var values = operators[operator] || [];
var outValues = [];
values.forEach(function (value) {
var predicateResult = attribute(
{ val: value, op: operator },
key,
'numeric'
);
if (!predicateResult) outValues.push(value);
});
if (outValues.length !== values.length) {
hasChanged = true;
}
operatorList[operator] = outValues;
});
memo[key] = operatorList;
return memo;
},
{}
);
if (hasChanged) return newNumericRefinements;
return this.numericRefinements;
}
return undefined;
},
addFacet: function addFacet(facet) {
if (this.isConjunctiveFacet(facet)) {
return this;
}
return this.setQueryParameters({
facets: this.facets.concat([facet]),
});
},
addDisjunctiveFacet: function addDisjunctiveFacet(facet) {
if (this.isDisjunctiveFacet(facet)) {
return this;
}
return this.setQueryParameters({
disjunctiveFacets: this.disjunctiveFacets.concat([facet]),
});
},
addHierarchicalFacet: function addHierarchicalFacet(hierarchicalFacet) {
if (this.isHierarchicalFacet(hierarchicalFacet.name)) {
throw new Error(
'Cannot declare two hierarchical facets with the same name: `' +
hierarchicalFacet.name +
'`'
);
}
return this.setQueryParameters({
hierarchicalFacets: this.hierarchicalFacets.concat([hierarchicalFacet]),
});
},
addFacetRefinement: function addFacetRefinement(facet, value) {
if (!this.isConjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the facets attribute of the helper configuration'
);
}
if (RefinementList.isRefined(this.facetsRefinements, facet, value))
return this;
return this.setQueryParameters({
facetsRefinements: RefinementList.addRefinement(
this.facetsRefinements,
facet,
value
),
});
},
addExcludeRefinement: function addExcludeRefinement(facet, value) {
if (!this.isConjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the facets attribute of the helper configuration'
);
}
if (RefinementList.isRefined(this.facetsExcludes, facet, value))
return this;
return this.setQueryParameters({
facetsExcludes: RefinementList.addRefinement(
this.facetsExcludes,
facet,
value
),
});
},
addDisjunctiveFacetRefinement: function addDisjunctiveFacetRefinement(
facet,
value
) {
if (!this.isDisjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the disjunctiveFacets attribute of the helper configuration'
);
}
if (
RefinementList.isRefined(this.disjunctiveFacetsRefinements, facet, value)
)
return this;
return this.setQueryParameters({
disjunctiveFacetsRefinements: RefinementList.addRefinement(
this.disjunctiveFacetsRefinements,
facet,
value
),
});
},
addTagRefinement: function addTagRefinement(tag) {
if (this.isTagRefined(tag)) return this;
var modification = {
tagRefinements: this.tagRefinements.concat(tag),
};
return this.setQueryParameters(modification);
},
removeFacet: function removeFacet(facet) {
if (!this.isConjunctiveFacet(facet)) {
return this;
}
return this.clearRefinements(facet).setQueryParameters({
facets: this.facets.filter(function (f) {
return f !== facet;
}),
});
},
removeDisjunctiveFacet: function removeDisjunctiveFacet(facet) {
if (!this.isDisjunctiveFacet(facet)) {
return this;
}
return this.clearRefinements(facet).setQueryParameters({
disjunctiveFacets: this.disjunctiveFacets.filter(function (f) {
return f !== facet;
}),
});
},
removeHierarchicalFacet: function removeHierarchicalFacet(facet) {
if (!this.isHierarchicalFacet(facet)) {
return this;
}
return this.clearRefinements(facet).setQueryParameters({
hierarchicalFacets: this.hierarchicalFacets.filter(function (f) {
return f.name !== facet;
}),
});
},
removeFacetRefinement: function removeFacetRefinement(facet, value) {
if (!this.isConjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the facets attribute of the helper configuration'
);
}
if (!RefinementList.isRefined(this.facetsRefinements, facet, value))
return this;
return this.setQueryParameters({
facetsRefinements: RefinementList.removeRefinement(
this.facetsRefinements,
facet,
value
),
});
},
removeExcludeRefinement: function removeExcludeRefinement(facet, value) {
if (!this.isConjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the facets attribute of the helper configuration'
);
}
if (!RefinementList.isRefined(this.facetsExcludes, facet, value))
return this;
return this.setQueryParameters({
facetsExcludes: RefinementList.removeRefinement(
this.facetsExcludes,
facet,
value
),
});
},
removeDisjunctiveFacetRefinement: function removeDisjunctiveFacetRefinement(
facet,
value
) {
if (!this.isDisjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the disjunctiveFacets attribute of the helper configuration'
);
}
if (
!RefinementList.isRefined(this.disjunctiveFacetsRefinements, facet, value)
)
return this;
return this.setQueryParameters({
disjunctiveFacetsRefinements: RefinementList.removeRefinement(
this.disjunctiveFacetsRefinements,
facet,
value
),
});
},
removeTagRefinement: function removeTagRefinement(tag) {
if (!this.isTagRefined(tag)) return this;
var modification = {
tagRefinements: this.tagRefinements.filter(function (t) {
return t !== tag;
}),
};
return this.setQueryParameters(modification);
},
toggleRefinement: function toggleRefinement(facet, value) {
return this.toggleFacetRefinement(facet, value);
},
toggleFacetRefinement: function toggleFacetRefinement(facet, value) {
if (this.isHierarchicalFacet(facet)) {
return this.toggleHierarchicalFacetRefinement(facet, value);
} else if (this.isConjunctiveFacet(facet)) {
return this.toggleConjunctiveFacetRefinement(facet, value);
} else if (this.isDisjunctiveFacet(facet)) {
return this.toggleDisjunctiveFacetRefinement(facet, value);
}
throw new Error(
'Cannot refine the undeclared facet ' +
facet +
'; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets'
);
},
toggleConjunctiveFacetRefinement: function toggleConjunctiveFacetRefinement(
facet,
value
) {
if (!this.isConjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the facets attribute of the helper configuration'
);
}
return this.setQueryParameters({
facetsRefinements: RefinementList.toggleRefinement(
this.facetsRefinements,
facet,
value
),
});
},
toggleExcludeFacetRefinement: function toggleExcludeFacetRefinement(
facet,
value
) {
if (!this.isConjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the facets attribute of the helper configuration'
);
}
return this.setQueryParameters({
facetsExcludes: RefinementList.toggleRefinement(
this.facetsExcludes,
facet,
value
),
});
},
toggleDisjunctiveFacetRefinement: function toggleDisjunctiveFacetRefinement(
facet,
value
) {
if (!this.isDisjunctiveFacet(facet)) {
throw new Error(
facet +
' is not defined in the disjunctiveFacets attribute of the helper configuration'
);
}
return this.setQueryParameters({
disjunctiveFacetsRefinements: RefinementList.toggleRefinement(
this.disjunctiveFacetsRefinements,
facet,
value
),
});
},
toggleHierarchicalFacetRefinement: function toggleHierarchicalFacetRefinement(
facet,
value
) {
if (!this.isHierarchicalFacet(facet)) {
throw new Error(
facet +
' is not defined in the hierarchicalFacets attribute of the helper configuration'
);
}
var separator = this._getHierarchicalFacetSeparator(
this.getHierarchicalFacetByName(facet)
);
var mod = {};
var upOneOrMultipleLevel =
this.hierarchicalFacetsRefinements[facet] !== undefined &&
this.hierarchicalFacetsRefinements[facet].length > 0 &&
(this.hierarchicalFacetsRefinements[facet][0] === value ||
this.hierarchicalFacetsRefinements[facet][0].indexOf(
value + separator
) === 0);
if (upOneOrMultipleLevel) {
if (value.indexOf(separator) === -1) {
mod[facet] = [];
} else {
mod[facet] = [value.slice(0, value.lastIndexOf(separator))];
}
} else {
mod[facet] = [value];
}
return this.setQueryParameters({
hierarchicalFacetsRefinements: defaultsPure(
{},
mod,
this.hierarchicalFacetsRefinements
),
});
},
addHierarchicalFacetRefinement: function (facet, path) {
if (this.isHierarchicalFacetRefined(facet)) {
throw new Error(facet + ' is already refined.');
}
if (!this.isHierarchicalFacet(facet)) {
throw new Error(
facet +
' is not defined in the hierarchicalFacets attribute of the helper configuration.'
);
}
var mod = {};
mod[facet] = [path];
return this.setQueryParameters({
hierarchicalFacetsRefinements: defaultsPure(
{},
mod,
this.hierarchicalFacetsRefinements
),
});
},
removeHierarchicalFacetRefinement: function (facet) {
if (!this.isHierarchicalFacetRefined(facet)) {
return this;
}
var mod = {};
mod[facet] = [];
return this.setQueryParameters({
hierarchicalFacetsRefinements: defaultsPure(
{},
mod,
this.hierarchicalFacetsRefinements
),
});
},
toggleTagRefinement: function toggleTagRefinement(tag) {
if (this.isTagRefined(tag)) {
return this.removeTagRefinement(tag);
}
return this.addTagRefinement(tag);
},
isDisjunctiveFacet: function (facet) {
return this.disjunctiveFacets.indexOf(facet) > -1;
},
isHierarchicalFacet: function (facetName) {
return this.getHierarchicalFacetByName(facetName) !== undefined;
},
isConjunctiveFacet: function (facet) {
return this.facets.indexOf(facet) > -1;
},
isFacetRefined: function isFacetRefined(facet, value) {
if (!this.isConjunctiveFacet(facet)) {
return false;
}
return RefinementList.isRefined(this.facetsRefinements, facet, value);
},
isExcludeRefined: function isExcludeRefined(facet, value) {
if (!this.isConjunctiveFacet(facet)) {
return false;
}
return RefinementList.isRefined(this.facetsExcludes, facet, value);
},
isDisjunctiveFacetRefined: function isDisjunctiveFacetRefined(facet, value) {
if (!this.isDisjunctiveFacet(facet)) {
return false;
}
return RefinementList.isRefined(
this.disjunctiveFacetsRefinements,
facet,
value
);
},
isHierarchicalFacetRefined: function isHierarchicalFacetRefined(
facet,
value
) {
if (!this.isHierarchicalFacet(facet)) {
return false;
}
var refinements = this.getHierarchicalRefinement(facet);
if (!value) {
return refinements.length > 0;
}
return refinements.indexOf(value) !== -1;
},
isNumericRefined: function isNumericRefined(attribute, operator, value) {
if (value === undefined && operator === undefined) {
return Boolean(this.numericRefinements[attribute]);
}
var isOperatorDefined =
this.numericRefinements[attribute] &&
this.numericRefinements[attribute][operator] !== undefined;
if (value === undefined || !isOperatorDefined) {
return isOperatorDefined;
}
var parsedValue = valToNumber(value);
var isAttributeValueDefined =
findArray(this.numericRefinements[attribute][operator], parsedValue) !==
undefined;
return isOperatorDefined && isAttributeValueDefined;
},
isTagRefined: function isTagRefined(tag) {
return this.tagRefinements.indexOf(tag) !== -1;
},
getRefinedDisjunctiveFacets: function getRefinedDisjunctiveFacets() {
var self = this;
var disjunctiveNumericRefinedFacets = intersection(
Object.keys(this.numericRefinements).filter(function (facet) {
return Object.keys(self.numericRefinements[facet]).length > 0;
}),
this.disjunctiveFacets
);
return Object.keys(this.disjunctiveFacetsRefinements)
.filter(function (facet) {
return self.disjunctiveFacetsRefinements[facet].length > 0;
})
.concat(disjunctiveNumericRefinedFacets)
.concat(this.getRefinedHierarchicalFacets())
.sort();
},
getRefinedHierarchicalFacets: function getRefinedHierarchicalFacets() {
var self = this;
return intersection(
this.hierarchicalFacets.map(function (facet) {
return facet.name;
}),
Object.keys(this.hierarchicalFacetsRefinements).filter(function (facet) {
return self.hierarchicalFacetsRefinements[facet].length > 0;
})
).sort();
},
getUnrefinedDisjunctiveFacets: function () {
var refinedFacets = this.getRefinedDisjunctiveFacets();
return this.disjunctiveFacets.filter(function (f) {
return refinedFacets.indexOf(f) === -1;
});
},
managedParameters: [
'index',
'facets',
'disjunctiveFacets',
'facetsRefinements',
'hierarchicalFacets',
'facetsExcludes',
'disjunctiveFacetsRefinements',
'numericRefinements',
'tagRefinements',
'hierarchicalFacetsRefinements',
],
getQueryParams: function getQueryParams() {
var managedParameters = this.managedParameters;
var queryParams = {};
var self = this;
Object.keys(this).forEach(function (paramName) {
var paramValue = self[paramName];
if (
managedParameters.indexOf(paramName) === -1 &&
paramValue !== undefined
) {
queryParams[paramName] = paramValue;
}
});
return queryParams;
},
setQueryParameter: function setParameter(parameter, value) {
if (this[parameter] === value) return this;
var modification = {};
modification[parameter] = value;
return this.setQueryParameters(modification);
},
setQueryParameters: function setQueryParameters(params) {
if (!params) return this;
var error = SearchParameters.validate(this, params);
if (error) {
throw error;
}
var self = this;
var nextWithNumbers = SearchParameters._parseNumbers(params);
var previousPlainObject = Object.keys(this).reduce(function (acc, key) {
acc[key] = self[key];
return acc;
}, {});
var nextPlainObject = Object.keys(nextWithNumbers).reduce(function (
previous,
key
) {
var isPreviousValueDefined = previous[key] !== undefined;
var isNextValueDefined = nextWithNumbers[key] !== undefined;
if (isPreviousValueDefined && !isNextValueDefined) {
return omit(previous, [key]);
}
if (isNextValueDefined) {
previous[key] = nextWithNumbers[key];
}
return previous;
},
previousPlainObject);
return new this.constructor(nextPlainObject);
},
resetPage: function () {
if (this.page === undefined) {
return this;
}
return this.setPage(0);
},
_getHierarchicalFacetSortBy: function (hierarchicalFacet) {
return hierarchicalFacet.sortBy || ['isRefined:desc', 'name:asc'];
},
_getHierarchicalFacetSeparator: function (hierarchicalFacet) {
return hierarchicalFacet.separator || ' > ';
},
_getHierarchicalRootPath: function (hierarchicalFacet) {
return hierarchicalFacet.rootPath || null;
},
_getHierarchicalShowParentLevel: function (hierarchicalFacet) {
if (typeof hierarchicalFacet.showParentLevel === 'boolean') {
return hierarchicalFacet.showParentLevel;
}
return true;
},
getHierarchicalFacetByName: function (hierarchicalFacetName) {
return find(this.hierarchicalFacets, function (f) {
return f.name === hierarchicalFacetName;
});
},
getHierarchicalFacetBreadcrumb: function (facetName) {
if (!this.isHierarchicalFacet(facetName)) {
return [];
}
var refinement = this.getHierarchicalRefinement(facetName)[0];
if (!refinement) return [];
var separator = this._getHierarchicalFacetSeparator(
this.getHierarchicalFacetByName(facetName)
);
var path = refinement.split(separator);
return path.map(function (part) {
return part.trim();
});
},
toString: function () {
return JSON.stringify(this, null, 2);
},
};
module.exports = SearchParameters;