2012-01-03 23:16:56 +01:00
|
|
|
<?php
|
|
|
|
|
2013-03-27 18:44:06 +01:00
|
|
|
namespace FOS\ElasticaBundle\Transformer;
|
2012-01-03 23:16:56 +01:00
|
|
|
|
2013-03-27 18:44:06 +01:00
|
|
|
use FOS\ElasticaBundle\HybridResult;
|
2013-04-22 13:20:10 +02:00
|
|
|
use Elastica\Document;
|
2012-02-23 23:50:46 +01:00
|
|
|
|
2012-01-03 23:16:56 +01:00
|
|
|
/**
|
|
|
|
* Holds a collection of transformers for an index wide transformation.
|
|
|
|
*
|
|
|
|
* @author Tim Nagel <tim@nagel.com.au>
|
|
|
|
*/
|
|
|
|
class ElasticaToModelTransformerCollection implements ElasticaToModelTransformerInterface
|
|
|
|
{
|
2013-03-02 12:23:44 +01:00
|
|
|
/**
|
|
|
|
* @var ElasticaToModelTransformerInterface[]
|
|
|
|
*/
|
2012-01-03 23:16:56 +01:00
|
|
|
protected $transformers = array();
|
|
|
|
|
2012-09-25 00:15:05 +02:00
|
|
|
public function __construct(array $transformers)
|
2012-01-03 23:16:56 +01:00
|
|
|
{
|
|
|
|
$this->transformers = $transformers;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getObjectClass()
|
|
|
|
{
|
2013-03-02 12:23:44 +01:00
|
|
|
return array_map(function (ElasticaToModelTransformerInterface $transformer) {
|
2012-01-03 23:16:56 +01:00
|
|
|
return $transformer->getObjectClass();
|
|
|
|
}, $this->transformers);
|
|
|
|
}
|
|
|
|
|
2012-09-25 00:15:05 +02:00
|
|
|
/**
|
|
|
|
* {@inheritdoc}
|
|
|
|
*/
|
|
|
|
public function getIdentifierField()
|
|
|
|
{
|
2013-03-02 12:23:44 +01:00
|
|
|
return array_map(function (ElasticaToModelTransformerInterface $transformer) {
|
2012-09-25 00:15:05 +02:00
|
|
|
return $transformer->getIdentifierField();
|
|
|
|
}, $this->transformers);
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:23:44 +01:00
|
|
|
/**
|
2013-04-22 13:20:10 +02:00
|
|
|
* @param Document[] $elasticaObjects
|
2015-03-12 11:20:00 +01:00
|
|
|
*
|
2013-03-02 12:23:44 +01:00
|
|
|
* @return array
|
|
|
|
*/
|
2012-01-03 23:16:56 +01:00
|
|
|
public function transform(array $elasticaObjects)
|
|
|
|
{
|
|
|
|
$sorted = array();
|
|
|
|
foreach ($elasticaObjects as $object) {
|
|
|
|
$sorted[$object->getType()][] = $object;
|
|
|
|
}
|
|
|
|
|
|
|
|
$transformed = array();
|
2015-03-12 11:20:00 +01:00
|
|
|
foreach ($sorted as $type => $objects) {
|
2012-05-04 16:05:02 +02:00
|
|
|
$transformedObjects = $this->transformers[$type]->transform($objects);
|
2015-03-12 11:20:00 +01:00
|
|
|
$identifierGetter = 'get'.ucfirst($this->transformers[$type]->getIdentifierField());
|
2012-09-25 00:15:05 +02:00
|
|
|
$transformed[$type] = array_combine(
|
|
|
|
array_map(
|
2015-03-12 11:20:00 +01:00
|
|
|
function ($o) use ($identifierGetter) {
|
2012-09-25 00:15:05 +02:00
|
|
|
return $o->$identifierGetter();
|
|
|
|
},
|
|
|
|
$transformedObjects
|
|
|
|
),
|
|
|
|
$transformedObjects
|
|
|
|
);
|
2012-01-03 23:16:56 +01:00
|
|
|
}
|
|
|
|
|
2012-05-03 04:06:41 +02:00
|
|
|
$result = array();
|
|
|
|
foreach ($elasticaObjects as $object) {
|
2014-02-03 09:47:16 +01:00
|
|
|
if (array_key_exists($object->getId(), $transformed[$object->getType()])) {
|
|
|
|
$result[] = $transformed[$object->getType()][$object->getId()];
|
|
|
|
}
|
2012-05-03 04:06:41 +02:00
|
|
|
}
|
2012-01-03 23:16:56 +01:00
|
|
|
|
2012-05-03 04:06:41 +02:00
|
|
|
return $result;
|
2012-01-03 23:16:56 +01:00
|
|
|
}
|
|
|
|
|
2012-02-23 23:50:46 +01:00
|
|
|
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;
|
|
|
|
}
|
2012-09-25 00:15:05 +02:00
|
|
|
}
|