2011-04-17 19:56:32 +02:00
|
|
|
<?php
|
|
|
|
|
2013-03-27 18:44:06 +01:00
|
|
|
namespace FOS\ElasticaBundle\Doctrine;
|
2011-04-17 19:56:32 +02:00
|
|
|
|
2012-03-10 00:51:08 +01:00
|
|
|
use Doctrine\Common\Persistence\ManagerRegistry;
|
2013-12-10 18:07:22 +01:00
|
|
|
use Elastica\Exception\Bulk\ResponseException as BulkResponseException;
|
2013-03-27 18:44:06 +01:00
|
|
|
use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
|
|
|
|
use FOS\ElasticaBundle\Provider\AbstractProvider as BaseAbstractProvider;
|
2014-06-16 08:17:04 +02:00
|
|
|
use FOS\ElasticaBundle\Provider\IndexableInterface;
|
2011-04-17 19:56:32 +02:00
|
|
|
|
2012-03-10 00:51:08 +01:00
|
|
|
abstract class AbstractProvider extends BaseAbstractProvider
|
2011-04-17 19:56:32 +02:00
|
|
|
{
|
2015-03-11 05:54:04 +01:00
|
|
|
/**
|
|
|
|
* @var SliceFetcherInterface
|
|
|
|
*/
|
|
|
|
private $sliceFetcher;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var ManagerRegistry
|
|
|
|
*/
|
2012-03-10 00:51:08 +01:00
|
|
|
protected $managerRegistry;
|
2011-06-07 20:13:34 +02:00
|
|
|
|
|
|
|
/**
|
2012-03-10 00:51:08 +01:00
|
|
|
* Constructor.
|
2011-06-07 20:13:34 +02:00
|
|
|
*
|
2012-03-10 00:51:08 +01:00
|
|
|
* @param ObjectPersisterInterface $objectPersister
|
2015-03-12 11:20:00 +01:00
|
|
|
* @param IndexableInterface $indexable
|
|
|
|
* @param string $objectClass
|
|
|
|
* @param array $options
|
|
|
|
* @param ManagerRegistry $managerRegistry
|
2015-03-12 11:57:26 +01:00
|
|
|
* @param SliceFetcherInterface $sliceFetcher
|
2011-06-07 20:13:34 +02:00
|
|
|
*/
|
2014-06-16 08:17:04 +02:00
|
|
|
public function __construct(
|
|
|
|
ObjectPersisterInterface $objectPersister,
|
|
|
|
IndexableInterface $indexable,
|
|
|
|
$objectClass,
|
|
|
|
array $options,
|
2014-10-13 15:40:31 +02:00
|
|
|
ManagerRegistry $managerRegistry,
|
|
|
|
SliceFetcherInterface $sliceFetcher = null
|
2014-06-16 08:17:04 +02:00
|
|
|
) {
|
|
|
|
parent::__construct($objectPersister, $indexable, $objectClass, array_merge(array(
|
2012-03-10 00:51:08 +01:00
|
|
|
'clear_object_manager' => true,
|
2014-05-23 15:11:45 +02:00
|
|
|
'debug_logging' => false,
|
2014-02-19 11:01:54 +01:00
|
|
|
'ignore_errors' => false,
|
2012-03-10 00:51:08 +01:00
|
|
|
'query_builder_method' => 'createQueryBuilder',
|
|
|
|
), $options));
|
|
|
|
|
|
|
|
$this->managerRegistry = $managerRegistry;
|
2014-10-13 15:40:31 +02:00
|
|
|
$this->sliceFetcher = $sliceFetcher;
|
2011-04-17 19:56:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-01-22 01:18:51 +01:00
|
|
|
* {@inheritDoc}
|
2011-04-17 19:56:32 +02:00
|
|
|
*/
|
2013-10-08 12:00:04 +02:00
|
|
|
public function populate(\Closure $loggerClosure = null, array $options = array())
|
2011-04-17 19:56:32 +02:00
|
|
|
{
|
2014-05-23 15:11:45 +02:00
|
|
|
if (!$this->options['debug_logging']) {
|
2014-03-31 07:45:31 +02:00
|
|
|
$logger = $this->disableLogging();
|
|
|
|
}
|
|
|
|
|
2011-04-17 19:56:32 +02:00
|
|
|
$queryBuilder = $this->createQueryBuilder();
|
2012-03-10 00:51:08 +01:00
|
|
|
$nbObjects = $this->countObjects($queryBuilder);
|
2013-10-08 12:00:04 +02:00
|
|
|
$offset = isset($options['offset']) ? intval($options['offset']) : 0;
|
|
|
|
$sleep = isset($options['sleep']) ? intval($options['sleep']) : 0;
|
|
|
|
$batchSize = isset($options['batch-size']) ? intval($options['batch-size']) : $this->options['batch_size'];
|
2014-02-19 11:01:54 +01:00
|
|
|
$ignoreErrors = isset($options['ignore-errors']) ? $options['ignore-errors'] : $this->options['ignore_errors'];
|
2014-03-31 07:45:31 +02:00
|
|
|
$manager = $this->managerRegistry->getManagerForClass($this->objectClass);
|
2011-04-17 19:56:32 +02:00
|
|
|
|
2015-03-11 05:47:03 +01:00
|
|
|
$objects = array();
|
2013-10-08 12:00:04 +02:00
|
|
|
for (; $offset < $nbObjects; $offset += $batchSize) {
|
2015-03-11 05:47:03 +01:00
|
|
|
$objects = $this->getSlice($queryBuilder, $batchSize, $offset, $objects);
|
2014-06-16 08:17:04 +02:00
|
|
|
$objects = array_filter($objects, array($this, 'isObjectIndexable'));
|
2014-11-13 16:14:36 +01:00
|
|
|
|
2015-01-22 01:18:51 +01:00
|
|
|
if ($objects) {
|
|
|
|
if (!$ignoreErrors) {
|
2013-12-10 18:07:22 +01:00
|
|
|
$this->objectPersister->insertMany($objects);
|
2015-01-22 01:18:51 +01:00
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
$this->objectPersister->insertMany($objects);
|
|
|
|
} catch(BulkResponseException $e) {
|
|
|
|
if ($loggerClosure) {
|
2015-03-11 11:31:23 +01:00
|
|
|
$loggerClosure($batchSize, $nbObjects, sprintf('<error>%s</error>', $e->getMessage()));
|
2015-01-22 01:18:51 +01:00
|
|
|
}
|
2013-12-10 18:07:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-04-17 19:56:32 +02:00
|
|
|
|
|
|
|
if ($this->options['clear_object_manager']) {
|
2014-03-31 07:45:31 +02:00
|
|
|
$manager->clear();
|
2011-04-17 19:56:32 +02:00
|
|
|
}
|
2011-04-27 09:59:04 +02:00
|
|
|
|
2013-10-08 12:00:04 +02:00
|
|
|
usleep($sleep);
|
|
|
|
|
2015-01-22 01:18:51 +01:00
|
|
|
if ($loggerClosure) {
|
|
|
|
$loggerClosure($batchSize, $nbObjects);
|
2012-03-10 00:51:08 +01:00
|
|
|
}
|
2011-04-17 19:56:32 +02:00
|
|
|
}
|
2014-03-31 07:45:31 +02:00
|
|
|
|
2014-05-23 15:11:45 +02:00
|
|
|
if (!$this->options['debug_logging']) {
|
2014-03-31 07:45:31 +02:00
|
|
|
$this->enableLogging($logger);
|
|
|
|
}
|
2011-04-17 19:56:32 +02:00
|
|
|
}
|
|
|
|
|
2015-03-11 05:47:03 +01:00
|
|
|
/**
|
|
|
|
* If this Provider has a SliceFetcher defined, we use it instead of falling back to
|
|
|
|
* the fetchSlice methods defined in the ORM/MongoDB subclasses.
|
|
|
|
*
|
|
|
|
* @param $queryBuilder
|
|
|
|
* @param int $limit
|
|
|
|
* @param int $offset
|
|
|
|
* @param array $lastSlice
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function getSlice($queryBuilder, $limit, $offset, $lastSlice)
|
|
|
|
{
|
|
|
|
if (!$this->sliceFetcher) {
|
|
|
|
return $this->fetchSlice($queryBuilder, $limit, $offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
$manager = $this->managerRegistry->getManagerForClass($this->objectClass);
|
|
|
|
$identifierFieldNames = $manager
|
|
|
|
->getClassMetadata($this->objectClass)
|
|
|
|
->getIdentifierFieldNames();
|
|
|
|
|
|
|
|
return $this->sliceFetcher->fetch(
|
|
|
|
$queryBuilder,
|
|
|
|
$limit,
|
|
|
|
$offset,
|
|
|
|
$lastSlice,
|
|
|
|
$identifierFieldNames
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2011-05-09 18:48:25 +02:00
|
|
|
/**
|
2012-03-10 00:51:08 +01:00
|
|
|
* Counts objects that would be indexed using the query builder.
|
2011-05-09 18:48:25 +02:00
|
|
|
*
|
2012-03-10 00:51:08 +01:00
|
|
|
* @param object $queryBuilder
|
2015-03-12 11:20:00 +01:00
|
|
|
*
|
2012-03-10 00:51:08 +01:00
|
|
|
* @return integer
|
|
|
|
*/
|
2015-03-12 11:20:00 +01:00
|
|
|
abstract protected function countObjects($queryBuilder);
|
2011-05-09 18:48:25 +02:00
|
|
|
|
2014-03-31 07:45:31 +02:00
|
|
|
/**
|
|
|
|
* Disables logging and returns the logger that was previously set.
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
2015-03-12 11:20:00 +01:00
|
|
|
abstract protected function disableLogging();
|
2014-03-31 07:45:31 +02:00
|
|
|
|
|
|
|
/**
|
2015-03-12 11:20:00 +01:00
|
|
|
* Reenables the logger with the previously returned logger from disableLogging();.
|
2014-03-31 07:45:31 +02:00
|
|
|
*
|
|
|
|
* @param mixed $logger
|
2015-03-12 11:20:00 +01:00
|
|
|
*
|
2014-03-31 07:45:31 +02:00
|
|
|
* @return mixed
|
|
|
|
*/
|
2015-03-12 11:20:00 +01:00
|
|
|
abstract protected function enableLogging($logger);
|
2014-03-31 07:45:31 +02:00
|
|
|
|
2011-05-09 19:56:27 +02:00
|
|
|
/**
|
2012-03-10 00:51:08 +01:00
|
|
|
* Fetches a slice of objects using the query builder.
|
2011-05-09 19:56:27 +02:00
|
|
|
*
|
2012-03-10 00:51:08 +01:00
|
|
|
* @param object $queryBuilder
|
|
|
|
* @param integer $limit
|
|
|
|
* @param integer $offset
|
2015-03-12 11:20:00 +01:00
|
|
|
*
|
2012-03-10 00:51:08 +01:00
|
|
|
* @return array
|
|
|
|
*/
|
2015-03-12 11:20:00 +01:00
|
|
|
abstract protected function fetchSlice($queryBuilder, $limit, $offset);
|
2011-05-09 19:56:27 +02:00
|
|
|
|
2011-04-17 19:56:32 +02:00
|
|
|
/**
|
2012-03-10 00:51:08 +01:00
|
|
|
* Creates the query builder, which will be used to fetch objects to index.
|
2011-04-17 19:56:32 +02:00
|
|
|
*
|
2012-03-10 00:51:08 +01:00
|
|
|
* @return object
|
|
|
|
*/
|
2015-03-12 11:20:00 +01:00
|
|
|
abstract protected function createQueryBuilder();
|
2011-04-17 19:56:32 +02:00
|
|
|
}
|