Skip to content

Commit

Permalink
Move Resaving completely into queue + 10k batching.
Browse files Browse the repository at this point in the history
  • Loading branch information
internetztube committed Jun 18, 2024
1 parent 5fcab74 commit d072254
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 40 deletions.
4 changes: 2 additions & 2 deletions src/ElementRelations.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
use craft\services\Plugins;
use craft\services\Utilities;
use internetztube\elementRelations\fields\ElementRelationsField;
use internetztube\elementRelations\jobs\ResaveAllElementRelationsJob;
use internetztube\elementRelations\jobs\GenerateResaveAllElementRelationsJobsJob;
use internetztube\elementRelations\jobs\ResaveSingleElementRelations;
use internetztube\elementRelations\models\Settings;
use internetztube\elementRelations\services\CacheService;
Expand Down Expand Up @@ -66,7 +66,7 @@ public function init()
if (!($event->plugin instanceof ElementRelations)) {
return;
}
Craft::$app->getQueue()->priority(1021)->push(new ResaveAllElementRelationsJob);
Craft::$app->getQueue()->priority(1021)->push(new GenerateResaveAllElementRelationsJobsJob());
};
Event::on(Plugins::class, Plugins::EVENT_AFTER_ENABLE_PLUGIN, $pluginEnableCallback);
Event::on(Plugins::class, Plugins::EVENT_AFTER_INSTALL_PLUGIN, $pluginEnableCallback);
Expand Down
32 changes: 6 additions & 26 deletions src/console/controllers/ResaveRelationsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,43 +11,23 @@
use craft\db\Table;
use craft\elements\db\ElementQuery;
use craft\elements\db\ElementQueryInterface;
use craft\helpers\Db;
use Illuminate\Support\Collection;
use internetztube\elementRelations\jobs\ResaveAllElementRelationsJob;
use internetztube\elementRelations\services\ResaveRelationsService;
use internetztube\elementRelations\jobs\GenerateResaveAllElementRelationsJobsJob;
use internetztube\elementRelations\jobs\ResaveMultipleElementRelationsJob;
use yii\console\ExitCode;

/**
* Resave Relations controller
*/
class ResaveRelationsController extends Controller
{
public bool $queue = false;

public function options($actionID): array
{
$options = parent::options($actionID);
$options[] = "queue";
return $options;
}

/**
* element-relations/resave-relations command
*/
public function actionIndex(): int
{
if ($this->queue) {
$job = new ResaveAllElementRelationsJob();
Craft::$app->getQueue()->priority(1022)->push($job);
$this->stdout("Pushed Job into Queue." . PHP_EOL);
} else {
$this->stdout("Find all elements ..." . PHP_EOL);

ResaveRelationsService::resave(function (int $index, int $totalCount, string $elementType) {
$message = sprintf("%3s%% - %5s / %5s - %20s", (int) ($index * 100 / $totalCount), $index, $totalCount, $elementType);
$this->stdout($message . PHP_EOL);
});
}

$job = new GenerateResaveAllElementRelationsJobsJob();
Craft::$app->getQueue()->priority(1022)->push($job);
$this->stdout("Pushed Job into Queue." . PHP_EOL);
return ExitCode::OK;
}
}
47 changes: 47 additions & 0 deletions src/jobs/GenerateResaveAllElementRelationsJobsJob.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace internetztube\elementRelations\jobs;

use Craft;
use craft\db\Query;
use craft\db\Table;
use craft\helpers\Db;
use craft\queue\BaseJob;

/**
* Resave Element Relations Job queue job
*/
class GenerateResaveAllElementRelationsJobsJob extends BaseJob
{
function execute($queue): void
{
$query = (new Query())
->select([
'elements_sites.elementId',
'elements_sites.siteId',
'elements.type'
])
->from(['elements_sites' => Table::ELEMENTS_SITES])
->innerJoin(['elements' => Table::ELEMENTS], "[[elements.id]] = [[elements_sites.elementId]]")
->where(['is', 'elements.dateDeleted', null]);

$batchSize = 10000;
$totalCount = $query->count();
$totalBatches = ceil($totalCount / $batchSize);
$index = 0;

foreach (Db::batch($query, $batchSize) as $batch) {
$index += 1;
$job = new ResaveAllElementRelationsJob([
'batch' => $batch,
'description' => "Resave All Element Relations ($index/$totalBatches)"
]);
Craft::$app->getQueue()->push($job);
$this->setProgress($queue, $index / $totalBatches, "$index/$totalBatches");
}
}
protected function defaultDescription(): ?string
{
return "Generate Resave All Element Relations Jobs";
}
}
22 changes: 12 additions & 10 deletions src/jobs/ResaveAllElementRelationsJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,24 @@
namespace internetztube\elementRelations\jobs;

use Craft;
use craft\helpers\Db;
use craft\queue\BaseJob;
use internetztube\elementRelations\services\ResaveRelationsService;
use internetztube\elementRelations\services\ExtractorService;

/**
* Resave Element Relations Job queue job
*/
class ResaveAllElementRelationsJob extends BaseJob
{
public array $batch;

function execute($queue): void
{
ResaveRelationsService::resave(function (int $index, int $totalCount, string $elementType) use ($queue) {
$totalCount = count($this->batch);
foreach ($this->batch as $index => $row) {
$element = \Craft::$app->getElements()->getElementById($row['elementId'], trim($row['type']), $row['siteId']);
$this->setProgress($queue, $index / $totalCount, "$index/$totalCount");
});
}
protected function defaultDescription(): ?string
{
return "Resave All Element Relations";
if (!$element) {
continue;
}
ExtractorService::refreshRelationsForElement($element);
}
}
}
4 changes: 2 additions & 2 deletions src/utilities/ElementRelationsUtility.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use Craft;
use craft\base\Utility;
use internetztube\elementRelations\jobs\ResaveAllElementRelationsJob;
use internetztube\elementRelations\jobs\GenerateResaveAllElementRelationsJobsJob;

/**
* Element Relations utility
Expand All @@ -30,7 +30,7 @@ static function contentHtml(): string
{
$pushed = false;
if (Craft::$app->request->getIsPost()) {
Craft::$app->getQueue()->push(new ResaveAllElementRelationsJob());
Craft::$app->getQueue()->push(new GenerateResaveAllElementRelationsJobsJob());
$pushed = true;
}
return Craft::$app->getView()->renderTemplate("element-relations/_utility", ["pushed" => $pushed]);
Expand Down

0 comments on commit d072254

Please sign in to comment.