public function testFacetsFilter()
 {
     add_filter('elasticsearch_config_facets', function ($value) {
         return array('bar');
     }, 10, 1);
     $this->assertEquals(array('bar'), Config::facets());
 }
 /**
  * @internal
  **/
 public static function _buildQuery($search, $facets = array())
 {
     global $blog_id;
     $search = str_ireplace(array(' and ', ' or '), array(' AND ', ' OR '), $search);
     $fields = array();
     $musts = array();
     $filters = array();
     $scored = array();
     foreach (Config::taxonomies() as $tax) {
         if ($search) {
             $score = Config::score('tax', $tax);
             if ($score > 0) {
                 $scored[] = "{$tax}_name^{$score}";
             }
         }
         self::_filterBySelectedFacets($tax, $facets, 'term', $musts, $filters);
     }
     $args = array();
     $numeric = Config::option('numeric');
     $exclude = Config::apply_filters('searcher_query_exclude_fields', array('post_date'));
     $fields = Config::fields();
     self::_searchField($fields, 'field', $exclude, $search, $facets, $musts, $filters, $scored, $numeric);
     self::_searchField(Config::meta_fields(), 'meta', $exclude, $search, $facets, $musts, $filters, $scored, $numeric);
     if (count($scored) > 0 && $search) {
         $qs = array('fields' => $scored, 'query' => $search);
         $fuzzy = Config::option('fuzzy');
         if ($fuzzy && strpos($search, "~") > -1) {
             $qs['fuzzy_min_sim'] = $fuzzy;
         }
         $qs = Config::apply_filters('searcher_query_string', $qs);
         $musts[] = array('query_string' => $qs);
     }
     if (in_array('post_type', $fields)) {
         self::_filterBySelectedFacets('post_type', $facets, 'term', $musts, $filters);
     }
     if (count($filters) > 0) {
         $args['filter']['bool']['should'] = $filters;
     }
     if (count($musts) > 0) {
         $args['query']['bool']['must'] = $musts;
     }
     $args['filter']['bool']['must'][] = array('term' => array('blog_id' => $blog_id));
     $args = Config::apply_filters('searcher_query_pre_facet_filter', $args);
     if (in_array('post_type', $fields)) {
         $args['facets']['post_type']['terms'] = array('field' => 'post_type', 'size' => Config::apply_filters('searcher_query_facet_size', 100));
     }
     // return facets
     foreach (Config::facets() as $facet) {
         $args['facets'][$facet]['terms'] = array('field' => $facet, 'size' => Config::apply_filters('searcher_query_facet_size', 100));
         $args['facets'][$facet]['facet_filter'] = array('bool' => array('must' => array(array('term' => array('blog_id' => $blog_id)))));
         if (count($filters) > 0) {
             $applicable = array();
             foreach ($filters as $filter) {
                 if (isset($filter['term']) && !in_array($facet, array_keys($filter['term']))) {
                     // do not filter on itself when using OR
                     $applicable[] = $filter;
                 }
             }
             if (count($applicable) > 0) {
                 $args['facets'][$facet]['facet_filter']['bool']['should'] = $applicable;
             }
         }
     }
     if (is_array($numeric)) {
         foreach (array_keys($numeric) as $facet) {
             $ranges = Config::ranges($facet);
             if (count($ranges) > 0) {
                 $args['facets'][$facet]['range'][$facet] = array_values($ranges);
                 $args['facets'][$facet]['facet_filter'] = array('bool' => array('must' => array(array('term' => array('blog_id' => $blog_id)))));
             }
         }
     }
     return Config::apply_filters('searcher_query_post_facet_filter', $args);
 }