vendor/shopware/core/Framework/DataAbstractionLayer/Dbal/Common/RepositoryIterator.php line 95

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\DataAbstractionLayer\Dbal\Common;
  3. use Shopware\Core\Framework\Context;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  9. use Shopware\Core\Framework\Feature;
  10. class RepositoryIterator
  11. {
  12.     /**
  13.      * @var Criteria
  14.      */
  15.     private $criteria;
  16.     /**
  17.      * @var EntityRepositoryInterface
  18.      */
  19.     private $repository;
  20.     /**
  21.      * @var Context
  22.      */
  23.     private $context;
  24.     private bool $autoIncrement false;
  25.     public function __construct(EntityRepositoryInterface $repositoryContext $context, ?Criteria $criteria null)
  26.     {
  27.         if ($criteria === null) {
  28.             $criteria = new Criteria();
  29.             $criteria->setOffset(0);
  30.         }
  31.         if ($criteria->getLimit() === null || $criteria->getLimit() < 1) {
  32.             $criteria->setLimit(50);
  33.         }
  34.         if ($repository->getDefinition()->hasAutoIncrement()) {
  35.             $criteria->addSorting(new FieldSorting('autoIncrement'FieldSorting::ASCENDING));
  36.             $criteria->setFilter('increment', new RangeFilter('autoIncrement', [RangeFilter::GTE => 0]));
  37.             $this->autoIncrement true;
  38.         }
  39.         $this->criteria $criteria;
  40.         $this->repository $repository;
  41.         $this->context = clone $context;
  42.     }
  43.     public function getTotal(): int
  44.     {
  45.         $criteria = clone $this->criteria;
  46.         $criteria->setOffset(0);
  47.         $criteria->setLimit(1);
  48.         $criteria->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_EXACT);
  49.         $result $this->repository->searchIds($criteria$this->context);
  50.         return $result->getTotal();
  51.     }
  52.     public function fetchIds(): ?array
  53.     {
  54.         $this->criteria->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_NONE);
  55.         $ids $this->repository->searchIds($this->criteria$this->context);
  56.         $values $ids->getIds();
  57.         if (empty($values)) {
  58.             return null;
  59.         }
  60.         if (!$this->autoIncrement) {
  61.             $this->criteria->setOffset($this->criteria->getOffset() + $this->criteria->getLimit());
  62.             return $values;
  63.         }
  64.         $last end($values);
  65.         if (!\is_string($last)) {
  66.             throw new \RuntimeException('Expected string as last element of ids array');
  67.         }
  68.         $increment $ids->getDataFieldOfId($lastFeature::isActive('v6.5.0.0') ? 'autoIncrement' 'auto_increment');
  69.         $this->criteria->setFilter('increment', new RangeFilter('autoIncrement', [RangeFilter::GT => $increment]));
  70.         return $values;
  71.     }
  72.     public function fetch(): ?EntitySearchResult
  73.     {
  74.         $this->criteria->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_NONE);
  75.         $result $this->repository->search(clone $this->criteria$this->context);
  76.         // increase offset for next iteration
  77.         $this->criteria->setOffset($this->criteria->getOffset() + $this->criteria->getLimit());
  78.         if (empty($result->getIds())) {
  79.             return null;
  80.         }
  81.         return $result;
  82.     }
  83. }