vendor/friendsofsymfony/elastica-bundle/Doctrine/AbstractProvider.php line 12

Open in your IDE?
  1. <?php
  2. namespace FOS\ElasticaBundle\Doctrine;
  3. use Doctrine\Common\Persistence\ManagerRegistry;
  4. use Elastica\Exception\Bulk\ResponseException as BulkResponseException;
  5. use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
  6. use FOS\ElasticaBundle\Provider\AbstractProvider as BaseAbstractProvider;
  7. use FOS\ElasticaBundle\Provider\IndexableInterface;
  8. use Symfony\Component\OptionsResolver\OptionsResolver;
  9. @trigger_error(sprintf('The %s class is deprecated since version 4.1 and will be removed in 5.0.'AbstractProvider::class), E_USER_DEPRECATED);
  10. /**
  11.  * @deprecated since 4.1 will be removed in 5.x.
  12.  */
  13. abstract class AbstractProvider extends BaseAbstractProvider
  14. {
  15.     /**
  16.      * @var SliceFetcherInterface
  17.      */
  18.     private $sliceFetcher;
  19.     /**
  20.      * @var ManagerRegistry
  21.      */
  22.     protected $managerRegistry;
  23.     /**
  24.      * Constructor.
  25.      *
  26.      * @param ObjectPersisterInterface $objectPersister
  27.      * @param IndexableInterface       $indexable
  28.      * @param string                   $objectClass
  29.      * @param array                    $baseOptions
  30.      * @param ManagerRegistry          $managerRegistry
  31.      * @param SliceFetcherInterface    $sliceFetcher
  32.      */
  33.     public function __construct(
  34.         ObjectPersisterInterface $objectPersister,
  35.         IndexableInterface $indexable,
  36.         $objectClass,
  37.         array $baseOptions,
  38.         ManagerRegistry $managerRegistry,
  39.         SliceFetcherInterface $sliceFetcher null
  40.     ) {
  41.         parent::__construct($objectPersister$indexable$objectClass$baseOptions);
  42.         $this->managerRegistry $managerRegistry;
  43.         $this->sliceFetcher $sliceFetcher;
  44.     }
  45.     /**
  46.      * Counts objects that would be indexed using the query builder.
  47.      *
  48.      * @param object $queryBuilder
  49.      *
  50.      * @return integer
  51.      */
  52.     abstract protected function countObjects($queryBuilder);
  53.     /**
  54.      * Creates the query builder, which will be used to fetch objects to index.
  55.      *
  56.      * @param string $method
  57.      * @param array $arguments
  58.      *
  59.      * @return object
  60.      */
  61.     abstract protected function createQueryBuilder($method, array $arguments = array());
  62.     /**
  63.      * Fetches a slice of objects using the query builder.
  64.      *
  65.      * @param object  $queryBuilder
  66.      * @param integer $limit
  67.      * @param integer $offset
  68.      *
  69.      * @return array
  70.      */
  71.     abstract protected function fetchSlice($queryBuilder$limit$offset);
  72.     /**
  73.      * {@inheritDoc}
  74.      */
  75.     protected function doPopulate($options, \Closure $loggerClosure null)
  76.     {
  77.         $manager $this->managerRegistry->getManagerForClass($this->objectClass);
  78.         $queryBuilder $this->createQueryBuilder($options['query_builder_method']);
  79.         $nbObjects $this->countObjects($queryBuilder);
  80.         $offset $options['offset'];
  81.         $objects = array();
  82.         for (; $offset $nbObjects$offset += $options['batch_size']) {
  83.             $sliceSize $options['batch_size'];
  84.             try {
  85.                 $objects $this->getSlice($queryBuilder$options['batch_size'], $offset$objects);
  86.                 $sliceSize count($objects);
  87.                 $objects $this->filterObjects($options$objects);
  88.                 if (!empty($objects)) {
  89.                     $this->objectPersister->insertMany($objects);
  90.                 }
  91.             } catch (BulkResponseException $e) {
  92.                 if (!$options['ignore_errors']) {
  93.                     throw $e;
  94.                 }
  95.                 if (null !== $loggerClosure) {
  96.                     $loggerClosure(
  97.                         $options['batch_size'],
  98.                         $nbObjects,
  99.                         sprintf('<error>%s</error>'$e->getMessage())
  100.                     );
  101.                 }
  102.             }
  103.             if ($options['clear_object_manager']) {
  104.                 $manager->clear();
  105.             }
  106.             usleep($options['sleep']);
  107.             if (null !== $loggerClosure) {
  108.                 $loggerClosure($sliceSize$nbObjects);
  109.             }
  110.         }
  111.     }
  112.     /**
  113.      * {@inheritDoc}
  114.      */
  115.     protected function configureOptions()
  116.     {
  117.         parent::configureOptions();
  118.         $this->resolver->setDefaults(array(
  119.             'clear_object_manager' => true,
  120.             'debug_logging'        => false,
  121.             'ignore_errors'        => false,
  122.             'offset'               => 0,
  123.             'query_builder_method' => 'createQueryBuilder',
  124.             'sleep'                => 0,
  125.             'pager_provider'       => true,
  126.         ));
  127.     }
  128.     /**
  129.      * If this Provider has a SliceFetcher defined, we use it instead of falling back to
  130.      * the fetchSlice methods defined in the ORM/MongoDB subclasses.
  131.      *
  132.      * @param $queryBuilder
  133.      * @param int   $limit
  134.      * @param int   $offset
  135.      * @param array $lastSlice
  136.      *
  137.      * @return array
  138.      */
  139.     private function getSlice($queryBuilder$limit$offset$lastSlice)
  140.     {
  141.         if (!$this->sliceFetcher) {
  142.             return $this->fetchSlice($queryBuilder$limit$offset);
  143.         }
  144.         $manager $this->managerRegistry->getManagerForClass($this->objectClass);
  145.         $identifierFieldNames $manager
  146.             ->getClassMetadata($this->objectClass)
  147.             ->getIdentifierFieldNames();
  148.         return $this->sliceFetcher->fetch(
  149.             $queryBuilder,
  150.             $limit,
  151.             $offset,
  152.             $lastSlice,
  153.             $identifierFieldNames
  154.         );
  155.     }
  156. }