Example #1
0
 /**
  * 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;
 }