From 820be162f5bfb31f69f0122a61755fdd8623275f Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Thu, 11 Nov 2021 14:10:11 +0000 Subject: [PATCH] Updated regen-search command to show some level of progress --- app/Console/Commands/RegenerateSearch.php | 13 +++++++++-- app/Entities/Tools/SearchIndex.php | 27 ++++++++++++++++++----- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/Console/Commands/RegenerateSearch.php b/app/Console/Commands/RegenerateSearch.php index 50e81a2b8..62ee88fc0 100644 --- a/app/Console/Commands/RegenerateSearch.php +++ b/app/Console/Commands/RegenerateSearch.php @@ -2,6 +2,7 @@ namespace BookStack\Console\Commands; +use BookStack\Entities\Models\Entity; use BookStack\Entities\Tools\SearchIndex; use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; @@ -22,6 +23,9 @@ class RegenerateSearch extends Command */ protected $description = 'Re-index all content for searching'; + /** + * @var SearchIndex + */ protected $searchIndex; /** @@ -45,8 +49,13 @@ class RegenerateSearch extends Command DB::setDefaultConnection($this->option('database')); } - $this->searchIndex->indexAllEntities(); + $this->searchIndex->indexAllEntities(function (Entity $model, int $processed, int $total) { + $this->info('Indexed ' . class_basename($model) . ' entries (' . $processed . '/' . $total . ')'); + }); + DB::setDefaultConnection($connection); - $this->comment('Search index regenerated'); + $this->line('Search index regenerated!'); + + return static::SUCCESS; } } diff --git a/app/Entities/Tools/SearchIndex.php b/app/Entities/Tools/SearchIndex.php index 16f261a37..50e471bc9 100644 --- a/app/Entities/Tools/SearchIndex.php +++ b/app/Entities/Tools/SearchIndex.php @@ -51,19 +51,36 @@ class SearchIndex /** * Delete and re-index the terms for all entities in the system. + * Can take a callback which is used for reporting progress. + * Callback receives three arguments: + * - An instance of the model being processed + * - The number that have been processed so far. + * - The total number of that model to be processed. + * + * @param callable(Entity, int, int)|null $progressCallback */ - public function indexAllEntities() + public function indexAllEntities(?callable $progressCallback = null) { SearchTerm::query()->truncate(); foreach ($this->entityProvider->all() as $entityModel) { $selectFields = ['id', 'name', $entityModel->textField]; + $total = $entityModel->newQuery()->withTrashed()->count(); + $chunkSize = 250; + $processed = 0; + + $chunkCallback = function (Collection $entities) use ($progressCallback, &$processed, $total, $chunkSize, $entityModel) { + $this->indexEntities($entities->all()); + $processed = min($processed + $chunkSize, $total); + + if (is_callable($progressCallback)) { + $progressCallback($entityModel, $processed, $total); + } + }; + $entityModel->newQuery() - ->withTrashed() ->select($selectFields) - ->chunk(1000, function (Collection $entities) { - $this->indexEntities($entities->all()); - }); + ->chunk($chunkSize, $chunkCallback); } }