/**
  * Executes search.
  *
  * @param SearchRequest $request
  *
  * @return SearchResponse
  */
 public function search(SearchRequest $request)
 {
     $search = $this->container->buildSearch($request);
     /** @var FilterInterface[] $filters */
     foreach ($this->container->all() as $name => $filter) {
         // We simply exclude not related filters and current filter itself.
         $relatedFilters = $this->container->getFiltersByRelation(new AndRelation([$filter->getSearchRelation(), new ExcludeRelation([$name])]));
         $filter->preProcessSearch($search, $this->container->buildSearch($request, $relatedFilters), $request->get($name));
     }
     $result = $this->repository->execute($search);
     return new SearchResponse($this->getFiltersViewData($result, $request), $result, $this->composeUrlParameters($request));
 }
 /**
  * Tests buildSearch method.
  */
 public function testBuildSearch()
 {
     $mockRequest = $this->getMock('ONGR\\FilterManagerBundle\\Search\\SearchRequest');
     $mockRequest->expects($this->once())->method('get')->will($this->returnValue(null));
     $mockFilterInterface = $this->getMock('ONGR\\FilterManagerBundle\\Filters\\FilterInterface');
     $mockFilterInterface->expects($this->once())->method('modifySearch')->withConsecutive($this->isInstanceOf('ONGR\\ElasticsearchBundle\\DSL\\Search'), $this->equalTo('testName'), $this->identicalTo($mockRequest));
     $filtersContainer = new FiltersContainer();
     $filtersContainer->add([$mockFilterInterface]);
     $result = $filtersContainer->buildSearch($mockRequest);
     $this->assertInstanceOf('ONGR\\ElasticsearchBundle\\DSL\\Search', $result);
 }