StatsTracker.php in Purge 8.3
File
src/Plugin/Purge/Queue/StatsTracker.php
View source
<?php
namespace Drupal\purge\Plugin\Purge\Queue;
use Drupal\Core\State\StateInterface;
use Drupal\purge\Plugin\Purge\Invalidation\InvStatesInterface;
class StatsTracker implements StatsTrackerInterface {
protected $instances = [];
protected $position = 0;
protected $state;
protected $stateBuffer = [];
protected $statClasses = [
self::NUMBER_OF_ITEMS => NumberOfItemsStatistic::class,
self::TOTAL_PROCESSING => TotalProcessingStatistic::class,
self::TOTAL_SUCCEEDED => TotalSucceededStatistic::class,
self::TOTAL_FAILED => TotalFailedStatistic::class,
self::TOTAL_NOT_SUPPORTED => TotalNotSupportedStatistic::class,
];
protected $stats = [
self::NUMBER_OF_ITEMS => 'purge_queue_number_of_items',
self::TOTAL_PROCESSING => 'purge_queue_total_processing',
self::TOTAL_SUCCEEDED => 'purge_queue_total_succeeded',
self::TOTAL_FAILED => 'purge_queue_total_failed',
self::TOTAL_NOT_SUPPORTED => 'purge_queue_total_not_supported',
];
public function __construct(StateInterface $state) {
$this->state = $state;
}
protected function initializeStatistics() {
if (!empty($this->instances)) {
return;
}
$values = $this->state
->getMultiple($this->stats);
foreach ($this->stats as $i => $statekey) {
if (!isset($values[$statekey]) || is_null($values[$statekey])) {
$values[$statekey] = 0;
}
$this->instances[$i] = new $this->statClasses[$i]($values[$statekey]);
$this->instances[$i]
->setWriteCallback(function ($value) use ($statekey) {
$this->stateBuffer[$statekey] = $value;
});
}
}
public function count() {
$this
->initializeStatistics();
return count($this->instances);
}
public function numberOfItems() {
$this
->initializeStatistics();
return $this->instances[self::NUMBER_OF_ITEMS];
}
public function totalFailed() {
$this
->initializeStatistics();
return $this->instances[self::TOTAL_FAILED];
}
public function totalProcessing() {
$this
->initializeStatistics();
return $this->instances[self::TOTAL_PROCESSING];
}
public function totalSucceeded() {
$this
->initializeStatistics();
return $this->instances[self::TOTAL_SUCCEEDED];
}
public function totalNotSupported() {
$this
->initializeStatistics();
return $this->instances[self::TOTAL_NOT_SUPPORTED];
}
public function destruct() {
if (count($this->stateBuffer)) {
$this->state
->setMultiple($this->stateBuffer);
$this->stateBuffer = [];
}
}
public function resetTotals() {
$this
->totalFailed()
->set(0);
$this
->totalProcessing()
->set(0);
$this
->totalSucceeded()
->set(0);
$this
->totalNotSupported()
->set(0);
}
public function updateTotals(array $invalidations) {
$changes = [
'totalProcessing' => 0,
'totalSucceeded' => 0,
'totalFailed' => 0,
'totalNotSupported' => 0,
];
foreach ($invalidations as $invalidation) {
if ($invalidation
->getState() === InvStatesInterface::PROCESSING) {
$changes['totalProcessing']++;
}
elseif ($invalidation
->getState() === InvStatesInterface::SUCCEEDED) {
$changes['totalSucceeded']++;
}
elseif ($invalidation
->getState() === InvStatesInterface::FAILED) {
$changes['totalFailed']++;
}
elseif ($invalidation
->getState() === InvStatesInterface::NOT_SUPPORTED) {
$changes['totalNotSupported']++;
}
}
foreach ($changes as $stat => $value) {
if ($value === 0) {
continue;
}
elseif ($value > 0) {
$this
->{$stat}()
->increment($value);
}
elseif ($value < 0) {
$this
->{$stat}()
->decrement(abs($value));
}
}
}
public function current() {
$this
->initializeStatistics();
if ($this
->valid()) {
return $this->instances[$this->position];
}
return FALSE;
}
public function key() {
$this
->initializeStatistics();
return $this->position;
}
public function next() {
$this
->initializeStatistics();
++$this->position;
}
public function rewind() {
$this->position = 0;
}
public function valid() {
$this
->initializeStatistics();
return isset($this->instances[$this->position]);
}
}