Refactored constraints, to reuse existing mechanisms

This commit is contained in:
Jan Böhmer 2025-09-21 20:45:18 +02:00
parent 702e5c8732
commit 0d49632b92
26 changed files with 264 additions and 542 deletions

View file

@ -23,41 +23,18 @@ declare(strict_types=1);
namespace App\DataTables\Filters\Constraints\Part;
use App\DataTables\Filters\Constraints\AbstractConstraint;
use App\Entity\BulkInfoProviderImportJobPart;
use App\DataTables\Filters\Constraints\BooleanConstraint;
use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart;
use Doctrine\ORM\QueryBuilder;
class BulkImportJobExistsConstraint extends AbstractConstraint
class BulkImportJobExistsConstraint extends BooleanConstraint
{
/** @var bool|null The value of our constraint */
protected ?bool $value = null;
public function __construct()
{
parent::__construct('bulk_import_job_exists');
}
/**
* Gets the value of this constraint. Null means "don't filter", true means "filter for parts in bulk import jobs", false means "filter for parts not in bulk import jobs".
*/
public function getValue(): ?bool
{
return $this->value;
}
/**
* Sets the value of this constraint. Null means "don't filter", true means "filter for parts in bulk import jobs", false means "filter for parts not in bulk import jobs".
*/
public function setValue(?bool $value): void
{
$this->value = $value;
}
public function isEnabled(): bool
{
return $this->value !== null;
}
public function apply(QueryBuilder $queryBuilder): void
{
// Do not apply a filter if value is null (filter is set to ignore)
@ -79,4 +56,4 @@ class BulkImportJobExistsConstraint extends AbstractConstraint
$queryBuilder->andWhere('NOT EXISTS (' . $existsSubquery->getDQL() . ')');
}
}
}
}

View file

@ -24,59 +24,18 @@ declare(strict_types=1);
namespace App\DataTables\Filters\Constraints\Part;
use App\DataTables\Filters\Constraints\AbstractConstraint;
use App\Entity\BulkInfoProviderImportJobPart;
use App\DataTables\Filters\Constraints\ChoiceConstraint;
use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart;
use Doctrine\ORM\QueryBuilder;
class BulkImportJobStatusConstraint extends AbstractConstraint
class BulkImportJobStatusConstraint extends ChoiceConstraint
{
/** @var array The status values to filter by */
protected array $values = [];
/** @var string|null The operator to use ('any_of', 'none_of', 'all_of') */
protected ?string $operator = null;
public function __construct()
{
parent::__construct('bulk_import_job_status');
}
/**
* Gets the status values to filter by.
*/
public function getValues(): array
{
return $this->values;
}
/**
* Sets the status values to filter by.
*/
public function setValues(array $values): void
{
$this->values = $values;
}
/**
* Gets the operator to use.
*/
public function getOperator(): ?string
{
return $this->operator;
}
/**
* Sets the operator to use.
*/
public function setOperator(?string $operator): void
{
$this->operator = $operator;
}
public function isEnabled(): bool
{
return !empty($this->values) && $this->operator !== null;
}
public function apply(QueryBuilder $queryBuilder): void
{
// Do not apply a filter if values are empty or operator is null
@ -95,11 +54,11 @@ class BulkImportJobStatusConstraint extends AbstractConstraint
if ($this->operator === 'ANY') {
$existsSubquery->andWhere('job_status.status IN (:job_status_values)');
$queryBuilder->andWhere('EXISTS (' . $existsSubquery->getDQL() . ')');
$queryBuilder->setParameter('job_status_values', $this->values);
$queryBuilder->setParameter('job_status_values', $this->value);
} elseif ($this->operator === 'NONE') {
$existsSubquery->andWhere('job_status.status IN (:job_status_values)');
$queryBuilder->andWhere('NOT EXISTS (' . $existsSubquery->getDQL() . ')');
$queryBuilder->setParameter('job_status_values', $this->values);
$queryBuilder->setParameter('job_status_values', $this->value);
}
}
}
}

View file

@ -23,60 +23,17 @@ declare(strict_types=1);
namespace App\DataTables\Filters\Constraints\Part;
use App\DataTables\Filters\Constraints\AbstractConstraint;
use App\Entity\BulkInfoProviderImportJobPart;
use App\DataTables\Filters\Constraints\ChoiceConstraint;
use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart;
use Doctrine\ORM\QueryBuilder;
class BulkImportPartStatusConstraint extends AbstractConstraint
class BulkImportPartStatusConstraint extends ChoiceConstraint
{
/** @var array The status values to filter by */
protected array $values = [];
/** @var string|null The operator to use ('any_of', 'none_of', 'all_of') */
protected ?string $operator = null;
public function __construct()
{
parent::__construct('bulk_import_part_status');
}
/**
* Gets the status values to filter by.
*/
public function getValues(): array
{
return $this->values;
}
/**
* Sets the status values to filter by.
*/
public function setValues(array $values): void
{
$this->values = $values;
}
/**
* Gets the operator to use.
*/
public function getOperator(): ?string
{
return $this->operator;
}
/**
* Sets the operator to use.
*/
public function setOperator(?string $operator): void
{
$this->operator = $operator;
}
public function isEnabled(): bool
{
return !empty($this->values) && $this->operator !== null;
}
public function apply(QueryBuilder $queryBuilder): void
{
// Do not apply a filter if values are empty or operator is null
@ -94,11 +51,11 @@ class BulkImportPartStatusConstraint extends AbstractConstraint
if ($this->operator === 'ANY') {
$existsSubquery->andWhere('bip_part_status.status IN (:part_status_values)');
$queryBuilder->andWhere('EXISTS (' . $existsSubquery->getDQL() . ')');
$queryBuilder->setParameter('part_status_values', $this->values);
$queryBuilder->setParameter('part_status_values', $this->value);
} elseif ($this->operator === 'NONE') {
$existsSubquery->andWhere('bip_part_status.status IN (:part_status_values)');
$queryBuilder->andWhere('NOT EXISTS (' . $existsSubquery->getDQL() . ')');
$queryBuilder->setParameter('part_status_values', $this->values);
$queryBuilder->setParameter('part_status_values', $this->value);
}
}
}
}

View file

@ -28,12 +28,12 @@ use App\DataTables\Filters\Constraints\DateTimeConstraint;
use App\DataTables\Filters\Constraints\EntityConstraint;
use App\DataTables\Filters\Constraints\IntConstraint;
use App\DataTables\Filters\Constraints\NumberConstraint;
use App\DataTables\Filters\Constraints\Part\LessThanDesiredConstraint;
use App\DataTables\Filters\Constraints\Part\ParameterConstraint;
use App\DataTables\Filters\Constraints\Part\TagsConstraint;
use App\DataTables\Filters\Constraints\Part\BulkImportJobExistsConstraint;
use App\DataTables\Filters\Constraints\Part\BulkImportJobStatusConstraint;
use App\DataTables\Filters\Constraints\Part\BulkImportPartStatusConstraint;
use App\DataTables\Filters\Constraints\Part\LessThanDesiredConstraint;
use App\DataTables\Filters\Constraints\Part\ParameterConstraint;
use App\DataTables\Filters\Constraints\Part\TagsConstraint;
use App\DataTables\Filters\Constraints\TextConstraint;
use App\Entity\Attachments\AttachmentType;
use App\Entity\Parts\Category;
@ -45,8 +45,6 @@ use App\Entity\Parts\StorageLocation;
use App\Entity\Parts\Supplier;
use App\Entity\ProjectSystem\Project;
use App\Entity\UserSystem\User;
use App\Entity\BulkInfoProviderImportJob;
use App\Entity\BulkInfoProviderImportJobPart;
use App\Services\Trees\NodesListBuilder;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\QueryBuilder;

View file

@ -43,7 +43,6 @@ use App\Entity\Parts\ManufacturingStatus;
use App\Entity\Parts\Part;
use App\Entity\Parts\PartLot;
use App\Entity\ProjectSystem\Project;
use App\Entity\BulkInfoProviderImportJobPart;
use App\Services\EntityURLGenerator;
use App\Services\Formatters\AmountFormatter;
use App\Settings\BehaviorSettings\TableSettings;