public function listAction(Request $request, $page)
 {
     $articleSearch = new ArticleSearch();
     $articleSearch->handleRequest($request);
     // we create an "anonym" form to pass parameters in GET and have a nice url
     $articleSearchForm = $this->get('form.factory')->createNamed('', 'article_search_type', $articleSearch, array('action' => $this->generateUrl('obtao-article-search'), 'method' => 'GET'));
     $articleSearchForm->handleRequest($request);
     $articleSearch = $articleSearchForm->getData();
     // we pass our search object to the search repository
     $results = $this->getSearchRepository()->searchArticles($articleSearch);
     $adapter = new ArrayAdapter($results);
     $pager = new Pagerfanta($adapter);
     $pager->setMaxPerPage($articleSearch->getPerPage());
     $pager->setCurrentPage($page);
     return $this->render('ObtaoBlogBundle:Article:list.html.twig', array('results' => $pager->getCurrentPageResults(), 'pager' => $pager, 'articleSearchForm' => $articleSearchForm->createView()));
 }
 public function getQueryForSearch(ArticleSearch $articleSearch)
 {
     // we create a query to return all the articles
     // but if the criteria title is specified, we use it
     if ($articleSearch->getTitle() !== null && $articleSearch != '') {
         $query = new \Elastica\Query\Match();
         $query->setFieldQuery('article.title', $articleSearch->getTitle());
         $query->setFieldFuzziness('article.title', 0.7);
         $query->setFieldMinimumShouldMatch('article.title', '80%');
     } else {
         $query = new \Elastica\Query\MatchAll();
     }
     // then we create filters depending on the chosen criterias
     $boolQuery = new \Elastica\Query\Bool();
     $boolQuery->addMust($query);
     /*
         Dates filter
         We add this filter only the ispublished filter is not at "false"
     */
     if ("false" != $articleSearch->isPublished() && null !== $articleSearch->getDateFrom() && null !== $articleSearch->getDateTo()) {
         $boolQuery->addMust(new \Elastica\Query\Range('publishedAt', array('gte' => \Elastica\Util::convertDate($articleSearch->getDateFrom()->getTimestamp()), 'lte' => \Elastica\Util::convertDate($articleSearch->getDateTo()->getTimestamp()))));
     }
     // Published or not filter
     if ($articleSearch->isPublished() !== null) {
         $boolQuery->addMust(new \Elastica\Query\Terms('published', array($articleSearch->isPublished())));
     }
     $query = new \Elastica\Query($boolQuery);
     $query->setSort(array($articleSearch->getSort() => array('order' => $articleSearch->getDirection())));
     return $query;
 }