Skip to content

Commit

Permalink
Added knp paginator support
Browse files Browse the repository at this point in the history
Bug fix: no
Feature addition: yes
Backwards compatibility break: no

Encapsulated Pagerfanta dependency for pagination and added support for knp pagination component
  • Loading branch information
fran6co committed May 24, 2012
1 parent 2b858f0 commit 0d9e0f1
Show file tree
Hide file tree
Showing 13 changed files with 306 additions and 74 deletions.
10 changes: 10 additions & 0 deletions Finder/PaginatedFinderInterface.php
Expand Up @@ -2,7 +2,9 @@

namespace FOQ\ElasticaBundle\Finder;

use FOQ\ElasticaBundle\Paginator\PaginatorAdapterInterface;
use Pagerfanta\Pagerfanta;
use Elastica_Query;

interface PaginatedFinderInterface
{
Expand All @@ -13,4 +15,12 @@ interface PaginatedFinderInterface
* @return Pagerfanta paginated results
*/
function findPaginated($query);

/**
* Creates a paginator adapter for this query
*
* @param Elastica_Query $query
* @return PaginatorAdapterInterface
*/
function createPaginatorAdapter(Elastica_Query $query);
}
5 changes: 3 additions & 2 deletions Finder/RawFinder.php
Expand Up @@ -3,6 +3,7 @@
namespace FOQ\ElasticaBundle\Finder;

use FOQ\ElasticaBundle\Paginator\RawPaginatorAdapter;
use FOQ\ElasticaBundle\Paginator\FantaPaginatorAdapter;
use Pagerfanta\Pagerfanta;
use Elastica_Searchable;
use Elastica_Query;
Expand Down Expand Up @@ -42,7 +43,7 @@ public function findPaginated($query)
$queryObject = Elastica_Query::create($query);
$paginatorAdapter = $this->createPaginatorAdapter($queryObject);

return new Pagerfanta($paginatorAdapter);
return new Pagerfanta(new FantaPaginatorAdapter($paginatorAdapter));
}

/**
Expand All @@ -51,7 +52,7 @@ public function findPaginated($query)
* @param Elastica_Query $query
* @return RawPaginatorAdapter
*/
protected function createPaginatorAdapter(Elastica_Query $query)
public function createPaginatorAdapter(Elastica_Query $query)
{
return new RawPaginatorAdapter($this->searchable, $query);
}
Expand Down
5 changes: 3 additions & 2 deletions Finder/TransformedFinder.php
Expand Up @@ -6,6 +6,7 @@
use FOQ\ElasticaBundle\Finder\PaginatedFinderInterface;
use FOQ\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface;
use FOQ\ElasticaBundle\Paginator\TransformedPaginatorAdapter;
use FOQ\ElasticaBundle\Paginator\FantaPaginatorAdapter;
use Pagerfanta\Pagerfanta;
use Elastica_Searchable;
use Elastica_Query;
Expand Down Expand Up @@ -67,7 +68,7 @@ public function findPaginated($query)
$queryObject = Elastica_Query::create($query);
$paginatorAdapter = $this->createPaginatorAdapter($queryObject);

return new Pagerfanta($paginatorAdapter);
return new Pagerfanta(new FantaPaginatorAdapter($paginatorAdapter));
}

/**
Expand All @@ -76,7 +77,7 @@ public function findPaginated($query)
* @param Elastica_Query $query
* @return TransformedPaginatorAdapter
*/
protected function createPaginatorAdapter(Elastica_Query $query)
public function createPaginatorAdapter(Elastica_Query $query)
{
return new TransformedPaginatorAdapter($this->searchable, $query, $this->transformer);
}
Expand Down
54 changes: 0 additions & 54 deletions Paginator/AbstractPaginatorAdapter.php

This file was deleted.

46 changes: 46 additions & 0 deletions Paginator/FantaPaginatorAdapter.php
@@ -0,0 +1,46 @@
<?php

namespace FOQ\ElasticaBundle\Paginator;

use Pagerfanta\Adapter\AdapterInterface;
use FOQ\ElasticaBundle\Paginator\PaginatorAdapterInterface;

class FantaPaginatorAdapter implements AdapterInterface
{
private $adapter;

/**
* @param PaginatorAdapterInterface $adapter
*/
public function __construct(PaginatorAdapterInterface $adapter)
{
$this->adapter = $adapter;
}

/**
* Returns the number of results.
*
* @return integer The number of results.
*
* @api
*/
public function getNbResults()
{
return $this->adapter->getTotalHits();
}

/**
* Returns an slice of the results.
*
* @param integer $offset The offset.
* @param integer $length The length.
*
* @return array|\Traversable The slice.
*
* @api
*/
public function getSlice($offset, $length)
{
return $this->adapter->getResults($offset,$length)->toArray();
}
}
27 changes: 27 additions & 0 deletions Paginator/PaginatorAdapterInterface.php
@@ -0,0 +1,27 @@
<?php

namespace FOQ\ElasticaBundle\Paginator;

interface PaginatorAdapterInterface
{
/**
* Returns the number of results.
*
* @return integer The number of results.
*
* @api
*/
function getTotalHits();

/**
* Returns an slice of the results.
*
* @param integer $offset The offset.
* @param integer $length The length.
*
* @return FOQ\ElasticaBundle\Paginator\PartialResults
*
* @api
*/
function getResults($offset, $length);
}
32 changes: 32 additions & 0 deletions Paginator/PartialResultsInterface.php
@@ -0,0 +1,32 @@
<?php

namespace FOQ\ElasticaBundle\Paginator;

interface PartialResultsInterface
{
/**
* Returns the paginated results.
*
* @return array
*
* @api
*/
function toArray();

/**
* Returns the number of results.
*
* @return integer The number of results.
*
* @api
*/
function getTotalHits();


/**
* Returns the facets
*
* @return array
*/
function getFacets();
}
63 changes: 56 additions & 7 deletions Paginator/RawPaginatorAdapter.php
Expand Up @@ -2,20 +2,69 @@

namespace FOQ\ElasticaBundle\Paginator;

use Elastica_Searchable;
use Elastica_Query;
use FOQ\ElasticaBundle\Paginator\PaginatorAdapterInterface;
use FOQ\ElasticaBundle\Paginator\RawPartialResults;

/**
* Implements the Pagerfanta\Adapter\AdapterInterface for use with Zend\Paginator\Paginator
*
* Allows pagination of Elastica_Query. Does not map results
*/
class RawPaginatorAdapter extends AbstractPaginatorAdapter
class RawPaginatorAdapter implements PaginatorAdapterInterface
{
/**
* @see Pagerfanta\Adapter\AdapterInterface::getSlice
* @var Elastica_SearchableInterface the object to search in
*/
private $searchable = null;

/**
* @var Elastica_Query the query to search
*/
private $query = null;

/**
* @see PaginatorAdapterInterface::__construct
*
* @param Elastica_SearchableInterface the object to search in
* @param Elastica_Query the query to search
*/
public function __construct(Elastica_Searchable $searchable, Elastica_Query $query)
{
$this->searchable = $searchable;
$this->query = $query;
}

/**
* Returns the paginated results.
*
* @return Elastica_ResultSet
*/
public function getSlice($offset, $length)
protected function getElasticaResults($offset, $itemCountPerPage)
{
$results = $this->getElasticaResults($offset, $length);
$query = clone $this->query;
$query->setFrom($offset);
$query->setLimit($itemCountPerPage);

return $this->searchable->search($query);
}

return array_map(function($result) { return $result->getSource(); }, $results);
/**
* Returns the paginated results.
*
* @return FOQ\ElasticaBundle\Paginator\PartialResultInterface
*/
public function getResults($offset, $itemCountPerPage)
{
return new RawPartialResults($this->getElasticaResults($offset,$itemCountPerPage));
}

/**
* Returns the number of results.
*
* @return integer The number of results.
*/
public function getTotalHits()
{
return $this->searchable->count($this->query);
}
}
52 changes: 52 additions & 0 deletions Paginator/RawPartialResults.php
@@ -0,0 +1,52 @@
<?php

namespace FOQ\ElasticaBundle\Paginator;

use FOQ\ElasticaBundle\Paginator\PartialResultsInterface;
use Elastica_ResultSet;

/**
* Raw partial results transforms to a simple array
*/
class RawPartialResults implements PartialResultsInterface
{
protected $resultSet;

/**
* @param \Elastica_ResultSet $resultSet
*/
public function __construct(Elastica_ResultSet $resultSet)
{
$this->resultSet = $resultSet;
}

/**
* {@inheritDoc}
*/
public function toArray()
{
return array_map(function($result) {
return $result->getSource();
}, $this->resultSet->getResults());
}

/**
* {@inheritDoc}
*/
public function getTotalHits()
{
return $this->resultSet->getTotalHits();
}

/**
* {@inheritDoc}
*/
public function getFacets()
{
if ($this->resultSet->hasFacets()) {
return $this->resultSet->getFacets();
}

return null;
}
}

0 comments on commit 0d9e0f1

Please sign in to comment.