1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-11 18:15:20 +02:00

[ticket/12683] Add CLI command to generate the search index

PHPBB3-12683
This commit is contained in:
rubencm 2021-03-24 12:27:07 +01:00 committed by Ruben Calvo
parent d5dab4def9
commit ce54ee5e6f
No known key found for this signature in database
5 changed files with 383 additions and 0 deletions

View File

@ -246,6 +246,38 @@ services:
tags:
- { name: console.command }
console.command.searchindex.list_all:
class: phpbb\console\command\searchindex\list_all
arguments:
- '@config'
- '@language'
- '@search.backend_collection'
- '@user'
tags:
- { name: console.command }
console.command.searchindex.create:
class: phpbb\console\command\searchindex\create
arguments:
- '@config'
- '@language'
- '@log'
- '@search.backend_factory'
- '@user'
tags:
- { name: console.command }
console.command.searchindex.delete:
class: phpbb\console\command\searchindex\delete
arguments:
- '@config'
- '@language'
- '@log'
- '@search.backend_factory'
- '@user'
tags:
- { name: console.command }
console.command.thumbnail.delete:
class: phpbb\console\command\thumbnail\delete
arguments:

View File

@ -83,6 +83,10 @@ $lang = array_merge($lang, array(
'CLI_DESCRIPTION_SET_ATOMIC_CONFIG' => 'Sets a configuration options value only if the old matches the current value',
'CLI_DESCRIPTION_SET_CONFIG' => 'Sets a configuration options value',
'CLI_DESCRIPTION_SEARCHINDEX_DELETE' => 'Delete search index.',
'CLI_DESCRIPTION_SEARCHINDEX_CREATE' => 'Create search index.',
'CLI_DESCRIPTION_SEARCHINDEX_LIST' => 'List all search backends.',
'CLI_DESCRIPTION_THUMBNAIL_DELETE' => 'Delete all existing thumbnails.',
'CLI_DESCRIPTION_THUMBNAIL_GENERATE' => 'Generate all missing thumbnails.',
'CLI_DESCRIPTION_THUMBNAIL_RECREATE' => 'Recreate all thumbnails.',
@ -142,6 +146,12 @@ $lang = array_merge($lang, array(
'CLI_REPARSER_REPARSE_REPARSING_START' => 'Reparsing %s...',
'CLI_REPARSER_REPARSE_SUCCESS' => 'Reparsing ended with success',
'CLI_SEARCHINDEX_SEARCH_BACKEND_NAME' => 'Backend class',
'CLI_SEARCHINDEX_CREATE_SUCCESS' => 'Search index created successfully',
'CLI_SEARCHINDEX_CREATE_FAILURE' => 'Error creating search index',
'CLI_SEARCHINDEX_DELETE_SUCCESS' => 'Search index deleted successfully',
'CLI_SEARCHINDEX_DELETE_FAILURE' => 'Error deleting search index',
// In all the case %1$s is the logical name of the file and %2$s the real name on the filesystem
// eg: big_image.png (2_a51529ae7932008cf8454a95af84cacd) generated.
'CLI_THUMBNAIL_DELETED' => '%1$s (%2$s) deleted.',

View File

@ -0,0 +1,120 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\console\command\searchindex;
use phpbb\config\config;
use phpbb\console\command\command;
use phpbb\language\language;
use phpbb\log\log;
use phpbb\search\search_backend_factory;
use phpbb\user;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
class create extends command
{
/** @var config */
protected $config;
/** @var language */
protected $language;
/** @var log */
protected $log;
/** @var search_backend_factory */
protected $search_backend_factory;
/**
* Construct method
*
* @param config $config
* @param language $language
* @param log $log
* @param search_backend_factory $search_backend_factory
* @param user $user
*/
public function __construct(config $config, language $language, log $log, search_backend_factory $search_backend_factory, user $user)
{
$this->config = $config;
$this->language = $language;
$this->log = $log;
$this->search_backend_factory = $search_backend_factory;
parent::__construct($user);
}
/**
* Sets the command name and description
*
* @return null
*/
protected function configure()
{
$this
->setName('searchindex:create')
->setDescription($this->language->lang('CLI_DESCRIPTION_SEARCHINDEX_CREATE'))
->addArgument(
'search-backend',
InputArgument::REQUIRED,
$this->user->lang('CLI_SEARCHINDEX_SEARCH_BACKEND_NAME')
)
;
}
/**
* Executes the command searchindex:create
*
* Create search index
*
* @param InputInterface $input The input stream used to get the options
* @param OutputInterface $output The output stream, used to print messages
*
* @return int 0 if all is well, 1 if any errors occurred
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$search_backend = $input->getArgument('search-backend');
$search = $this->search_backend_factory->get($search_backend);
$name = $search->get_name();
try
{
$counter = 0;
while (($status = $search->create_index($counter)) !== null)
{
$this->config->set('search_indexing_state', implode(',', $this->state), true);
$io->success($counter);
$io->success(print_r($status, 1));
}
$search->tidy();
}
catch (\Exception $e)
{
$io->error($this->user->lang('CLI_SEARCHINDEX_CREATE_FAILURE', $name));
return 1;
}
$this->log->add('admin', ANONYMOUS, '', 'LOG_SEARCH_INDEX_CREATED', false, array($name));
$io->success($this->user->lang('CLI_SEARCHINDEX_CREATE_SUCCESS', $name));
return 0;
}
}

View File

@ -0,0 +1,129 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\console\command\searchindex;
use phpbb\config\config;
use phpbb\console\command\command;
use phpbb\language\language;
use phpbb\log\log;
use phpbb\search\search_backend_factory;
use phpbb\user;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
class delete extends command
{
/** @var config */
protected $config;
/** @var language */
protected $language;
/** @var log */
protected $log;
/** @var search_backend_factory */
protected $search_backend_factory;
/**
* Construct method
*
* @param config $config
* @param language $language
* @param log $log
* @param search_backend_factory $search_backend_factory
* @param user $user
*/
public function __construct(config $config, language $language, log $log, search_backend_factory $search_backend_factory, user $user)
{
$this->config = $config;
$this->language = $language;
$this->log = $log;
$this->search_backend_factory = $search_backend_factory;
parent::__construct($user);
}
/**
* Sets the command name and description
*
* @return null
*/
protected function configure()
{
$this
->setName('searchindex:delete')
->setDescription($this->language->lang('CLI_DESCRIPTION_SEARCHINDEX_DELETE'))
->addArgument(
'search-backend',
InputArgument::REQUIRED,
$this->user->lang('CLI_SEARCHINDEX_SEARCH_BACKEND_NAME')
)
;
}
/**
* Executes the command searchindex:delete
*
* Delete search index
*
* @param InputInterface $input The input stream used to get the options
* @param OutputInterface $output The output stream, used to print messages
*
* @return int 0 if all is well, 1 if any errors occurred
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$search_backend = $input->getArgument('search-backend');
$search = $this->search_backend_factory->get($search_backend);
$name = $search->get_name();
try
{
$this->state = explode(',', $this->config['search_indexing_state']);
$this->max_post_id = $this->get_max_post_id();
$search->delete_index($this, '');
$search->tidy();
}
catch (\Exception $e)
{
$io->error($this->user->lang('CLI_SEARCHINDEX_DELETE_FAILURE', $name));
return 1;
}
$this->log->add('admin', ANONYMOUS, '', 'LOG_SEARCH_INDEX_REMOVED', false, array($name));
$io->success($this->user->lang('CLI_SEARCHINDEX_DELETE_SUCCESS', $name));
return 0;
}
function save_state($state = false)
{
global $config;
if ($state)
{
$this->state = $state;
}
ksort($this->state);
$config->set('search_indexing_state', implode(',', $this->state), true);
}
}

View File

@ -0,0 +1,92 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\console\command\searchindex;
use phpbb\config\config;
use phpbb\console\command\command;
use phpbb\di\service_collection;
use phpbb\language\language;
use phpbb\user;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
class list_all extends command
{
/** @var config */
protected $config;
/** @var language */
protected $language;
/** @var service_collection */
protected $search_backend_collection;
/**
* Construct method
*
* @param config $config
* @param language $language
* @param service_collection $search_backend_collection
* @param user $user
*/
public function __construct(config $config, language $language, service_collection $search_backend_collection, user $user)
{
$this->config = $config;
$this->language = $language;
$this->search_backend_collection = $search_backend_collection;
parent::__construct($user);
}
/**
* Sets the command name and description
*
* @return null
*/
protected function configure()
{
$this
->setName('searchindex:list')
->setDescription($this->language->lang('CLI_DESCRIPTION_SEARCHINDEX_LIST'))
;
}
/**
* Executes the command searchindex:list
*
* List all search backends.
*
* @param InputInterface $input The input stream used to get the options
* @param OutputInterface $output The output stream, used to print messages
*
* @return int 0 if all is well, 1 if any errors occurred
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$search_backends = [];
foreach ($this->search_backend_collection as $search_backend)
{
$name = get_class($search_backend);
$active = ($name == $this->config['search_type']) ? '(<comment>' . $this->language->lang('ACTIVE') . '</comment>) ' : '';
$search_backends[] = '<info>' . $name . '</info> ' . $active . $search_backend->get_name();
}
$io->listing($search_backends);
return 0;
}
}