diff --git a/packages/algoliasearch-helper/src/SearchParameters/index.js b/packages/algoliasearch-helper/src/SearchParameters/index.js index b37836cf72..464c1da5a0 100644 --- a/packages/algoliasearch-helper/src/SearchParameters/index.js +++ b/packages/algoliasearch-helper/src/SearchParameters/index.js @@ -3,7 +3,6 @@ var keys = require('lodash/keys'); var intersection = require('lodash/intersection'); var forOwn = require('lodash/forOwn'); -var forEach = require('lodash/forEach'); var filter = require('lodash/filter'); var reduce = require('lodash/reduce'); var isNaN = require('lodash/isNaN'); @@ -500,7 +499,7 @@ SearchParameters._parseNumbers = function(partialState) { 'minProximity' ]; - forEach(numberKeys, function(k) { + numberKeys.forEach(function(k) { var value = partialState[k]; if (typeof value === 'string') { var parsedValue = parseFloat(value); @@ -520,9 +519,11 @@ SearchParameters._parseNumbers = function(partialState) { if (partialState.numericRefinements) { var numericRefinements = {}; - forEach(partialState.numericRefinements, function(operators, attribute) { + Object.keys(partialState.numericRefinements).forEach(function(attribute) { + var operators = partialState.numericRefinements[attribute] || {}; numericRefinements[attribute] = {}; - forEach(operators, function(values, operator) { + 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) { @@ -554,7 +555,8 @@ SearchParameters._parseNumbers = function(partialState) { SearchParameters.make = function makeSearchParameters(newParameters) { var instance = new SearchParameters(newParameters); - forEach(newParameters.hierarchicalFacets, function(facet) { + var hierarchicalFacets = newParameters.hierarchicalFacets || []; + hierarchicalFacets.forEach(function(facet) { if (facet.rootPath) { var currentRefinement = instance.getHierarchicalRefinement(facet.name); @@ -902,9 +904,11 @@ SearchParameters.prototype = { var newNumericRefinements = reduce(this.numericRefinements, function(memo, operators, key) { var operatorList = {}; - forEach(operators, function(values, operator) { + operators = operators || {}; + Object.keys(operators).forEach(function(operator) { + var values = operators[operator] || []; var outValues = []; - forEach(values, function(value) { + values.forEach(function(value) { var predicateResult = attribute({val: value, op: operator}, key, 'numeric'); if (!predicateResult) outValues.push(value); }); @@ -1593,7 +1597,7 @@ SearchParameters.prototype = { return this.mutateMe(function mergeWith(newInstance) { var ks = keys(params); - forEach(ks, function(k) { + ks.forEach(function(k) { newInstance[k] = parsedParams[k]; }); diff --git a/packages/algoliasearch-helper/src/algoliasearch.helper.js b/packages/algoliasearch-helper/src/algoliasearch.helper.js index aa19a98c79..30a57f4ea5 100644 --- a/packages/algoliasearch-helper/src/algoliasearch.helper.js +++ b/packages/algoliasearch-helper/src/algoliasearch.helper.js @@ -9,7 +9,6 @@ var events = require('events'); var inherits = require('./functions/inherits'); var flatten = require('lodash/flatten'); -var forEach = require('lodash/forEach'); var isEmpty = require('lodash/isEmpty'); var url = require('./url'); @@ -306,10 +305,15 @@ AlgoliaSearchHelper.prototype.searchForFacetValues = function(facet, query, maxF content = Array.isArray(content) ? content[0] : content; - content.facetHits = forEach(content.facetHits, function(f) { - f.isRefined = isDisjunctive ? - state.isDisjunctiveFacetRefined(facet, f.value) : - state.isFacetRefined(facet, f.value); + content.facetHits = Array.isArray(content.facetHits) + ? content.facetHits + : []; + + content.facetHits = content.facetHits.map(function(f) { + f.isRefined = isDisjunctive + ? state.isDisjunctiveFacetRefined(facet, f.value) + : state.isFacetRefined(facet, f.value); + return f; }); return content; @@ -1130,7 +1134,7 @@ AlgoliaSearchHelper.prototype.getRefinements = function(facetName) { if (this.state.isConjunctiveFacet(facetName)) { var conjRefinements = this.state.getConjunctiveRefinements(facetName); - forEach(conjRefinements, function(r) { + conjRefinements.forEach(function(r) { refinements.push({ value: r, type: 'conjunctive' @@ -1139,7 +1143,7 @@ AlgoliaSearchHelper.prototype.getRefinements = function(facetName) { var excludeRefinements = this.state.getExcludeRefinements(facetName); - forEach(excludeRefinements, function(r) { + excludeRefinements.forEach(function(r) { refinements.push({ value: r, type: 'exclude' @@ -1148,7 +1152,7 @@ AlgoliaSearchHelper.prototype.getRefinements = function(facetName) { } else if (this.state.isDisjunctiveFacet(facetName)) { var disjRefinements = this.state.getDisjunctiveRefinements(facetName); - forEach(disjRefinements, function(r) { + disjRefinements.forEach(function(r) { refinements.push({ value: r, type: 'disjunctive' @@ -1158,7 +1162,9 @@ AlgoliaSearchHelper.prototype.getRefinements = function(facetName) { var numericRefinements = this.state.getNumericRefinements(facetName); - forEach(numericRefinements, function(value, operator) { + Object.keys(numericRefinements).forEach(function(operator) { + var value = numericRefinements[operator]; + refinements.push({ value: value, operator: operator, @@ -1262,7 +1268,8 @@ AlgoliaSearchHelper.prototype._dispatchAlgoliaResponse = function(states, queryI if (this._currentNbQueries === 0) this.emit('searchQueueEmpty'); var results = content.results.slice(); - forEach(states, function(s) { + + states.forEach(function(s) { var state = s.state; var queriesCount = s.queriesCount; var helper = s.helper; diff --git a/packages/algoliasearch-helper/src/requestBuilder.js b/packages/algoliasearch-helper/src/requestBuilder.js index 3615f77a6e..1ba4575632 100644 --- a/packages/algoliasearch-helper/src/requestBuilder.js +++ b/packages/algoliasearch-helper/src/requestBuilder.js @@ -1,6 +1,5 @@ 'use strict'; -var forEach = require('lodash/forEach'); var reduce = require('lodash/reduce'); var merge = require('lodash/merge'); @@ -21,7 +20,7 @@ var requestBuilder = { }); // One for each disjunctive facets - forEach(state.getRefinedDisjunctiveFacets(), function(refinedFacet) { + state.getRefinedDisjunctiveFacets().forEach(function(refinedFacet) { queries.push({ indexName: index, params: requestBuilder._getDisjunctiveFacetSearchParams(state, refinedFacet) @@ -29,7 +28,7 @@ var requestBuilder = { }); // maybe more to get the root level of hierarchical facets when activated - forEach(state.getRefinedHierarchicalFacets(), function(refinedFacet) { + state.getRefinedHierarchicalFacets().forEach(function(refinedFacet) { var hierarchicalFacet = state.getHierarchicalFacetByName(refinedFacet); var currentRefinement = state.getHierarchicalRefinement(refinedFacet); @@ -135,10 +134,12 @@ var requestBuilder = { var numericFilters = []; - forEach(state.numericRefinements, function(operators, attribute) { - forEach(operators, function(values, operator) { + Object.keys(state.numericRefinements).forEach(function(attribute) { + var operators = state.numericRefinements[attribute] || {}; + Object.keys(operators).forEach(function(operator) { + var values = operators[operator] || []; if (facetName !== attribute) { - forEach(values, function(value) { + values.forEach(function(value) { if (Array.isArray(value)) { var vs = value.map(function(v) { return attribute + operator + v; @@ -179,30 +180,40 @@ var requestBuilder = { _getFacetFilters: function(state, facet, hierarchicalRootLevel) { var facetFilters = []; - forEach(state.facetsRefinements, function(facetValues, facetName) { - forEach(facetValues, function(facetValue) { + var facetsRefinements = state.facetsRefinements || {}; + Object.keys(facetsRefinements).forEach(function(facetName) { + var facetValues = facetsRefinements[facetName] || []; + facetValues.forEach(function(facetValue) { facetFilters.push(facetName + ':' + facetValue); }); }); - forEach(state.facetsExcludes, function(facetValues, facetName) { - forEach(facetValues, function(facetValue) { + var facetsExcludes = state.facetsExcludes || {}; + Object.keys(facetsExcludes).forEach(function(facetName) { + var facetValues = facetsExcludes[facetName] || []; + facetValues.forEach(function(facetValue) { facetFilters.push(facetName + ':-' + facetValue); }); }); - forEach(state.disjunctiveFacetsRefinements, function(facetValues, facetName) { - if (facetName === facet || !facetValues || facetValues.length === 0) return; + var disjunctiveFacetsRefinements = state.disjunctiveFacetsRefinements || {}; + Object.keys(disjunctiveFacetsRefinements).forEach(function(facetName) { + var facetValues = disjunctiveFacetsRefinements[facetName] || []; + if (facetName === facet || !facetValues || facetValues.length === 0) { + return; + } var orFilters = []; - forEach(facetValues, function(facetValue) { + facetValues.forEach(function(facetValue) { orFilters.push(facetName + ':' + facetValue); }); facetFilters.push(orFilters); }); - forEach(state.hierarchicalFacetsRefinements, function(facetValues, facetName) { + var hierarchicalFacetsRefinements = state.hierarchicalFacetsRefinements || {}; + Object.keys(hierarchicalFacetsRefinements).forEach(function(facetName) { + var facetValues = hierarchicalFacetsRefinements[facetName] || []; var facetValue = facetValues[0]; if (facetValue === undefined) {