FOSElasticaBundle/Finder/TransformedFinder.php

107 lines
2.9 KiB
PHP
Raw Normal View History

<?php
namespace FOS\ElasticaBundle\Finder;
use Elastica\Document;
use FOS\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface;
use FOS\ElasticaBundle\Paginator\TransformedPaginatorAdapter;
use FOS\ElasticaBundle\Paginator\FantaPaginatorAdapter;
use Pagerfanta\Pagerfanta;
use Elastica\SearchableInterface;
use Elastica\Query;
/**
* Finds elastica documents and map them to persisted objects
*/
2012-07-10 21:38:08 +02:00
class TransformedFinder implements PaginatedFinderInterface
{
protected $searchable;
protected $transformer;
public function __construct(SearchableInterface $searchable, ElasticaToModelTransformerInterface $transformer)
{
$this->searchable = $searchable;
$this->transformer = $transformer;
}
/**
2011-04-28 00:14:21 +02:00
* Search for a query string
*
2011-06-11 01:03:17 +02:00
* @param string $query
* @param integer $limit
* @param array $options
2011-04-28 00:14:21 +02:00
* @return array of model objects
**/
public function find($query, $limit = null, $options = array())
2012-02-23 23:50:46 +01:00
{
$results = $this->search($query, $limit, $options);
2012-02-23 23:50:46 +01:00
return $this->transformer->transform($results);
}
public function findHybrid($query, $limit = null, $options = array())
2012-02-23 23:50:46 +01:00
{
$results = $this->search($query, $limit, $options);
2012-02-23 23:50:46 +01:00
return $this->transformer->hybridTransform($results);
}
2013-08-12 12:04:54 +02:00
/**
* Find documents similar to one with passed id.
*
* @param integer $id
* @param array $params
* @param array $query
* @return array of model objects
**/
public function moreLikeThis($id, $params = array(), $query = array())
{
$doc = new Document($id);
$results = $this->searchable->moreLikeThis($doc, $params, $query)->getResults();
return $this->transformer->transform($results);
2012-02-23 23:50:46 +01:00
}
/**
* @param $query
* @param null|int $limit
* @param array $options
* @return array
*/
protected function search($query, $limit = null, $options = array())
{
$queryObject = Query::create($query);
2011-06-11 01:03:17 +02:00
if (null !== $limit) {
$queryObject->setSize($limit);
2011-06-11 01:03:17 +02:00
}
$results = $this->searchable->search($queryObject, $options)->getResults();
2012-02-23 23:50:46 +01:00
return $results;
}
/**
* Gets a paginator wrapping the result of a search
*
* @param string $query
* @param array $options
* @return Pagerfanta
2012-06-13 20:28:16 +02:00
*/
public function findPaginated($query, $options = array())
{
$queryObject = Query::create($query);
$paginatorAdapter = $this->createPaginatorAdapter($queryObject, $options);
return new Pagerfanta(new FantaPaginatorAdapter($paginatorAdapter));
}
/**
* {@inheritdoc}
*/
public function createPaginatorAdapter($query, $options = array())
{
$query = Query::create($query);
2013-11-14 16:04:08 +01:00
return new TransformedPaginatorAdapter($this->searchable, $query, $options, $this->transformer);
}
}