DigiComp.Sequence/Classes/Command/SequenceCommandController.php

75 lines
2.2 KiB
PHP
Raw Normal View History

2014-04-07 15:25:16 +02:00
<?php
declare(strict_types=1);
2014-04-07 15:25:16 +02:00
namespace DigiComp\Sequence\Command;
use DigiComp\Sequence\Domain\Model\Insert;
2021-09-21 10:39:03 +02:00
use DigiComp\Sequence\Service\Exception as DigiCompSequenceServiceException;
2017-03-13 16:59:04 +01:00
use DigiComp\Sequence\Service\SequenceGenerator;
2021-09-21 10:39:03 +02:00
use Doctrine\DBAL\Driver\Exception as DoctrineDBALDriverException;
use Doctrine\DBAL\Exception as DoctrineDBALException;
use Doctrine\ORM\EntityManagerInterface;
2017-03-13 16:59:04 +01:00
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Cli\CommandController;
2014-04-07 15:25:16 +02:00
/**
* A database agnostic SequenceNumber generator
2014-04-07 15:25:16 +02:00
*
* @Flow\Scope("singleton")
*/
class SequenceCommandController extends CommandController
2016-06-24 19:40:43 +02:00
{
/**
* @Flow\Inject
2021-08-26 10:50:00 +02:00
* @var SequenceGenerator
2016-06-24 19:40:43 +02:00
*/
protected $sequenceGenerator;
2014-04-07 15:25:16 +02:00
/**
* @Flow\Inject
* @var EntityManagerInterface
*/
protected $entityManager;
2016-06-24 19:40:43 +02:00
/**
* Sets minimum number for sequence generator
*
2017-03-13 16:59:04 +01:00
* @param int $to
2016-06-24 19:40:43 +02:00
* @param string $type
2021-09-21 10:39:03 +02:00
* @throws DigiCompSequenceServiceException
2016-06-24 19:40:43 +02:00
*/
public function advanceCommand(int $to, string $type): void
2016-06-24 19:40:43 +02:00
{
$this->sequenceGenerator->advanceTo($to, $type);
}
/**
* @param string[] $typesToClean
2021-09-21 10:39:03 +02:00
* @throws DigiCompSequenceServiceException
* @throws DoctrineDBALDriverException
* @throws DoctrineDBALException
*/
public function cleanSequenceInsertsCommand(array $typesToClean = [])
{
$cleanArray = [];
2021-09-16 16:34:00 +02:00
if ($typesToClean === []) {
$results = $this->entityManager
->createQuery('SELECT i.type, MAX(i.number) max_number FROM ' . Insert::class . ' i GROUP BY i.type')
->getScalarResult();
foreach ($results as $result) {
2021-09-16 15:30:22 +02:00
$cleanArray[$result['type']] = (int)$result['max_number'];
}
} else {
foreach ($typesToClean as $typeToClean) {
$cleanArray[$typeToClean] = $this->sequenceGenerator->getLastNumberFor($typeToClean);
}
}
foreach ($cleanArray as $typeToClean => $number) {
$this->entityManager
->createQuery('DELETE FROM ' . Insert::class . ' i WHERE i.type = ?0 AND i.number < ?1')
->execute([$typeToClean, $number]);
}
}
2014-04-07 15:25:16 +02:00
}