Skip to content

Commit

Permalink
Merge pull request #116 from merk/elastica-fixes
Browse files Browse the repository at this point in the history
Elastica fixes
  • Loading branch information
pilot committed Oct 6, 2014
2 parents 756c445 + b727bbe commit 6d091c2
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 4 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"symfony/event-dispatcher": "~2.5",
"doctrine/orm": "~2.4",
"doctrine/mongodb-odm": "~1.0@beta",
"phpunit/phpunit": "~4.2"
"phpunit/phpunit": "~4.2",
"ruflin/elastica": "~1.0"
},

"suggest": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Knp\Component\Pager\Event\Subscriber\Paginate;

use Elastica\Query;
use Elastica\SearchableInterface;
use Knp\Component\Pager\Event\ItemsEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

Expand All @@ -13,17 +15,21 @@ class ElasticaQuerySubscriber implements EventSubscriberInterface
{
public function items(ItemsEvent $event)
{
if (is_array($event->target) && 2 === count($event->target) && reset($event->target) instanceof \Elastica_Searchable && end($event->target) instanceof \Elastica_Query) {
if (is_array($event->target) && 2 === count($event->target) && reset($event->target) instanceof SearchableInterface && end($event->target) instanceof Query) {
list($searchable, $query) = $event->target;

$query->setFrom($event->getOffset());
$query->setLimit($event->getLimit());
$results = $searchable->search($query);

$event->count = $results->getTotalHits();
if ($results->hasFacets()) {
//Faceting is being replaced by aggregations
if ($results->hasAggregations()) {
$event->setCustomPaginationParameter('aggregations', $results->getAggregations());
} elseif ($results->hasFacets()) {
$event->setCustomPaginationParameter('facets', $results->getFacets());
}
$event->setCustomPaginationParameter('resultSet', $results);
$event->items = $results->getResults();
$event->stopPropagation();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Knp\Component\Pager\Event\ItemsEvent;
use Elastica\Query;
use Elastica\SearchableInterface;

class ElasticaQuerySubscriber implements EventSubscriberInterface
{
public function items(ItemsEvent $event)
{
if (is_array($event->target) && 2 === count($event->target) && reset($event->target) instanceof \Elastica_Searchable && end($event->target) instanceof \Elastica_Query) {
if (is_array($event->target) && 2 === count($event->target) && reset($event->target) instanceof SearchableInterface && end($event->target) instanceof Query) {
list($searchable, $query) = $event->target;

if (isset($_GET[$event->options['sortFieldParameterName']])) {
Expand Down
68 changes: 68 additions & 0 deletions tests/Test/Pager/Subscriber/Paginate/ElasticaTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

use Elastica\Query;
use Elastica\Query\Term;
use Elastica\Result;
use Elastica\Type;
use Knp\Component\Pager\Paginator;
use Knp\Component\Pager\Event\Subscriber\Paginate\ElasticaQuerySubscriber;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Test\Mock\PaginationSubscriber as MockPaginationSubscriber;
use Test\Tool\BaseTestCase;

class ElasticaTest extends BaseTestCase
{
public function testElasticaSubscriber()
{
$dispatcher = new EventDispatcher;
$dispatcher->addSubscriber(new ElasticaQuerySubscriber());
$dispatcher->addSubscriber(new MockPaginationSubscriber); // pagination view
$p = new Paginator($dispatcher);

$query = Query::create(new Term(array(
'name' => 'Fred',
)));
$response = $this->getMockBuilder('Elastica\\ResultSet')->disableOriginalConstructor()->getMock();
$response->expects($this->once())
->method('getTotalHits')
->will($this->returnValue(2));
$response->expects($this->once())
->method('getResults')
->will($this->returnValue(array(new Result(array()), new Result(array()))));
$searchable = $this->getMockBuilder('Elastica\\SearchableInterface')->getMock();
$searchable->expects($this->once())
->method('search')
->with($query)
->will($this->returnValue($response));

$view = $p->paginate(array($searchable, $query), 1, 10);

$this->assertEquals(0, $query->getParam('from'), 'Query offset set correctly');
$this->assertEquals(10, $query->getParam('size'), 'Query limit set correctly');
$this->assertSame($response, $view->getCustomParameter('resultSet'), 'Elastica ResultSet available in Paginator');

$this->assertEquals(1, $view->getCurrentPageNumber());
$this->assertEquals(10, $view->getItemNumberPerPage());
$this->assertEquals(2, count($view->getItems()));
$this->assertEquals(2, $view->getTotalItemCount());
}

/**
* @test
*/
function shouldSlicePaginateAnArray()
{
/*$dispatcher = new EventDispatcher;
$dispatcher->addSubscriber(new ArraySubscriber);
$dispatcher->addSubscriber(new MockPaginationSubscriber); // pagination view
$p = new Paginator($dispatcher);
$items = range('a', 'u');
$view = $p->paginate($items, 2, 10);
$this->assertEquals(2, $view->getCurrentPageNumber());
$this->assertEquals(10, $view->getItemNumberPerPage());
$this->assertEquals(10, count($view->getItems()));
$this->assertEquals(21, $view->getTotalItemCount());*/
}
}

0 comments on commit 6d091c2

Please sign in to comment.