diff --git a/Doctrine/AbstractElasticaToModelTransformer.php b/Doctrine/AbstractElasticaToModelTransformer.php index e811369..7bb1b71 100644 --- a/Doctrine/AbstractElasticaToModelTransformer.php +++ b/Doctrine/AbstractElasticaToModelTransformer.php @@ -2,6 +2,7 @@ namespace FOQ\ElasticaBundle\Doctrine; +use FOQ\ElasticaBundle\HybridResult; use FOQ\ElasticaBundle\Transformer\ElasticaToModelTransformerInterface; use Elastica_Document; @@ -85,6 +86,18 @@ abstract class AbstractElasticaToModelTransformer implements ElasticaToModelTran 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 * diff --git a/Finder/TransformedFinder.php b/Finder/TransformedFinder.php index 02dc741..00317f8 100644 --- a/Finder/TransformedFinder.php +++ b/Finder/TransformedFinder.php @@ -32,6 +32,20 @@ class TransformedFinder implements FinderInterface, PaginatedFinderInterface * @return array of model objects **/ 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); if (null !== $limit) { @@ -39,9 +53,10 @@ class TransformedFinder implements FinderInterface, PaginatedFinderInterface } $results = $this->searchable->search($queryObject)->getResults(); - return $this->transformer->transform($results); + return $results; } + /** * Gets a paginator wrapping the result of a search * diff --git a/HybridResult.php b/HybridResult.php new file mode 100644 index 0000000..f5c1b07 --- /dev/null +++ b/HybridResult.php @@ -0,0 +1,27 @@ +result = $result; + $this->transformed = $transformed; + } + + public function getTransformed() + { + return $this->transformed; + } + + public function getResult() + { + return $this->result; + } +} \ No newline at end of file diff --git a/Transformer/ElasticaToModelTransformerCollection.php b/Transformer/ElasticaToModelTransformerCollection.php index ab736f9..506a0a8 100644 --- a/Transformer/ElasticaToModelTransformerCollection.php +++ b/Transformer/ElasticaToModelTransformerCollection.php @@ -2,6 +2,8 @@ namespace FOQ\ElasticaBundle\Transformer; +use FOQ\ElasticaBundle\HybridResult; + /** * Holds a collection of transformers for an index wide transformation. * @@ -56,6 +58,18 @@ class ElasticaToModelTransformerCollection implements ElasticaToModelTransformer 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() { return array_map(function ($transformer) { diff --git a/Transformer/ElasticaToModelTransformerInterface.php b/Transformer/ElasticaToModelTransformerInterface.php index f4b6e43..5f3f5aa 100644 --- a/Transformer/ElasticaToModelTransformerInterface.php +++ b/Transformer/ElasticaToModelTransformerInterface.php @@ -16,6 +16,8 @@ interface ElasticaToModelTransformerInterface **/ function transform(array $elasticaObjects); + function hybridTransform(array $elasticaObjects); + /** * Returns the object class used by the transformer. *