/** * Perform a search with disjunctive facets generating as many queries as number of disjunctive facets. * * @param string $query the query * @param array $disjunctive_facets the array of disjunctive facets * @param array $params a hash representing the regular query parameters * @param array $refinements a hash ("string" -> ["array", "of", "refined", "values"]) representing the current refinements * ex: { "my_facet1" => ["my_value1", ["my_value2"], "my_disjunctive_facet1" => ["my_value1", "my_value2"] } * * @return mixed * * @throws AlgoliaException * @throws \Exception */ public function searchDisjunctiveFaceting($query, $disjunctive_facets, $params = [], $refinements = []) { if (gettype($disjunctive_facets) != 'string' && gettype($disjunctive_facets) != 'array') { throw new AlgoliaException('Argument "disjunctive_facets" must be a String or an Array'); } if (gettype($refinements) != 'array') { throw new AlgoliaException('Argument "refinements" must be a Hash of Arrays'); } if (gettype($disjunctive_facets) == 'string') { $disjunctive_facets = explode(',', $disjunctive_facets); } $disjunctive_refinements = []; foreach ($refinements as $key => $value) { if (in_array($key, $disjunctive_facets)) { $disjunctive_refinements[$key] = $value; } } $queries = []; $filters = []; foreach ($refinements as $key => $value) { $r = array_map(function ($val) use($key) { return $key . ':' . $val; }, $value); if (in_array($key, $disjunctive_refinements)) { $filter = array_merge($filters, $r); } else { array_push($filters, $r); } } $params['indexName'] = $this->indexName; $params['query'] = $query; $params['facetFilters'] = $filters; array_push($queries, $params); foreach ($disjunctive_facets as $disjunctive_facet) { $filters = []; foreach ($refinements as $key => $value) { if ($key != $disjunctive_facet) { $r = array_map(function ($val) use($key) { return $key . ':' . $val; }, $value); if (in_array($key, $disjunctive_refinements)) { $filter = array_merge($filters, $r); } else { array_push($filters, $r); } } } $params['indexName'] = $this->indexName; $params['query'] = $query; $params['facetFilters'] = $filters; $params['page'] = 0; $params['hitsPerPage'] = 0; $params['attributesToRetrieve'] = []; $params['attributesToHighlight'] = []; $params['attributesToSnippet'] = []; $params['facets'] = $disjunctive_facet; $params['analytics'] = false; array_push($queries, $params); } $answers = $this->client->multipleQueries($queries); $aggregated_answer = $answers['results'][0]; $aggregated_answer['disjunctiveFacets'] = []; for ($i = 1; $i < count($answers['results']); $i++) { foreach ($answers['results'][$i]['facets'] as $key => $facet) { $aggregated_answer['disjunctiveFacets'][$key] = $facet; if (!in_array($key, $disjunctive_refinements)) { continue; } foreach ($disjunctive_refinements[$key] as $r) { if (is_null($aggregated_answer['disjunctiveFacets'][$key][$r])) { $aggregated_answer['disjunctiveFacets'][$key][$r] = 0; } } } } return $aggregated_answer; }