ContentEntityTaskManager.php in Search API 8
File
src/Plugin/search_api/datasource/ContentEntityTaskManager.php
View source
<?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;
class ContentEntityTaskManager implements EventSubscriberInterface {
const INSERT_ITEMS_TASK_TYPE = 'search_api.entity_datasource.trackItemsInserted';
const DELETE_ITEMS_TASK_TYPE = 'search_api.entity_datasource.trackItemsDeleted';
protected $taskManager;
protected $entityTypeManager;
public function __construct(TaskManagerInterface $task_manager, EntityTypeManagerInterface $entity_type_manager) {
$this->taskManager = $task_manager;
$this->entityTypeManager = $entity_type_manager;
}
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;
}
public function processEvent(TaskEvent $event, $event_name) {
$event
->stopPropagation();
$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);
$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);
}
}
}