150 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace WapplerSystems\Meilisearch\Task;
 | 
						|
 | 
						|
/***************************************************************
 | 
						|
 *  Copyright notice
 | 
						|
 *
 | 
						|
 *  (c) 2011-2015 Christoph Moeller <support@network-publishing.de>
 | 
						|
 *  (c) 2012-2015 Ingo Renner <ingo@typo3.org>
 | 
						|
 *
 | 
						|
 *  All rights reserved
 | 
						|
 *
 | 
						|
 *  This script is part of the TYPO3 project. The TYPO3 project is
 | 
						|
 *  free software; you can redistribute it and/or modify
 | 
						|
 *  it under the terms of the GNU General Public License as published by
 | 
						|
 *  the Free Software Foundation; either version 3 of the License, or
 | 
						|
 *  (at your option) any later version.
 | 
						|
 *
 | 
						|
 *  The GNU General Public License can be found at
 | 
						|
 *  http://www.gnu.org/copyleft/gpl.html.
 | 
						|
 *
 | 
						|
 *  This script is distributed in the hope that it will be useful,
 | 
						|
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 *  GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 *  This copyright notice MUST APPEAR in all copies of the script!
 | 
						|
 ***************************************************************/
 | 
						|
 | 
						|
use WapplerSystems\Meilisearch\ConnectionManager;
 | 
						|
use WapplerSystems\Meilisearch\IndexQueue\Queue;
 | 
						|
use TYPO3\CMS\Core\Utility\GeneralUtility;
 | 
						|
 | 
						|
/**
 | 
						|
 * Scheduler task to empty the indexes of a site and re-initialize the
 | 
						|
 * Meilisearch Index Queue thus making the indexer re-index the site.
 | 
						|
 *
 | 
						|
 * @author Christoph Moeller <support@network-publishing.de>
 | 
						|
 */
 | 
						|
class ReIndexTask extends AbstractMeilisearchTask
 | 
						|
{
 | 
						|
 | 
						|
    /**
 | 
						|
     * Indexing configurations to re-initialize.
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $indexingConfigurationsToReIndex = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Purges/commits all Meilisearch indexes, initializes the Index Queue
 | 
						|
     * and returns TRUE if the execution was successful
 | 
						|
     *
 | 
						|
     * @return bool Returns TRUE on success, FALSE on failure.
 | 
						|
     */
 | 
						|
    public function execute()
 | 
						|
    {
 | 
						|
        // clean up
 | 
						|
        $cleanUpResult = $this->cleanUpIndex();
 | 
						|
 | 
						|
        // initialize for re-indexing
 | 
						|
            /** @var Queue $indexQueue */
 | 
						|
        $indexQueue = GeneralUtility::makeInstance(Queue::class);
 | 
						|
        $indexQueueInitializationResults = $indexQueue->getInitializationService()
 | 
						|
            ->initializeBySiteAndIndexConfigurations($this->getSite(), $this->indexingConfigurationsToReIndex);
 | 
						|
 | 
						|
        return ($cleanUpResult && !in_array(false, $indexQueueInitializationResults));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes documents of the selected types from the index.
 | 
						|
     *
 | 
						|
     * @return bool TRUE if clean up was successful, FALSE on error
 | 
						|
     */
 | 
						|
    protected function cleanUpIndex()
 | 
						|
    {
 | 
						|
        $cleanUpResult = true;
 | 
						|
        $meilisearchConfiguration = $this->getSite()->getMeilisearchConfiguration();
 | 
						|
        $meilisearchServers = GeneralUtility::makeInstance(ConnectionManager::class)->getConnectionBySite($this->getSite());
 | 
						|
        $typesToCleanUp = [];
 | 
						|
        $enableCommitsSetting = $meilisearchConfiguration->getEnableCommits();
 | 
						|
 | 
						|
        foreach ($this->indexingConfigurationsToReIndex as $indexingConfigurationName) {
 | 
						|
            $type = $meilisearchConfiguration->getIndexQueueTableNameOrFallbackToConfigurationName($indexingConfigurationName);
 | 
						|
            $typesToCleanUp[] = $type;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($meilisearchServers as $meilisearchServer) {
 | 
						|
            $deleteQuery = 'type:(' . implode(' OR ', $typesToCleanUp) . ')' . ' AND siteHash:' . $this->getSite()->getSiteHash();
 | 
						|
            $meilisearchServer->getWriteService()->deleteByQuery($deleteQuery);
 | 
						|
 | 
						|
            if (!$enableCommitsSetting) {
 | 
						|
                # Do not commit
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
 | 
						|
            $response = $meilisearchServer->getWriteService()->commit(false, false, false);
 | 
						|
            if ($response->getHttpStatus() != 200) {
 | 
						|
                $cleanUpResult = false;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $cleanUpResult;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the indexing configurations to re-index.
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getIndexingConfigurationsToReIndex()
 | 
						|
    {
 | 
						|
        return $this->indexingConfigurationsToReIndex;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sets the indexing configurations to re-index.
 | 
						|
     *
 | 
						|
     * @param array $indexingConfigurationsToReIndex
 | 
						|
     */
 | 
						|
    public function setIndexingConfigurationsToReIndex(array $indexingConfigurationsToReIndex)
 | 
						|
    {
 | 
						|
        $this->indexingConfigurationsToReIndex = $indexingConfigurationsToReIndex;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is designed to return some additional information about the task,
 | 
						|
     * that may help to set it apart from other tasks from the same class
 | 
						|
     * This additional information is used - for example - in the Scheduler's BE module
 | 
						|
     * This method should be implemented in most task classes
 | 
						|
     *
 | 
						|
     * @return string Information to display
 | 
						|
     */
 | 
						|
    public function getAdditionalInformation()
 | 
						|
    {
 | 
						|
        $site = $this->getSite();
 | 
						|
        if (is_null($site)) {
 | 
						|
            return 'Invalid site configuration for scheduler please re-create the task!';
 | 
						|
        }
 | 
						|
 | 
						|
        $information = 'Site: ' . $this->getSite()->getLabel();
 | 
						|
        if (!empty($this->indexingConfigurationsToReIndex)) {
 | 
						|
            $information .= ', Indexing Configurations: ' . implode(', ',
 | 
						|
                    $this->indexingConfigurationsToReIndex);
 | 
						|
        }
 | 
						|
 | 
						|
        return $information;
 | 
						|
    }
 | 
						|
}
 |