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

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