Keine Beschreibung

BatchIterator.php 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace MailPoet\Tasks\Subscribers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Models\ScheduledTaskSubscriber;
  5. /**
  6. * @implements \Iterator<null, array>
  7. */
  8. class BatchIterator implements \Iterator, \Countable {
  9. private $taskId;
  10. private $batchSize;
  11. private $lastProcessedId = 0;
  12. private $batchLastId;
  13. public function __construct(
  14. $taskId,
  15. $batchSize
  16. ) {
  17. if ($taskId <= 0) {
  18. throw new \Exception('Task ID must be greater than zero');
  19. } elseif ($batchSize <= 0) {
  20. throw new \Exception('Batch size must be greater than zero');
  21. }
  22. $this->taskId = (int)$taskId;
  23. $this->batchSize = (int)$batchSize;
  24. }
  25. public function rewind() {
  26. $this->lastProcessedId = 0;
  27. }
  28. public function current() {
  29. $subscribers = $this->getSubscribers()
  30. ->orderByAsc('subscriber_id')
  31. ->limit($this->batchSize)
  32. ->findArray();
  33. $subscribers = array_column($subscribers, 'subscriber_id');
  34. $this->batchLastId = end($subscribers);
  35. return $subscribers;
  36. }
  37. public function key() {
  38. return null;
  39. }
  40. public function next() {
  41. $this->lastProcessedId = $this->batchLastId;
  42. }
  43. public function valid() {
  44. return $this->count() > 0;
  45. }
  46. public function count() {
  47. return $this->getSubscribers()->count();
  48. }
  49. private function getSubscribers() {
  50. return ScheduledTaskSubscriber::select('subscriber_id')
  51. ->where('task_id', $this->taskId)
  52. ->whereGt('subscriber_id', $this->lastProcessedId)
  53. ->where('processed', ScheduledTaskSubscriber::STATUS_UNPROCESSED);
  54. }
  55. }