Skip to content

Commit

Permalink
pagination
Browse files Browse the repository at this point in the history
  • Loading branch information
joonsp committed Aug 23, 2012
1 parent 2d26bc8 commit eda0ef8
Show file tree
Hide file tree
Showing 10 changed files with 256 additions and 34 deletions.
15 changes: 8 additions & 7 deletions Controller/SearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

class SearchController extends Controller
{

public function searchAction()
{
{
$self = $this;
$service = $this->getSearchService();
$config = $this->container->getParameter('xi_search');
Expand All @@ -21,19 +21,20 @@ public function searchAction()
$limit = isset($config['default_limit']) ? $config['default_limit'] : null;

if($data->getSearchType() == 'search'){
$results = $service->search($data->getIndex(), $data->getTerm(), $limit);
$results = $service->searchPaginated($data->getIndex(), $data->getTerm(), $data->getPage(), $limit);
} elseif($data->getSearchType() == 'find') {
$results = $service->find($data->getIndex(), $data->getTerm(), $limit);

$results = $service->findPaginated($data->getIndex(), $data->getTerm(), $data->getPage(), $limit);
}

$resultHtml = $self->renderView('XiSearchBundle:Search:search.html.twig', array(
$resultHtml = $self->renderView('XiSearchBundle:Search:search_paginated.html.twig', array(
'results' => $results, 'index' => $data->getIndex(), 'options' => json_decode($data->getOptions())
));

return $self->createJsonSuccessWithContent($resultHtml, 'xiSearchResultCallback');
return $self->createJsonSuccessWithContent($resultHtml, 'xiSearchResultCallback');
});
}

/**
* @return SearchService
*/
Expand Down
3 changes: 2 additions & 1 deletion Form/ChoosableSearchType.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ public function __construct($choices)
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('options', 'hidden')
->add('options', 'hidden')
->add('index', 'choice', array('choices' => $this->choices, 'expanded' => true, 'label' => 'xi_search.choose-index'))
->add('searchType', 'hidden')
->add('page', 'hidden')
->add('term', 'text', array('label' => 'search.form.term.label'));
}

Expand Down
32 changes: 31 additions & 1 deletion Form/Model/SearchModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,17 @@ class SearchModel
* @Assert\NotBlank(message="search.validation.term.notblank")
*/
protected $term;


/**
* @var int
*/
protected $page;

public function __construct()
{
$this->page = 1;
}

/**
* @param string $options
* @return \Xi\Bundle\SearchBundle\Form\Model\SearchModel
Expand Down Expand Up @@ -90,6 +100,7 @@ public function getSearchType()
public function setTerm($term)
{
$this->term = $term;

return $this;
}

Expand All @@ -100,4 +111,23 @@ public function getTerm()
{
return $this->term;
}

/**
* @param int $page
* @return \Xi\Bundle\SearchBundle\Form\Model\SearchModel
*/
public function setPage($page)
{
$this->page = $page;

return $this;
}

/**
* @return int
*/
public function getPage()
{
return $this->page;
}
}
1 change: 1 addition & 0 deletions Form/SearchType.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public function buildForm(FormBuilderInterface $builder, array $options)
->add('options', 'hidden')
->add('index', 'hidden')
->add('searchType', 'hidden')
->add('page', 'hidden')
->add('term', 'text', array('label' => 'search.form.term.label'));
}

Expand Down
12 changes: 12 additions & 0 deletions Resources/views/Search/search_paginated.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{# sorting of properties based on queried types..
<span>{{ pagination.sortable('Id', 'x.id')|raw }}</span>
#}

{% for result in results %}
{{ xi_search_result(result, options) }}
{% endfor %}
<div class="clear"></div>

<div class="pagination">
{{ results.render()|raw }}
</div>
122 changes: 107 additions & 15 deletions Service/Search/FOQElasticaSearch.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@
namespace Xi\Bundle\SearchBundle\Service\Search;

use Symfony\Component\DependencyInjection\Container,
Xi\Bundle\SearchBundle\Service\Search\Result\DefaultSearchResultSet,
Xi\Bundle\SearchBundle\Service\Search\Result\DefaultSearchResultSet,
Xi\Bundle\SearchBundle\Service\Search\Result\DefaultSearchResult,
\Elastica_ResultSet
\Elastica_Result;
\Elastica_ResultSet,
\Elastica_Result,
\Elastica_Query,
Knp\Component\Pager\Pagination,
FOQ\ElasticaBundle\Paginator\TransformedPaginatorAdapter,
FOQ\ElasticaBundle\Subscriber\PaginateElasticaQuerySubscriber,
Knp\Component\Pager\Event\Subscriber\Paginate\ElasticaQuerySubscriber;

class FOQElasticaSearch implements Search
{
Expand Down Expand Up @@ -35,16 +40,41 @@ public function __construct(Container $container)
*/
public function search($index, $term, $limit = null)
{
$elasticaType = $this->container->get('foq_elastica.index.'.$index);
$elasticaType = $this->getSearchable($index);
$elasticaResultSet = $elasticaType->search($term, $limit);

return $this->convertToSearchResult($elasticaResultSet);
}


/**
* Gets a paginator wrapping the result of a search
*
* @param string $index
* @param strgin $term
* @param int $page
* @param int $limit
* @return PaginationInterface
*/
public function searchPaginated($index, $term, $page = 1, $limit = null)
{
$paginator = $this->container->get('knp_paginator');
$paginator->subscribe(new ElasticaQuerySubscriber());
$query = Elastica_Query::create($term);

$paginationView = $paginator->paginate(array($this->getSearchable($index), $query), $page, $limit);

# instead of this perhaps create another subscriber that returns an actual result set
$searchResults = $this->convertToSearchResult($paginationView->getItems(), $paginationView->getTotalItemCount());
$paginationView->setItems($searcResult->getResults());

return $paginationView;
}

/**
* @param \Elastica_ResultSet $elasticaResultSet
* @param Elastica_ResultSet|array $elasticaResultSet Elastica_ResultSet or Elastica_ResultSet::getResults
* @return \Xi\Bundle\SearchBundle\Service\Search\Result\DefaultSearchResultSet
*/
protected function convertToSearchResult(\Elastica_ResultSet $elasticaResultSet)
protected function convertToSearchResult($elasticaResultSet, $count = null)
{
$results = array();
foreach($elasticaResultSet as $elasticaResult) {
Expand All @@ -56,24 +86,86 @@ protected function convertToSearchResult(\Elastica_ResultSet $elasticaResultSet)
$elasticaResult->getSource()
);
}

$count = is_object($elasticaResultSet) ? $elasticaResultSet->getTotalHits() : $count;

// disable call to getTotalTime until that functions exists in an ruflin/elastica version supported by elastica-bundle
// return new DefaultSearchResultSet($results, $elasticaResultSet->getTotalHits(), $elasticaResultSet->getTotalTime());
return new DefaultSearchResultSet($results, $elasticaResultSet->getTotalHits(), 0);
return new DefaultSearchResultSet($results, $count, 0);
}

/**
* Find and returns array of searched entities
*
*
* @param string $index - name of the indexed resource
* @param string $term - search term
* @param int $limit
* @return array - array of entities
*/
public function find($index, $term, $limit = null)
{
$mapFinder = $this->container->get('foq_elastica.finder.'.$index);
return $mapFinder->find($term, $limit);
{
$mapFinder = $this->getFinder($index);

return $mapFinder->find($term, $limit);
}

/**
* Gets a paginator wrapping the result of a search
*
* @param string $index
* @param strgin $term
* @param int $page
* @param int $limit
* @return PaginationInterface
*/
public function findPaginated($index, $term, $page = 1, $limit = null)
{
$paginator = $this->container->get('knp_paginator');
$paginator->subscribe(new PaginateElasticaQuerySubscriber());

return $paginator->paginate($this->createPaginatorAdapter($term, $index), $page, $limit);
}

/**
* @param string $query
* @param string $index
* @return TransformedPaginatorAdapter
*/
public function createPaginatorAdapter($query, $index)
{
$query = Elastica_Query::create($query);

return new TransformedPaginatorAdapter(
$this->getSearchable($index),
$query,
$this->getTransformer($index)
);
}

/**
* @param string $index
* @return Elastica_Searchable
*/
protected function getSearchable($index)
{
return $this->container->get('foq_elastica.index.' . $index);
}

/**
* @param string $index
* @return TransformedFinder
*/
protected function getFinder($index)
{
return $this->container->get('foq_elastica.finder.' . $index);
}

/**
* @param string $index
* @return ElasticaToModelTransformer
*/
protected function getTransformer($index)
{
return $this->container->get('foq_elastica.elastica_to_model_transformer.collection.' . $index);
}


}
13 changes: 11 additions & 2 deletions Service/Search/Search.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,15 @@ public function search($index, $term, $limit = null);
* @return array - array of entities
*/
public function find($index, $term, $limit = null);



/**
* Find a set wrapped inside a paginator
*
* @param string $index [description]
* @param string $term [description]
* @param int $page [description]
* @param int $limit [description]
* @return PaginatorInterface
*/
public function findPaginated($index, $term, $page = 1, $limit = null);
}
38 changes: 33 additions & 5 deletions Service/SearchService.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,50 @@ public function getChoosableSearchForm(array $choices)
* @param int $limit
* @return SearchResultSet
*/
public function search($index, $term, $limit = null)
{
public function search($index, $term, $limit = null)
{
return $this->searchInterface->search($index, $term, $limit);
}

/**
* Search for a set wrapped inside a paginator
*
* @param string $index
* @param string $term
* @param int $page
* @param int $limit
* @return PaginatorInterface
*/
public function searchPaginated($index, $term, $page, $limit)
{
return $this->searchInterface->searchPaginated($index, $term, $page, $limit);
}

/**
* Find and returns array of searched entities
*
*
* @param string $index
* @param string $term
* @param int $limit
* @return array - array of entities
*/
public function find($index, $term, $limit = null)
{
return $this->searchInterface->find($index, $term, $limit);
return $this->searchInterface->find($index, $term, $limit);
}


/**
* Find a set wrapped inside a paginator
*
* @param string $index
* @param string $term
* @param int $page
* @param int $limit
* @return PaginatorInterface
*/
public function findPaginated($index, $term, $page, $limit)
{
return $this->searchInterface->findPaginated($index, $term, $page, $limit);
}

}
Loading

0 comments on commit eda0ef8

Please sign in to comment.