search_api-8.x-1.15/src/Plugin/search_api/datasource/ContentEntityTaskManager.php
src/Plugin/search_api/datasource/ContentEntityTaskManager.php
<?php namespace Drupal\search_api\Plugin\search_api\datasource; use Drupal\Component\Render\FormattableMarkup; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\search_api\SearchApiException; use Drupal\search_api\Task\TaskEvent; use Drupal\search_api\Task\TaskManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Provides a service for managing pending tracking tasks for datasources. */ class ContentEntityTaskManager implements EventSubscriberInterface { /** * The Search API task type used by this service for "insert items" tasks. */ const INSERT_ITEMS_TASK_TYPE = 'search_api.entity_datasource.trackItemsInserted'; /** * The Search API task type used by this service for "delete items" tasks. */ const DELETE_ITEMS_TASK_TYPE = 'search_api.entity_datasource.trackItemsDeleted'; /** * The Search API task manager. * * @var \Drupal\search_api\Task\TaskManagerInterface */ protected $taskManager; /** * The entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * Constructs a ContentEntityTaskManager object. * * @param \Drupal\search_api\Task\TaskManagerInterface $task_manager * The Search API task manager. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. */ public function __construct(TaskManagerInterface $task_manager, EntityTypeManagerInterface $entity_type_manager) { $this->taskManager = $task_manager; $this->entityTypeManager = $entity_type_manager; } /** * {@inheritdoc} */ public static function getSubscribedEvents() { $events['search_api.task.' . self::INSERT_ITEMS_TASK_TYPE][] = ['processEvent']; $events['search_api.task.' . self::DELETE_ITEMS_TASK_TYPE][] = ['processEvent']; return $events; } /** * Processes a datasource tracking event. * * @param \Drupal\search_api\Task\TaskEvent $event * The task event. * @param string $event_name * The name of the event. */ public function processEvent(TaskEvent $event, $event_name) { $event->stopPropagation(); // The complete event name prefix in front of the method name is 45 // characters long: "search_api.task.search_api.entity_datasource.". $method = substr($event_name, 45); $task = $event->getTask(); $index = $task->getIndex(); $data = $task->getData(); if (!$index->hasValidTracker()) { $args['%index'] = $index->label(); $message = new FormattableMarkup('Index %index does not have a valid tracker set.', $args); $event->setException(new SearchApiException($message)); return; } $datasource_id = $data['datasource']; $reschedule = FALSE; if ($index->isValidDatasource($datasource_id)) { $datasource = $index->getDatasource($datasource_id); if ($datasource instanceof EntityDatasourceInterface) { $raw_ids = $datasource->getPartialItemIds($data['page'], $data['bundles'], $data['languages']); if ($raw_ids !== NULL) { $reschedule = TRUE; if ($raw_ids) { $index->startBatchTracking(); $index->$method($datasource_id, $raw_ids); $index->stopBatchTracking(); } } } } if ($reschedule) { ++$data['page']; $this->taskManager->addTask($task->getType(), NULL, $index, $data); } } }