From 148f8737adbbb40dd77642148d3d5e6cf79b6b08 Mon Sep 17 00:00:00 2001 From: Thomas Beaujean Date: Wed, 6 Mar 2024 22:54:40 +0100 Subject: [PATCH] split src and tests using psr4 --- README.md | 4 +- composer.json | 6 +- {Command => src/Command}/GenerateCommand.php | 4 +- .../Configuration}/Configurator.php | 2 +- .../DependencyInjection}/Configuration.php | 2 +- ...eryBuilderRepositoryGeneratorExtension.php | 2 +- {Generator => src/Generator}/Persister.php | 2 +- .../Generator}/RepositoryGenerator.php | 4 +- .../Generator}/TemplateService.php | 4 +- .../QueryBuilderRepositoryGeneratorBundle.php | 2 +- .../Resources}/config/services.yml | 18 +- .../Generator/AssociationTemplate.html.twig | 0 .../BottomRepositoryTemplate.html.twig | 0 .../views/Generator/ColumnTemplate.html.twig | 0 .../Generator/TopRepositoryTemplate.html.twig | 0 tests/{src => }/Entity/ForeignClass.php | 2 +- tests/{src => }/Entity/MyClass.php | 4 +- tests/Repository/MyClassRepository.php | 7 + tests/Repository/MyClassRepositoryBase.php | 423 ++++++++++++++++++ .../ExpectedMyClassRepositoryBase.txt | 10 +- .../RepositoryGeneratorTest.php | 8 +- tests/config.yml | 6 +- tests/src/Repository/MyClassRepository.php | 7 - 23 files changed, 471 insertions(+), 46 deletions(-) rename {Command => src/Command}/GenerateCommand.php (88%) rename {Configuration => src/Configuration}/Configurator.php (94%) rename {DependencyInjection => src/DependencyInjection}/Configuration.php (97%) rename {DependencyInjection => src/DependencyInjection}/QueryBuilderRepositoryGeneratorExtension.php (97%) rename {Generator => src/Generator}/Persister.php (91%) rename {Generator => src/Generator}/RepositoryGenerator.php (96%) rename {Generator => src/Generator}/TemplateService.php (94%) rename QueryBuilderRepositoryGeneratorBundle.php => src/QueryBuilderRepositoryGeneratorBundle.php (69%) rename {Resources => src/Resources}/config/services.yml (63%) rename {Resources => src/Resources}/views/Generator/AssociationTemplate.html.twig (100%) rename {Resources => src/Resources}/views/Generator/BottomRepositoryTemplate.html.twig (100%) rename {Resources => src/Resources}/views/Generator/ColumnTemplate.html.twig (100%) rename {Resources => src/Resources}/views/Generator/TopRepositoryTemplate.html.twig (100%) rename tests/{src => }/Entity/ForeignClass.php (79%) rename tests/{src => }/Entity/MyClass.php (80%) create mode 100644 tests/Repository/MyClassRepository.php create mode 100644 tests/Repository/MyClassRepositoryBase.php rename tests/{Services => Service}/ExpectedMyClassRepositoryBase.txt (96%) rename tests/{Services => Service}/RepositoryGeneratorTest.php (84%) delete mode 100644 tests/src/Repository/MyClassRepository.php diff --git a/README.md b/README.md index 5797fa5..35b936d 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,10 @@ See the create queries section for an example. ## Import the bundle using composer composer require --dev "tbn/query-builder-repository-generator-bundle" - + ## Import the bundle in your AppKernel if ('dev' === $this->getEnvironment()) { - $bundles[] = new tbn\QueryBuilderRepositoryGeneratorBundle\QueryBuilderRepositoryGeneratorBundle(); + $bundles[] = new Tbn\QueryBuilderRepositoryGeneratorBundle\QueryBuilderRepositoryGeneratorBundle(); } # Configuration diff --git a/composer.json b/composer.json index ed8d9de..4f57136 100644 --- a/composer.json +++ b/composer.json @@ -2,11 +2,13 @@ "name": "tbn/query-builder-repository-generator-bundle", "description": "Generate filters for queryBuilder in a repository", "autoload": { - "psr-4": { "tbn\\QueryBuilderRepositoryGeneratorBundle\\": "" } + "psr-4": { + "Tbn\\QueryBuilderRepositoryGeneratorBundle\\": "src/" + } }, "autoload-dev": { "psr-4": { - "tbn\\QueryBuilderRepositoryGeneratorBundle\\Tests\\": "tests/" + "Tbn\\QueryBuilderRepositoryGeneratorBundle\\Tests\\": "tests/" } }, "require-dev": { diff --git a/Command/GenerateCommand.php b/src/Command/GenerateCommand.php similarity index 88% rename from Command/GenerateCommand.php rename to src/Command/GenerateCommand.php index ee962a5..5850b8c 100644 --- a/Command/GenerateCommand.php +++ b/src/Command/GenerateCommand.php @@ -1,12 +1,12 @@ createQueryBuilder('myClass'); + } + + public static function getQueryBuilderResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getResult(); + } + + public static function getQueryBuilderSingleResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getSingleResult(); + } + + public static function getQueryBuilderOneOrNullResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getOneOrNullResult(); + } + + public static function getQueryBuilderArrayResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getArrayResult(); + } + + public static function getQueryBuilderSingleArrayResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getSingleResult(Query::HYDRATE_ARRAY); + } + + public static function getQueryBuilderScalarResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getScalarResult(); + } + + public static function getQueryBuilderSingleScalarResult(QueryBuilder $qb, $useQueryCache = false) + { + $query = $qb->getQuery(); + $query->useQueryCache($useQueryCache); + + return $query->getSingleScalarResult(); + } + + public static function getQueryBuilderCount(QueryBuilder $qb, $entityName = 'myClass'): int + { + $qb->select('count('.$entityName.') as total'); + $total = self::getQueryBuilderSingleArrayResult($qb); + + return $total['total']; + } + + public function exists($entity): bool + { + if (null === $entity) { + throw new \LogicException('The entity parameter must be provided, it can not be null'); + } + + $exists = false; + + $qb = $this->getNewQueryBuilder(); + $entityId = $entity->getId(); + static::filterById($qb, $entityId); + + $result = static::getQueryBuilderOneOrNullResult($qb); + + if (null !== $result) { + //the entity was found + $exists = true; + } + + return $exists; + } + + public function getDeleteQueryBuilder(): QueryBuilder + { + $qb = $this->_em->createQueryBuilder(); + $qb->delete($this->_entityName, 'myClass'); + + return $qb; + } + + public static function existsByQueryBuilder(QueryBuilder $qb, $columnName = 'id', $useQueryCache = false): bool + { + $exists = false; + $qb->select($qb->expr()->count('myClass.'.$columnName)); + + $count = static::getQueryBuilderSingleScalarResult($qb, $useQueryCache); + + if ($count > 0) { + $exists = true; + } + + return $exists; + } + + public function findOne($id): \Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass + { + // try to extract the value from an enum + if (is_object($id)) { + $ref = new \ReflectionClass($id); + if ($ref->isEnum()) { + $id = $id->value; + } + } + $qb = $this->getNewQueryBuilder(); + static::filterById($qb, $id); + + try { + $entity = static::getQueryBuilderSingleResult($qb); + } catch (EntityNotFoundException|NoResultException $ex) { + throw EntityNotFoundException::fromClassNameAndIdentifier(\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass::class, [$id]); + } + + return $entity; + } + + public static function filterById(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'id'): QueryBuilder + { + if ($value === null) { + if (Comparison::NEQ === $operator) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + $qb->andWhere($entityName.'.'.$columnName.$operator.':'.$parameterName); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterInId(QueryBuilder $qb, $value, $entityName = 'myClass', $columnName = 'id'): QueryBuilder + { + if ($value === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + $qb->andWhere($entityName.'.'.$columnName.' IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterNotInId(QueryBuilder $qb, $value, $entityName = 'myClass', $columnName = 'id'): QueryBuilder + { + if ($value === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + $qb->andWhere($entityName.'.'.$columnName.' NOT IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterByNumber(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'number'): QueryBuilder + { + if ($value === null) { + if (Comparison::NEQ === $operator) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + $qb->andWhere($entityName.'.'.$columnName.$operator.':'.$parameterName); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterInNumber(QueryBuilder $qb, $value, $entityName = 'myClass', $columnName = 'number'): QueryBuilder + { + if ($value === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + $qb->andWhere($entityName.'.'.$columnName.' IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterNotInNumber(QueryBuilder $qb, $value, $entityName = 'myClass', $columnName = 'number'): QueryBuilder + { + if ($value === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + $qb->andWhere($entityName.'.'.$columnName.' NOT IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterByName(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'name'): QueryBuilder + { + if ($value === null) { + if (Comparison::NEQ === $operator) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + $qb->andWhere($entityName.'.'.$columnName.$operator.':'.$parameterName); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterInName(QueryBuilder $qb, $value, $entityName = 'myClass', $columnName = 'name'): QueryBuilder + { + if ($value === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + $qb->andWhere($entityName.'.'.$columnName.' IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterNotInName(QueryBuilder $qb, $value, $entityName = 'myClass', $columnName = 'name'): QueryBuilder + { + if ($value === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + $qb->andWhere($entityName.'.'.$columnName.' NOT IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $value); + } + + return $qb; + } + + public static function filterByForeignClasses(QueryBuilder $qb, $value, $operator = Comparison::EQ, $entityName = 'myClass', $columnName = 'foreignClasses'): QueryBuilder + { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + unset($index); + + if ($value === null) { + if (Comparison::NEQ === $operator) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } + } else { + $qb->andWhere($entityName.'.'.$columnName.$operator.':'.$parameterName); + + // by default we use the value + $id = $value; + + // value might be an enum + if (is_object($value)) { + $ref = new \ReflectionClass($value); + if ($ref->isEnum()) { + $value = $value->value; + } + } + + if ($value instanceof \Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\ForeignClass) { + $id = $value->getId(); + } + $qb->setParameter($parameterName, $id); + } + + return $qb; + } + + public static function filterInForeignClasses(QueryBuilder $qb, $values, $entityName = 'myClass', $columnName = 'foreignClasses'): QueryBuilder + { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + unset($index); + + if ($values === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NULL'); + } else { + $ids = array(); + //the array might contains a null value + $orNull = ''; + + foreach ($values as $value) { + if ($value !== null) { + $ids[] = $value->getId(); + } else { + $orNull = ' OR '.$entityName.'.'.$columnName.' IS NULL'; + } + } + + $qb->andWhere($entityName.'.'.$columnName.' IN (:'.$parameterName.')'.$orNull); + $qb->setParameter($parameterName, $ids); + } + + return $qb; + } + + public static function filterNotInForeignClasses(QueryBuilder $qb, $values, $entityName = 'myClass', $columnName = 'foreignClasses'): QueryBuilder + { + //get a uniq index + $index = static::getParameterIndex(); + $parameterName = $columnName.$index; + + unset($index); + + if ($values === null) { + $qb->andWhere($entityName.'.'.$columnName.' IS NOT NULL'); + } else { + $ids = array(); + + foreach ($values as $value) { + $ids[] = $value->getId(); + } + $qb->andWhere($entityName.'.'.$columnName.' NOT IN (:'.$parameterName.')'); + $qb->setParameter($parameterName, $ids); + } + + return $qb; + } + + public static function joinForeignClasses(QueryBuilder $qb, $entityName = 'myClass', $columnName = 'foreignClasses', $entityDqlTargeted = 'foreignClass'): QueryBuilder + { + $qb->join($entityName.'.'.$columnName, $entityDqlTargeted); + + return $qb; + } +} diff --git a/tests/Services/ExpectedMyClassRepositoryBase.txt b/tests/Service/ExpectedMyClassRepositoryBase.txt similarity index 96% rename from tests/Services/ExpectedMyClassRepositoryBase.txt rename to tests/Service/ExpectedMyClassRepositoryBase.txt index e3ba244..e4abacb 100644 --- a/tests/Services/ExpectedMyClassRepositoryBase.txt +++ b/tests/Service/ExpectedMyClassRepositoryBase.txt @@ -4,7 +4,7 @@ * File generated by the QueryBuilderRepositoryGeneratorBundle * DO NOT MODIFY IT, CHANGES WOULD BE OVERWRITTEN */ -namespace tbn\QueryBuilderRepositoryGeneratorBundle\Tests\src\Repository; +namespace Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Repository; use Doctrine\ORM\EntityNotFoundException; use Doctrine\ORM\NoResultException; @@ -22,7 +22,7 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S { protected static $parameterIndex = 0; - public function __construct(ManagerRegistry $registry, string $entity = \tbn\QueryBuilderRepositoryGeneratorBundle\Tests\src\Entity\MyClass::class) + public function __construct(ManagerRegistry $registry, string $entity = \Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass::class) { parent::__construct($registry, $entity); } @@ -150,7 +150,7 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S return $exists; } - public function findOne($id): \tbn\QueryBuilderRepositoryGeneratorBundle\Tests\src\Entity\MyClass + public function findOne($id): \Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass { // try to extract the value from an enum if (is_object($id)) { @@ -165,7 +165,7 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S try { $entity = static::getQueryBuilderSingleResult($qb); } catch (EntityNotFoundException|NoResultException $ex) { - throw EntityNotFoundException::fromClassNameAndIdentifier(\tbn\QueryBuilderRepositoryGeneratorBundle\Tests\src\Entity\MyClass::class, [$id]); + throw EntityNotFoundException::fromClassNameAndIdentifier(\Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\MyClass::class, [$id]); } return $entity; @@ -352,7 +352,7 @@ class MyClassRepositoryBase extends \Doctrine\Bundle\DoctrineBundle\Repository\S } } - if ($value instanceof \tbn\QueryBuilderRepositoryGeneratorBundle\Tests\src\Entity\ForeignClass) { + if ($value instanceof \Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity\ForeignClass) { $id = $value->getId(); } $qb->setParameter($parameterName, $id); diff --git a/tests/Services/RepositoryGeneratorTest.php b/tests/Service/RepositoryGeneratorTest.php similarity index 84% rename from tests/Services/RepositoryGeneratorTest.php rename to tests/Service/RepositoryGeneratorTest.php index a67fc2c..74504fd 100644 --- a/tests/Services/RepositoryGeneratorTest.php +++ b/tests/Service/RepositoryGeneratorTest.php @@ -1,6 +1,6 @@ generateFiles(); $expectedContent = \file_get_contents(__DIR__.'/ExpectedMyClassRepositoryBase.txt'); - $content = \file_get_contents(__DIR__.'/../src/Repository/MyClassRepositoryBase.php'); + $content = \file_get_contents(__DIR__.'/../Repository/MyClassRepositoryBase.php'); $this->assertSame($expectedContent, $content); } } diff --git a/tests/config.yml b/tests/config.yml index e5c0870..a12927a 100644 --- a/tests/config.yml +++ b/tests/config.yml @@ -7,10 +7,10 @@ doctrine: mappings: App: is_bundle: false - dir: '%kernel.project_dir%/tests/src/Entity' - prefix: 'tbn\QueryBuilderRepositoryGeneratorBundle\Tests\src\Entity' + dir: '%kernel.project_dir%/tests/Entity' + prefix: 'Tbn\QueryBuilderRepositoryGeneratorBundle\Tests\Entity' alias: App type: attribute query_builder_repository_generator: bundles: - - "tbn\\QueryBuilderRepositoryGeneratorBundle" + - "Tbn\\QueryBuilderRepositoryGeneratorBundle" diff --git a/tests/src/Repository/MyClassRepository.php b/tests/src/Repository/MyClassRepository.php deleted file mode 100644 index bc7d504..0000000 --- a/tests/src/Repository/MyClassRepository.php +++ /dev/null @@ -1,7 +0,0 @@ -