search_api-8.x-1.15/src/Task/ServerTaskManager.php
src/Task/ServerTaskManager.php
<?php
namespace Drupal\search_api\Task;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\search_api\IndexInterface;
use Drupal\search_api\LoggerTrait;
use Drupal\search_api\SearchApiException;
use Drupal\search_api\ServerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Provides a service for managing pending server tasks.
*/
class ServerTaskManager implements ServerTaskManagerInterface, EventSubscriberInterface {
use LoggerTrait;
use StringTranslationTrait;
/**
* 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 ServerTaskManager 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 = [];
foreach (static::getSupportedTypes() as $type) {
$events['search_api.task.' . $type][] = ['processEvent'];
}
return $events;
}
/**
* Retrieves the task types supported by this task manager.
*
* @return string[]
* The task types supported by this task manager.
*/
protected static function getSupportedTypes() {
return [
'addIndex',
'updateIndex',
'removeIndex',
'deleteItems',
'deleteAllIndexItems',
];
}
/**
* {@inheritdoc}
*/
public function getCount(ServerInterface $server = NULL) {
return $this->taskManager->getTasksCount($this->getTaskConditions($server));
}
/**
* {@inheritdoc}
*/
public function execute(ServerInterface $server = NULL) {
if ($server && !$server->status()) {
return FALSE;
}
$conditions = $this->getTaskConditions($server);
try {
return $this->taskManager->executeAllTasks($conditions, 100);
}
catch (SearchApiException $e) {
$this->logException($e);
return FALSE;
}
}
/**
* Processes a single server task.
*
* @param \Drupal\search_api\Task\TaskEvent $event
* The task event.
*/
public function processEvent(TaskEvent $event) {
$event->stopPropagation();
$task = $event->getTask();
try {
if (!$this->executeTask($task)) {
$type = $task->getType();
throw new SearchApiException("Task of unknown type '$type' passed to server task manager.");
}
}
catch (SearchApiException $e) {
$event->setException($e);
}
}
/**
* Executes a single server task.
*
* @param \Drupal\search_api\Task\TaskInterface $task
* The task to execute.
*
* @return bool
* TRUE if the task was successfully executed, FALSE if the task type was
* unknown.
*
* @throws \Drupal\search_api\SearchApiException
* If any error occurred while executing the task.
*/
protected function executeTask(TaskInterface $task) {
$server = $task->getServer();
$index = $task->getIndex();
$data = $task->getData();
switch ($task->getType()) {
case 'addIndex':
if ($index) {
$server->getBackend()->addIndex($index);
}
return TRUE;
case 'updateIndex':
if ($index) {
if ($data) {
$index->original = $data;
}
$server->getBackend()->updateIndex($index);
}
return TRUE;
case 'removeIndex':
$index = $index ?: $data;
if ($index) {
$server->getBackend()->removeIndex($index);
}
return TRUE;
case 'deleteItems':
if ($index && !$index->isReadOnly()) {
$server->getBackend()->deleteItems($index, $data);
}
return TRUE;
case 'deleteAllIndexItems':
if ($index && !$index->isReadOnly()) {
$server->getBackend()->deleteAllIndexItems($index, $data);
}
return TRUE;
}
// We didn't know that type of task.
return FALSE;
}
/**
* {@inheritdoc}
*/
public function setExecuteBatch(ServerInterface $server = NULL) {
$this->taskManager->setTasksBatch($this->getTaskConditions($server));
}
/**
* {@inheritdoc}
*/
public function delete(ServerInterface $server = NULL, $index = NULL, array $types = NULL) {
$conditions = $this->getTaskConditions($server);
if ($index !== NULL) {
$conditions['index_id'] = $index instanceof IndexInterface ? $index->id() : $index;
}
if ($types !== NULL) {
$conditions['type'] = $types;
}
$this->taskManager->deleteTasks($conditions);
}
/**
* Gets a set of conditions for finding the tracking tasks of the given index.
*
* @param \Drupal\search_api\ServerInterface $server
* The server for which to retrieve tasks.
*
* @return array
* An array of conditions to pass to the Search API task manager.
*/
protected function getTaskConditions(ServerInterface $server = NULL) {
$conditions['type'] = static::getSupportedTypes();
if ($server) {
$conditions['server_id'] = $server->id();
}
return $conditions;
}
}
