1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-08 17:56:52 +02:00

[ticket/12683] Add progress bar to create_index

PHPBB3-12683
This commit is contained in:
rubencm
2021-03-24 18:50:29 +01:00
committed by Ruben Calvo
parent ce54ee5e6f
commit 0a24704b4f
15 changed files with 151 additions and 111 deletions

View File

@@ -17,6 +17,7 @@ use phpbb\config\config;
use phpbb\console\command\command;
use phpbb\language\language;
use phpbb\log\log;
use phpbb\search\exception\no_search_backend_found_exception;
use phpbb\search\search_backend_factory;
use phpbb\user;
use Symfony\Component\Console\Input\InputArgument;
@@ -70,7 +71,7 @@ class create extends command
->addArgument(
'search-backend',
InputArgument::REQUIRED,
$this->user->lang('CLI_SEARCHINDEX_SEARCH_BACKEND_NAME')
$this->language->lang('CLI_SEARCHINDEX_SEARCH_BACKEND_NAME')
)
;
}
@@ -90,31 +91,47 @@ class create extends command
$io = new SymfonyStyle($input, $output);
$search_backend = $input->getArgument('search-backend');
$search = $this->search_backend_factory->get($search_backend);
$name = $search->get_name();
try
{
$search = $this->search_backend_factory->get($search_backend);
$name = $search->get_name();
}
catch (no_search_backend_found_exception $e)
{
$io->error($this->language->lang('CLI_SEARCHINDEX_BACKEND_NOT_FOUND', $search_backend));
return command::FAILURE;
}
try
{
$counter = 0;
$progress = $this->create_progress_bar(1, $io, $output, true);
$progress->start();
while (($status = $search->create_index($counter)) !== null)
{
$this->config->set('search_indexing_state', implode(',', $this->state), true);
$progress->setMaxSteps($status['max_post_id']);
$progress->setProgress($status['post_counter']);
$progress->setMessage(round($status['rows_per_second'], 2) . ' rows/s');
$io->success($counter);
$io->success(print_r($status, 1));
$progress->advance();
}
$search->tidy();
$progress->finish();
$io->newLine(2);
}
catch (\Exception $e)
{
$io->error($this->user->lang('CLI_SEARCHINDEX_CREATE_FAILURE', $name));
return 1;
$io->error($this->language->lang('CLI_SEARCHINDEX_CREATE_FAILURE', $name));
return command::FAILURE;
}
$this->log->add('admin', ANONYMOUS, '', 'LOG_SEARCH_INDEX_CREATED', false, array($name));
$io->success($this->user->lang('CLI_SEARCHINDEX_CREATE_SUCCESS', $name));
$io->success($this->language->lang('CLI_SEARCHINDEX_CREATE_SUCCESS', $name));
return 0;
return command::SUCCESS;
}
}

View File

@@ -17,6 +17,7 @@ use phpbb\config\config;
use phpbb\console\command\command;
use phpbb\language\language;
use phpbb\log\log;
use phpbb\search\exception\no_search_backend_found_exception;
use phpbb\search\search_backend_factory;
use phpbb\user;
use Symfony\Component\Console\Input\InputArgument;
@@ -70,7 +71,7 @@ class delete extends command
->addArgument(
'search-backend',
InputArgument::REQUIRED,
$this->user->lang('CLI_SEARCHINDEX_SEARCH_BACKEND_NAME')
$this->language->lang('CLI_SEARCHINDEX_SEARCH_BACKEND_NAME')
)
;
}
@@ -90,40 +91,32 @@ class delete extends command
$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 = $this->search_backend_factory->get($search_backend);
$name = $search->get_name();
}
catch (no_search_backend_found_exception $e)
{
$io->error($this->language->lang('CLI_SEARCHINDEX_BACKEND_NOT_FOUND', $search_backend));
return command::FAILURE;
}
try
{
$search->delete_index($this, '');
$search->tidy();
}
catch (\Exception $e)
{
$io->error($this->user->lang('CLI_SEARCHINDEX_DELETE_FAILURE', $name));
return 1;
$io->error($this->language->lang('CLI_SEARCHINDEX_DELETE_FAILURE', $name));
return command::FAILURE;
}
$this->log->add('admin', ANONYMOUS, '', 'LOG_SEARCH_INDEX_REMOVED', false, array($name));
$io->success($this->user->lang('CLI_SEARCHINDEX_DELETE_SUCCESS', $name));
$io->success($this->language->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);
return command::SUCCESS;
}
}

View File

@@ -1,15 +1,15 @@
<?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.
*
*/
*
* 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\search\backend;
@@ -19,9 +19,9 @@ use phpbb\db\driver\driver_interface;
use phpbb\user;
/**
* optional base class for search plugins providing simple caching based on ACM
* and functions to retrieve ignore_words and synonyms
*/
* optional base class for search plugins providing simple caching based on ACM
* and functions to retrieve ignore_words and synonyms
*/
abstract class base implements search_backend_interface
{
public const SEARCH_RESULT_NOT_IN_CACHE = 0;
@@ -348,8 +348,17 @@ abstract class base implements search_backend_interface
$row_count++;
$post_counter = $row['post_id'];
}
// With cli process only one batch each time to be able to track progress
if (PHP_SAPI === 'cli')
{
break;
}
}
// TODO: With cli if the previous bucle have stoped because of lack of time, launch an exception, because is an error
// cli commands should be executed in one step
// pretend the number of posts was as big as the number of ids we indexed so far
// just an estimation as it includes deleted posts
$num_posts = $this->config['num_posts'];
@@ -399,6 +408,12 @@ abstract class base implements search_backend_interface
$this->index_remove($ids, $posters, $forum_ids);
$post_counter = $ids[count($ids) - 1];
}
// With cli process only one batch each time to be able to track progress
if (PHP_SAPI === 'cli')
{
break;
}
}
if ($post_counter < $max_post_id)

View File

@@ -0,0 +1,19 @@
<?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\search\exception;
class no_search_backend_found_exception extends search_exception
{
}

View File

@@ -0,0 +1,21 @@
<?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\search\exception;
use phpbb\exception\runtime_exception;
class search_exception extends runtime_exception
{
// TODO: Launch this exception from search instead of RuntimeException
}

View File

@@ -16,6 +16,8 @@ namespace phpbb\search;
use phpbb\config\config;
use phpbb\di\service_collection;
use phpbb\search\backend\search_backend_interface;
use phpbb\search\exception\no_search_backend_found_exception;
use RuntimeException;
class search_backend_factory
{
@@ -46,16 +48,36 @@ class search_backend_factory
*
* @param string $class
*
* @throws no_search_backend_found_exception
*
* @return search_backend_interface
*/
public function get(string $class): search_backend_interface
{
return $this->search_backends->get_by_class($class);
try
{
$search = $this->search_backends->get_by_class($class);
}
catch (RuntimeException $e)
{
if (strpos($e->getMessage(), 'No service found') === 0)
{
throw new no_search_backend_found_exception();
}
else
{
throw $e;
}
}
return $search;
}
/**
* Obtains active search backend
*
* @throws no_search_backend_found_exception
*
* @return search_backend_interface
*/
public function get_active(): search_backend_interface