Hybrid finder results

This commit is contained in:
Tim Nagel 2012-02-24 09:50:46 +11:00
parent 5e19a37344
commit 76f447ba7d
5 changed files with 72 additions and 1 deletions

View file

@ -2,6 +2,7 @@
namespace FOQ\ElasticaBundle\Doctrine; namespace FOQ\ElasticaBundle\Doctrine;
use FOQ\ElasticaBundle\HybridResult;
use FOQ\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface; use FOQ\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface;
use Elastica_Document; use Elastica_Document;
@ -85,6 +86,18 @@ abstract class AbstractElasticaToModelTransformer implements ElasticaToModelTran
return $objects; return $objects;
} }
public function hybridTransform(array $elasticaObjects)
{
$objects = $this->transform($elasticaObjects);
$result = array();
for ($i = 0; $i < count($elasticaObjects); $i++) {
$result[] = new HybridResult($elasticaObjects[$i], $objects[$i]);
}
return $result;
}
/** /**
* Fetches objects by theses identifier values * Fetches objects by theses identifier values
* *

View file

@ -32,6 +32,20 @@ class TransformedFinder implements FinderInterface, PaginatedFinderInterface
* @return array of model objects * @return array of model objects
**/ **/
public function find($query, $limit = null) public function find($query, $limit = null)
{
$results = $this->search($query, $limit);
return $this->transformer->transform($results);
}
public function findHybrid($query, $limit = null)
{
$results = $this->search($query, $limit);
return $this->transformer->hybridTransform($results);
}
protected function search($query, $limit = null)
{ {
$queryObject = Elastica_Query::create($query); $queryObject = Elastica_Query::create($query);
if (null !== $limit) { if (null !== $limit) {
@ -39,9 +53,10 @@ class TransformedFinder implements FinderInterface, PaginatedFinderInterface
} }
$results = $this->searchable->search($queryObject)->getResults(); $results = $this->searchable->search($queryObject)->getResults();
return $this->transformer->transform($results); return $results;
} }
/** /**
* Gets a paginator wrapping the result of a search * Gets a paginator wrapping the result of a search
* *

27
HybridResult.php Normal file
View file

@ -0,0 +1,27 @@
<?php
namespace FOQ\ElasticaBundle;
use Elastica_Result;
class HybridResult
{
protected $result;
protected $transformed;
public function __construct(Elastica_Result $result, $transformed = null)
{
$this->result = $result;
$this->transformed = $transformed;
}
public function getTransformed()
{
return $this->transformed;
}
public function getResult()
{
return $this->result;
}
}

View file

@ -2,6 +2,8 @@
namespace FOQ\ElasticaBundle\Transformer; namespace FOQ\ElasticaBundle\Transformer;
use FOQ\ElasticaBundle\HybridResult;
/** /**
* Holds a collection of transformers for an index wide transformation. * Holds a collection of transformers for an index wide transformation.
* *
@ -56,6 +58,18 @@ class ElasticaToModelTransformerCollection implements ElasticaToModelTransformer
return $transformed; return $transformed;
} }
public function hybridTransform(array $elasticaObjects)
{
$objects = $this->transform($elasticaObjects);
$result = array();
for ($i = 0; $i < count($elasticaObjects); $i++) {
$result[] = new HybridResult($elasticaObjects[$i], $objects[$i]);
}
return $result;
}
protected function getTypeToClassMap() protected function getTypeToClassMap()
{ {
return array_map(function ($transformer) { return array_map(function ($transformer) {

View file

@ -16,6 +16,8 @@ interface ElasticaToModelTransformerInterface
**/ **/
function transform(array $elasticaObjects); function transform(array $elasticaObjects);
function hybridTransform(array $elasticaObjects);
/** /**
* Returns the object class used by the transformer. * Returns the object class used by the transformer.
* *