/**
  * Recherche avancée
  *
  * @ApiDoc(
  *   resource = true,
  *   description = "Recherche avancée",
  *   statusCodes = {
  *     200 = "Returned when successful",
  *     404 = "Returned when the data is not found"
  *   }
  * )
  * @Route("/api/search/advancedSearch",name="nicetruc_advanced", options={"expose"=true})
  * @Rest\View()
  * @Method({"POST"})
  */
 public function searchAdvancedAction(Request $request)
 {
     $elasticManager = $this->get('fos_elastica.manager');
     $advancedSearch = new AdvancedSearch();
     $advancedSearch->handleRequest($request);
     $voitures = $elasticManager->getRepository('AppBundle:Voiture')->searchAdvanced($advancedSearch);
     $view = View::create();
     if ($voitures) {
         $data = array('data' => array('voitures' => $voitures));
         $view->setData($data)->setStatusCode(200);
     } else {
         $view->setData(null)->setStatusCode(404);
     }
     return $view;
 }
 public function searchAdvanced(AdvancedSearch $advancedSearch)
 {
     if (!$advancedSearch->innerObjectIsDefine()) {
         $match = new \Elastica\Query\MatchAll();
     } else {
         $match = new \Elastica\Query\BoolQuery();
         if ($advancedSearch->getMarque()) {
             $match->addMust(new \Elastica\Query\Match('modeleMarque.marque.id', $advancedSearch->getMarque()));
         }
         if ($advancedSearch->getModele()) {
             $match->addMust(new \Elastica\Query\Match('modeleMarque.modele.id', $advancedSearch->getModele()));
         }
         if ($advancedSearch->getBoitier()) {
             $match->addMust(new \Elastica\Query\Match('boitier.id', $advancedSearch->getBoitier()));
         }
         if ($advancedSearch->getCarburant()) {
             $match->addMust(new \Elastica\Query\Match('carburant.id', $advancedSearch->getCarburant()));
         }
     }
     $boolFilter = new \Elastica\Filter\BoolFilter();
     if ($advancedSearch->getPrixMin()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('prix', array('gte' => intval($advancedSearch->getPrixMin()))));
     }
     if ($advancedSearch->getPrixMax()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('prix', array('lte' => $advancedSearch->getPrixMax())));
     }
     if ($advancedSearch->getKmMin()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('kmParcouru', array('gte' => intval($advancedSearch->getKmMin()))));
     }
     if ($advancedSearch->getKmMax()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('kmParcouru', array('lte' => $advancedSearch->getKmMax())));
     }
     $filtered = new \Elastica\Query\Filtered($match, $boolFilter);
     $query = \Elastica\Query::create($filtered);
     return $this->find($query);
 }