search_api-8.x-1.15/src/UnsavedIndexConfiguration.php
src/UnsavedIndexConfiguration.php
<?php namespace Drupal\search_api; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityStorageException; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Session\AccountInterface; use Drupal\search_api\Datasource\DatasourceInterface; use Drupal\search_api\Entity\Index; use Drupal\search_api\Item\FieldInterface; use Drupal\search_api\Processor\ProcessorInterface; use Drupal\search_api\Query\QueryInterface; use Drupal\search_api\Query\ResultSetInterface; use Drupal\search_api\Tracker\TrackerInterface; use Drupal\Core\TempStore\SharedTempStore; /** * Represents a configuration of an index that was not yet permanently saved. */ class UnsavedIndexConfiguration implements IndexInterface, UnsavedConfigurationInterface { /** * The proxied index. * * @var \Drupal\search_api\IndexInterface */ protected $entity; /** * The shared temporary storage to use. * * @var \Drupal\Core\TempStore\SharedTempStore */ protected $tempStore; /** * Either the UID of the currently logged-in user, or the session ID. * * @var int|string */ protected $currentUserId; /** * The lock information for this configuration. * * @var object|null */ protected $lock; /** * The entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface|null */ protected $entityTypeManager; /** * Constructs a new UnsavedIndexConfiguration. * * @param \Drupal\search_api\IndexInterface $index * The index to proxy. * @param \Drupal\Core\TempStore\SharedTempStore $temp_store * The shared temporary storage to use. * @param int|string $current_user_id * Either the UID of the currently logged-in user, or the session ID (for * anonymous users). */ public function __construct(IndexInterface $index, SharedTempStore $temp_store, $current_user_id) { $this->entity = $index; $this->tempStore = $temp_store; $this->currentUserId = $current_user_id; } /** * Retrieves the entity type manager. * * @return \Drupal\Core\Entity\EntityTypeManagerInterface * The entity type manager. */ public function getEntityTypeManager() { return $this->entityTypeManager ?: \Drupal::entityTypeManager(); } /** * Sets the entity type manager. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The new entity type manager. * * @return $this */ public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager) { $this->entityTypeManager = $entity_type_manager; return $this; } /** * {@inheritdoc} */ public function setCurrentUserId($current_user_id) { $this->currentUserId = $current_user_id; } /** * {@inheritdoc} */ public function hasChanges() { return (bool) $this->lock; } /** * {@inheritdoc} */ public function isLocked() { if ($this->lock) { return $this->lock->owner != $this->currentUserId; } return FALSE; } /** * {@inheritdoc} */ public function getLockOwner() { if (!$this->lock) { return NULL; } $uid = is_numeric($this->lock->owner) ? $this->lock->owner : 0; return $this->getEntityTypeManager()->getStorage('user')->load($uid); } /** * {@inheritdoc} */ public function getLastUpdated() { return $this->lock ? $this->lock->updated : NULL; } /** * {@inheritdoc} */ public function setLockInformation($lock = NULL) { $this->lock = $lock; return $this; } /** * {@inheritdoc} */ public function savePermanent() { // Make sure to overwrite only the index's fields, not just all properties. // Unlike the Views UI, we have several separate pages for editing index // entities, and only one of them is locked. Therefore, this extra step is // necessary, we can't just call $this->entity->save(). /** @var \Drupal\search_api\Entity\SearchApiConfigEntityStorage $storage */ $storage = $this->getEntityTypeManager()->getStorage('search_api_index'); $storage->resetCache([$this->entity->id()]); /** @var \Drupal\search_api\IndexInterface $original */ $original = $storage->loadOverrideFree($this->entity->id()); $fields = $this->entity->getFields(); // Set the correct index object on the field objects. foreach ($fields as $field) { $field->setIndex($original); } $original->setFields($fields); $original->save(); // Setting the saved entity as the wrapped one is important if methods like // isReindexing() are called on the object afterwards. $this->entity = $original; $this->discardChanges(); } /** * {@inheritdoc} */ public function discardChanges() { $this->tempStore->delete($this->entity->id()); } /** * {@inheritdoc} */ public function getDescription() { return $this->entity->getDescription(); } /** * {@inheritdoc} */ public function isReadOnly() { return $this->entity->isReadOnly(); } /** * {@inheritdoc} */ public function getOption($name, $default = NULL) { return $this->entity->getOption($name, $default); } /** * {@inheritdoc} */ public function getOptions() { return $this->entity->getOptions(); } /** * {@inheritdoc} */ public function setOption($name, $option) { $this->entity->setOption($name, $option); return $this; } /** * {@inheritdoc} */ public function setOptions(array $options) { $this->entity->setOptions($options); return $this; } /** * {@inheritdoc} */ public function getDatasources() { return $this->entity->getDatasources(); } /** * {@inheritdoc} */ public function getDatasourceIds() { return $this->entity->getDatasourceIds(); } /** * {@inheritdoc} */ public function isValidDatasource($datasource_id) { return $this->entity->isValidDatasource($datasource_id); } /** * {@inheritdoc} */ public function getDatasource($datasource_id) { return $this->entity->getDatasource($datasource_id); } /** * {@inheritdoc} */ public function addDatasource(DatasourceInterface $datasource) { $this->entity->addDatasource($datasource); return $this; } /** * {@inheritdoc} */ public function removeDatasource($datasource_id) { $this->entity->removeDatasource($datasource_id); return $this; } /** * {@inheritdoc} */ public function setDatasources(array $datasources) { $this->entity->setDatasources($datasources); return $this; } /** * {@inheritdoc} */ public function getEntityTypes() { return $this->entity->getEntityTypes(); } /** * {@inheritdoc} */ public function hasValidTracker() { return $this->entity->hasValidTracker(); } /** * {@inheritdoc} */ public function getTrackerId() { return $this->entity->getTrackerId(); } /** * {@inheritdoc} */ public function getTrackerInstance() { return $this->entity->getTrackerInstance(); } /** * {@inheritdoc} */ public function setTracker(TrackerInterface $tracker) { $this->entity->setTracker($tracker); return $this; } /** * {@inheritdoc} */ public function hasValidServer() { return $this->entity->hasValidServer(); } /** * {@inheritdoc} */ public function isServerEnabled() { return $this->entity->isServerEnabled(); } /** * {@inheritdoc} */ public function getServerId() { return $this->entity->getServerId(); } /** * {@inheritdoc} */ public function getServerInstance() { return $this->entity->getServerInstance(); } /** * {@inheritdoc} */ public function setServer(ServerInterface $server = NULL) { $this->entity->setServer($server); return $this; } /** * {@inheritdoc} */ public function getProcessors() { return $this->entity->getProcessors(); } /** * {@inheritdoc} */ public function getProcessorsByStage($stage, array $overrides = []) { return $this->entity->getProcessorsByStage($stage, $overrides); } /** * {@inheritdoc} */ public function isValidProcessor($processor_id) { return $this->entity->isValidProcessor($processor_id); } /** * {@inheritdoc} */ public function getProcessor($processor_id) { return $this->entity->getProcessor($processor_id); } /** * {@inheritdoc} */ public function addProcessor(ProcessorInterface $processor) { $this->entity->addProcessor($processor); return $this; } /** * {@inheritdoc} */ public function removeProcessor($processor_id) { $this->entity->removeProcessor($processor_id); return $this; } /** * {@inheritdoc} */ public function setProcessors(array $processors) { $this->entity->setProcessors($processors); return $this; } /** * {@inheritdoc} */ public function alterIndexedItems(array &$items) { $this->entity->alterIndexedItems($items); } /** * {@inheritdoc} */ public function preprocessIndexItems(array $items) { $this->entity->preprocessIndexItems($items); } /** * {@inheritdoc} */ public function preprocessSearchQuery(QueryInterface $query) { $this->entity->preprocessSearchQuery($query); } /** * {@inheritdoc} */ public function postprocessSearchResults(ResultSetInterface $results) { $this->entity->postprocessSearchResults($results); } /** * {@inheritdoc} */ public function addField(FieldInterface $field) { $this->entity->addField($field); return $this; } /** * {@inheritdoc} */ public function renameField($old_field_id, $new_field_id) { $this->entity->renameField($old_field_id, $new_field_id); return $this; } /** * {@inheritdoc} */ public function removeField($field_id) { $this->entity->removeField($field_id); return $this; } /** * {@inheritdoc} */ public function setFields(array $fields) { $this->entity->setFields($fields); return $this; } /** * {@inheritdoc} */ public function getFields($include_server_defined = FALSE) { return $this->entity->getFields($include_server_defined); } /** * {@inheritdoc} */ public function getField($field_id) { return $this->entity->getField($field_id); } /** * {@inheritdoc} */ public function getFieldsByDatasource($datasource_id) { return $this->entity->getFieldsByDatasource($datasource_id); } /** * {@inheritdoc} */ public function getFulltextFields() { return $this->entity->getFulltextFields(); } /** * {@inheritdoc} */ public function getFieldRenames() { return $this->entity->getFieldRenames(); } /** * {@inheritdoc} */ public function discardFieldChanges() { $this->entity->discardFieldChanges(); return $this; } /** * {@inheritdoc} */ public function getPropertyDefinitions($datasource_id) { return $this->entity->getPropertyDefinitions($datasource_id); } /** * {@inheritdoc} */ public function loadItem($item_id) { return $this->entity->loadItem($item_id); } /** * {@inheritdoc} */ public function loadItemsMultiple(array $item_ids) { return $this->entity->loadItemsMultiple($item_ids); } /** * {@inheritdoc} */ public function indexItems($limit = -1, $datasource_id = NULL) { return $this->entity->indexItems($limit, $datasource_id); } /** * {@inheritdoc} */ public function indexSpecificItems(array $search_objects) { return $this->entity->indexSpecificItems($search_objects); } /** * {@inheritdoc} */ public function isBatchTracking() { return $this->entity->isBatchTracking(); } /** * {@inheritdoc} */ public function startBatchTracking() { $this->entity->startBatchTracking(); return $this; } /** * {@inheritdoc} */ public function stopBatchTracking() { $this->entity->stopBatchTracking(); return $this; } /** * {@inheritdoc} */ public function trackItemsInserted($datasource_id, array $ids) { $this->entity->trackItemsInserted($datasource_id, $ids); } /** * {@inheritdoc} */ public function trackItemsUpdated($datasource_id, array $ids) { $this->entity->trackItemsUpdated($datasource_id, $ids); } /** * {@inheritdoc} */ public function trackItemsDeleted($datasource_id, array $ids) { $this->entity->trackItemsDeleted($datasource_id, $ids); } /** * {@inheritdoc} */ public function reindex() { $this->entity->reindex(); } /** * {@inheritdoc} */ public function clear() { $this->entity->clear(); } /** * {@inheritdoc} */ public function rebuildTracker() { $this->entity->rebuildTracker(); } /** * {@inheritdoc} */ public function isReindexing() { return $this->entity->isReindexing(); } /** * {@inheritdoc} */ public function query(array $options = []) { return $this->entity->query($options); } /** * {@inheritdoc} */ public function enable() { $this->entity->enable(); return $this; } /** * {@inheritdoc} */ public function disable() { $this->entity->disable(); return $this; } /** * {@inheritdoc} */ public function setStatus($status) { $this->entity->setStatus($status); return $this; } /** * {@inheritdoc} */ public function setSyncing($status) { $this->entity->setSyncing($status); return $this; } /** * {@inheritdoc} */ public function status() { return $this->entity->status(); } /** * {@inheritdoc} */ public function isSyncing() { return $this->entity->isSyncing(); } /** * {@inheritdoc} */ public function isUninstalling() { return $this->entity->isUninstalling(); } /** * {@inheritdoc} */ public function get($property_name) { return $this->entity->get($property_name); } /** * {@inheritdoc} */ public function set($property_name, $value) { $this->entity->set($property_name, $value); return $this; } /** * {@inheritdoc} */ public function calculateDependencies() { $this->entity->calculateDependencies(); return $this; } /** * {@inheritdoc} */ public function onDependencyRemoval(array $dependencies) { return $this->entity->onDependencyRemoval($dependencies); } /** * {@inheritdoc} */ public function getDependencies() { return $this->entity->getDependencies(); } /** * {@inheritdoc} */ public function isInstallable() { return $this->entity->isInstallable(); } /** * {@inheritdoc} */ public function trustData() { $this->entity->trustData(); return $this; } /** * {@inheritdoc} */ public function hasTrustedData() { return $this->entity->hasTrustedData(); } /** * {@inheritdoc} */ public function uuid() { return $this->entity->uuid(); } /** * {@inheritdoc} */ public function id() { return $this->entity->id(); } /** * {@inheritdoc} */ public function language() { return $this->entity->language(); } /** * {@inheritdoc} */ public function isNew() { return $this->entity->isNew(); } /** * {@inheritdoc} */ public function enforceIsNew($value = TRUE) { $this->entity->enforceIsNew($value); return $this; } /** * {@inheritdoc} */ public function getEntityTypeId() { return $this->entity->getEntityTypeId(); } /** * {@inheritdoc} */ public function bundle() { return $this->entity->bundle(); } /** * {@inheritdoc} */ public function label() { return $this->entity->label(); } /** * {@inheritdoc} */ public function urlInfo($rel = 'canonical', array $options = []) { return $this->entity->toUrl($rel, $options); } /** * {@inheritdoc} */ public function toUrl($rel = 'canonical', array $options = []) { return $this->entity->toUrl($rel, $options); } /** * {@inheritdoc} */ public function url($rel = 'canonical', $options = []) { return $this->entity->toUrl($rel, $options)->toString(); } /** * {@inheritdoc} */ public function link($text = NULL, $rel = 'canonical', array $options = []) { return $this->entity->toLink($text, $rel, $options)->toString(); } /** * {@inheritdoc} */ public function toLink($text = NULL, $rel = 'canonical', array $options = []) { return $this->entity->toLink($text, $rel, $options); } /** * {@inheritdoc} */ public function hasLinkTemplate($key) { return $this->entity->hasLinkTemplate($key); } /** * {@inheritdoc} */ public function uriRelationships() { return $this->entity->uriRelationships(); } /** * {@inheritdoc} */ public static function load($id) { return Index::load($id); } /** * {@inheritdoc} */ public static function loadMultiple(array $ids = NULL) { return Index::loadMultiple($ids); } /** * {@inheritdoc} */ public static function create(array $values = []) { return Index::create($values); } /** * {@inheritdoc} */ public function save() { if ($this->tempStore->setIfOwner($this->entity->id(), $this->entity)) { return SAVED_UPDATED; } throw new EntityStorageException('Cannot save temporary index configuration: currently being edited by someone else.'); } /** * {@inheritdoc} */ public function delete() { $this->entity->delete(); } /** * {@inheritdoc} */ public function preSave(EntityStorageInterface $storage) { $this->entity->preSave($storage); } /** * {@inheritdoc} */ public function postSave(EntityStorageInterface $storage, $update = TRUE) { $this->entity->postSave($storage, $update); } /** * {@inheritdoc} */ public static function preCreate(EntityStorageInterface $storage, array &$values) { EntityInterface::preCreate($storage, $values); } /** * {@inheritdoc} */ public function postCreate(EntityStorageInterface $storage) { $this->entity->postCreate($storage); } /** * {@inheritdoc} */ public static function preDelete(EntityStorageInterface $storage, array $entities) { EntityInterface::preDelete($storage, $entities); } /** * {@inheritdoc} */ public static function postDelete(EntityStorageInterface $storage, array $entities) { EntityInterface::postDelete($storage, $entities); } /** * {@inheritdoc} */ public static function postLoad(EntityStorageInterface $storage, array &$entities) { EntityInterface::postLoad($storage, $entities); } /** * {@inheritdoc} */ public function createDuplicate() { return new UnsavedIndexConfiguration($this->entity->createDuplicate(), $this->tempStore, $this->currentUserId); } /** * {@inheritdoc} */ public function getEntityType() { return $this->entity->getEntityType(); } /** * {@inheritdoc} */ public function referencedEntities() { return $this->entity->referencedEntities(); } /** * {@inheritdoc} */ public function getOriginalId() { return $this->entity->getOriginalId(); } /** * {@inheritdoc} */ public function getCacheTagsToInvalidate() { return $this->entity->getCacheTagsToInvalidate(); } /** * {@inheritdoc} */ public function setOriginalId($id) { $this->entity->setOriginalId($id); return $this; } /** * {@inheritdoc} */ public function toArray() { return $this->entity->toArray(); } /** * {@inheritdoc} */ public function getTypedData() { return $this->entity->getTypedData(); } /** * {@inheritdoc} */ public function getConfigDependencyKey() { return $this->entity->getConfigDependencyKey(); } /** * {@inheritdoc} */ public function getConfigDependencyName() { return $this->entity->getConfigDependencyName(); } /** * {@inheritdoc} */ public function getConfigTarget() { return $this->entity->getConfigTarget(); } /** * {@inheritdoc} */ public function access($operation, AccountInterface $account = NULL, $return_as_object = FALSE) { return $this->entity->access($operation, $account, $return_as_object); } /** * {@inheritdoc} */ public function getCacheContexts() { return $this->entity->getCacheContexts(); } /** * {@inheritdoc} */ public function getCacheTags() { return $this->entity->getCacheTags(); } /** * {@inheritdoc} */ public function getCacheMaxAge() { return $this->entity->getCacheMaxAge(); } /** * {@inheritdoc} */ public function addCacheContexts(array $cache_contexts) { $this->entity->addCacheContexts($cache_contexts); return $this; } /** * {@inheritdoc} */ public function addCacheTags(array $cache_tags) { $this->entity->addCacheTags($cache_tags); return $this; } /** * {@inheritdoc} */ public function mergeCacheMaxAge($max_age) { $this->entity->mergeCacheMaxAge($max_age); return $this; } /** * {@inheritdoc} */ public function addCacheableDependency($other_object) { $this->entity->addCacheableDependency($other_object); return $this; } /** * {@inheritdoc} */ public function setThirdPartySetting($module, $key, $value) { $this->entity->setThirdPartySetting($module, $key, $value); return $this; } /** * {@inheritdoc} */ public function getThirdPartySetting($module, $key, $default = NULL) { return $this->entity->getThirdPartySetting($module, $key, $default); } /** * {@inheritdoc} */ public function getThirdPartySettings($module) { return $this->entity->getThirdPartySettings($module); } /** * {@inheritdoc} */ public function unsetThirdPartySetting($module, $key) { return $this->entity->unsetThirdPartySetting($module, $key); } /** * {@inheritdoc} */ public function getThirdPartyProviders() { return $this->entity->getThirdPartyProviders(); } }