Skip to content

Commit 5f41c9e

Browse files
authored
Merge pull request #1111 from XWB/hybrid
Pagination of hybrid results
2 parents cd9d309 + 2a4d077 commit 5f41c9e

File tree

7 files changed

+122
-0
lines changed

7 files changed

+122
-0
lines changed

CHANGELOG-3.2.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ CHANGELOG for 3.2.x
1717
* Add Elastica compression option
1818
* Add support for `defaultSortFieldName` and `defaultSortDirection` pagination options
1919
* Removed `immediate` option on type persistence configuration
20+
* Enable pagination of hybrid results

Finder/PaginatedFinderInterface.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,13 @@ public function findPaginated($query, $options = array());
2727
* @return PaginatorAdapterInterface
2828
*/
2929
public function createPaginatorAdapter($query, $options = array());
30+
31+
/**
32+
* Creates a hybrid paginator adapter for this query.
33+
*
34+
* @param mixed $query
35+
*
36+
* @return PaginatorAdapterInterface
37+
*/
38+
public function createHybridPaginatorAdapter($query);
3039
}

Finder/TransformedFinder.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace FOS\ElasticaBundle\Finder;
44

55
use Elastica\Document;
6+
use FOS\ElasticaBundle\Paginator\HybridPaginatorAdapter;
67
use FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface;
78
use FOS\ElasticaBundle\Paginator\TransformedPaginatorAdapter;
89
use FOS\ElasticaBundle\Paginator\FantaPaginatorAdapter;
@@ -100,4 +101,14 @@ public function createPaginatorAdapter($query, $options = array())
100101

101102
return new TransformedPaginatorAdapter($this->searchable, $query, $options, $this->transformer);
102103
}
104+
105+
/**
106+
* {@inheritdoc}
107+
*/
108+
public function createHybridPaginatorAdapter($query)
109+
{
110+
$query = Query::create($query);
111+
112+
return new HybridPaginatorAdapter($this->searchable, $query, $this->transformer);
113+
}
103114
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace FOS\ElasticaBundle\Paginator;
4+
5+
use FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface;
6+
use Elastica\SearchableInterface;
7+
use Elastica\Query;
8+
9+
/**
10+
* Allows pagination of \Elastica\Query
11+
*/
12+
class HybridPaginatorAdapter extends RawPaginatorAdapter
13+
{
14+
private $transformer;
15+
16+
/**
17+
* @param SearchableInterface $searchable the object to search in
18+
* @param Query $query the query to search
19+
* @param ElasticaToModelTransformerInterface $transformer the transformer for fetching the results
20+
*/
21+
public function __construct(SearchableInterface $searchable, Query $query, ElasticaToModelTransformerInterface $transformer)
22+
{
23+
parent::__construct($searchable, $query);
24+
25+
$this->transformer = $transformer;
26+
}
27+
28+
/**
29+
* {@inheritDoc}
30+
*/
31+
public function getResults($offset, $length)
32+
{
33+
return new HybridPartialResults($this->getElasticaResults($offset, $length), $this->transformer);
34+
}
35+
}

Paginator/HybridPartialResults.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace FOS\ElasticaBundle\Paginator;
4+
5+
use FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface;
6+
use Elastica\ResultSet;
7+
8+
/**
9+
* Partial transformed result set
10+
*/
11+
class HybridPartialResults extends RawPartialResults
12+
{
13+
/**
14+
* @var ElasticaToModelTransformerInterface
15+
*/
16+
protected $transformer;
17+
18+
/**
19+
* @param ResultSet $resultSet
20+
* @param ElasticaToModelTransformerInterface $transformer
21+
*/
22+
public function __construct(ResultSet $resultSet, ElasticaToModelTransformerInterface $transformer)
23+
{
24+
parent::__construct($resultSet);
25+
26+
$this->transformer = $transformer;
27+
}
28+
29+
/**
30+
* {@inheritDoc}
31+
*/
32+
public function toArray()
33+
{
34+
return $this->transformer->hybridTransform($this->resultSet->getResults());
35+
}
36+
}

Repository.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,14 @@ public function createPaginatorAdapter($query, $options = array())
6868
{
6969
return $this->finder->createPaginatorAdapter($query, $options);
7070
}
71+
72+
/**
73+
* @param mixed $query
74+
*
75+
* @return Paginator\HybridPaginatorAdapter
76+
*/
77+
public function createHybridPaginatorAdapter($query)
78+
{
79+
return $this->finder->createHybridPaginatorAdapter($query);
80+
}
7181
}

Tests/Finder/TransformedFinderTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,24 @@ public function testFindPaginatedReturnsAConfiguredPagerfantaObject()
126126

127127
$this->assertInstanceOf('Pagerfanta\Pagerfanta', $pagerfanta);
128128
}
129+
130+
public function testCreatePaginatorAdapter()
131+
{
132+
$searchable = $this->getMock('Elastica\SearchableInterface');
133+
$transformer = $this->getMock('FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface');
134+
135+
$finder = new TransformedFinder($searchable, $transformer);
136+
137+
$this->assertInstanceOf('FOS\ElasticaBundle\Paginator\TransformedPaginatorAdapter', $finder->createPaginatorAdapter(''));
138+
}
139+
140+
public function testCreateHybridPaginatorAdapter()
141+
{
142+
$searchable = $this->getMock('Elastica\SearchableInterface');
143+
$transformer = $this->getMock('FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface');
144+
145+
$finder = new TransformedFinder($searchable, $transformer);
146+
147+
$this->assertInstanceOf('FOS\ElasticaBundle\Paginator\HybridPaginatorAdapter', $finder->createHybridPaginatorAdapter(''));
148+
}
129149
}

0 commit comments

Comments
 (0)