Files
piratepoet/mailpoet/lib/Tasks/Subscribers/BatchIterator.php
Jan Lysý 5373c811b2 Add return annotation in BatchIterator
PHPStan reported an error in PHP8.1. When we use
the annotation ReturnTypeWillChange it caused another error
for PHPStan in combination in PHP7.2. The new annotations
are solving those issues.
[MAILPOET-4053]
2022-01-19 13:14:42 +01:00

72 lines
1.8 KiB
PHP

<?php
namespace MailPoet\Tasks\Subscribers;
use MailPoet\Models\ScheduledTaskSubscriber;
/**
* @implements \Iterator<null, array>
*/
class BatchIterator implements \Iterator, \Countable {
private $taskId;
private $batchSize;
private $lastProcessedId = 0;
private $batchLastId;
public function __construct(
$taskId,
$batchSize
) {
if ($taskId <= 0) {
throw new \Exception('Task ID must be greater than zero');
} elseif ($batchSize <= 0) {
throw new \Exception('Batch size must be greater than zero');
}
$this->taskId = (int)$taskId;
$this->batchSize = (int)$batchSize;
}
public function rewind(): void {
$this->lastProcessedId = 0;
}
/**
* @return mixed - it's required for PHP8.1 to prevent using ReturnTypeWillChange that cause an error in PHPStan with PHP7
*/
public function current() {
$subscribers = $this->getSubscribers()
->orderByAsc('subscriber_id')
->limit($this->batchSize)
->findArray();
$subscribers = array_column($subscribers, 'subscriber_id');
$this->batchLastId = end($subscribers);
return $subscribers;
}
/**
* @return string|float|int|bool|null - it's required for PHP8.1 to prevent using ReturnTypeWillChange that cause an error in PHPStan with PHP7
*/
public function key() {
return null;
}
public function next(): void {
$this->lastProcessedId = $this->batchLastId;
}
public function valid(): bool {
return $this->count() > 0;
}
public function count(): int {
return $this->getSubscribers()->count();
}
private function getSubscribers() {
return ScheduledTaskSubscriber::select('subscriber_id')
->where('task_id', $this->taskId)
->whereGt('subscriber_id', $this->lastProcessedId)
->where('processed', ScheduledTaskSubscriber::STATUS_UNPROCESSED);
}
}