/**
  * {@inheritdoc}
  */
 public function preProcessSearch(Search $search, Search $relatedSearch, FilterState $state = null)
 {
     $name = $state ? $state->getName() : $this->getField();
     $aggregation = new TermsAggregation($name);
     $aggregation->setField($this->getField());
     if ($this->getSortType()) {
         $aggregation->addParameter('order', [$this->getSortType()['type'] => $this->getSortType()['order']]);
     }
     $aggregation->addParameter('size', 0);
     if ($this->getSize() > 0) {
         $aggregation->addParameter('size', $this->getSize());
     }
     if ($relatedSearch->getPostFilters()) {
         $filterAggregation = new FilterAggregation($name . '-filter');
         $filterAggregation->setFilter($relatedSearch->getPostFilters());
         $filterAggregation->addAggregation($aggregation);
         $search->addAggregation($filterAggregation);
     } else {
         $search->addAggregation($aggregation);
     }
 }
 /**
  * Test filters in aggregations and post filter.
  */
 public function testBoolWithFuzzyQueryAndSortFilter()
 {
     $repo = $this->getManager()->getRepository('AcmeTestBundle:Product');
     $search = $repo->createSearch();
     $rangeFilter = new RangeFilter('price', ['from' => 200, 'to' => 999]);
     $search->addPostFilter($rangeFilter);
     $name = 'foo';
     $TermsAgg = new TermsAggregation($name);
     $TermsAgg->setField('title');
     $TermsAgg->addParameter('include', $name);
     $filterAgg = new FilterAggregation($name . '-filter');
     $filters = $search->getPostFilters();
     $filterAgg->setFilter($filters);
     $filterAgg->addAggregation($TermsAgg);
     $search->addAggregation($filterAgg);
     $repo->execute($search, Repository::RESULTS_RAW);
 }
 /**
  * Tests setOrder DESC method.
  */
 public function testTermsAggregationSetOrderDESC()
 {
     // Case #7 terms aggregation with order term mode, desc direction.
     $aggregation = new TermsAggregation('test_agg');
     $aggregation->setField('test_field');
     $aggregation->addParameter('order', ['_term' => 'desc']);
     $result = ['agg_test_agg' => ['terms' => ['field' => 'test_field', 'order' => ['_term' => 'desc']]]];
     $this->assertEquals($aggregation->toArray(), $result);
 }
 /**
  * Builds term aggregation.
  *
  * @param array $options
  *
  * @return TermsAggregation
  */
 private function getAggregation($options)
 {
     $term = new TermsAggregation($options['name']);
     $term->setField($options['field']);
     if (array_key_exists('exclude', $options)) {
         $term->addParameter('exclude', $options['exclude']);
     }
     if (array_key_exists('include', $options)) {
         $term->addParameter('include', $options['include']);
     }
     if (array_key_exists('min_document_count', $options)) {
         $term->addParameter('min_doc_count', $options['min_document_count']);
     }
     if (array_key_exists('order', $options)) {
         $term->addParameter('order', [$options['order'][0] => $options['order'][1]]);
     }
     if (array_key_exists('size', $options)) {
         $term->addParameter('size', $options['size']);
     }
     return $term;
 }