diff --git a/config/packages/process/demo.doctrine.read.yaml b/config/packages/process/demo.doctrine.database.read.yaml similarity index 85% rename from config/packages/process/demo.doctrine.read.yaml rename to config/packages/process/demo.doctrine.database.read.yaml index f5c4f09..40085c7 100644 --- a/config/packages/process/demo.doctrine.read.yaml +++ b/config/packages/process/demo.doctrine.database.read.yaml @@ -1,10 +1,10 @@ clever_age_process: configurations: - demo.doctrine.read: + demo.doctrine.database.read: description: > A simple process to use DoctrineProcessBundle as database reader help: > - Ex: bin/console cleverage:process:execute demo.doctrine.read + Ex: bin/console cleverage:process:execute demo.doctrine.database.read options: ui: source: Bar @@ -13,8 +13,8 @@ clever_age_process: entry: service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseReaderTask' options: - table: 'process_user' + table: 'book' outputs: [debug] debug: - service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' \ No newline at end of file diff --git a/config/packages/process/demo.doctrine.database.update.yaml b/config/packages/process/demo.doctrine.database.update.yaml new file mode 100644 index 0000000..c751e2a --- /dev/null +++ b/config/packages/process/demo.doctrine.database.update.yaml @@ -0,0 +1,31 @@ +clever_age_process: + configurations: + demo.doctrine.database.update: + description: > + A simple process to use DoctrineProcessBundle as database updater + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.database.update -c firstname:Paul -c lastname:Durant + options: + ui: + source: Bar + target: Foo + entrypoint_type: text + default: + context: + - key: firstname + value: Steven + - key: lastname + value: King + tasks: + entry: + service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask' + options: + sql: 'update author set firstname = :firstname, lastname = :lastname' + input_as_params: false + params: + firstname: '{{ firstname }}' + lastname: '{{ lastname }}' + outputs: [debug] + + debug: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' \ No newline at end of file diff --git a/config/packages/process/demo.doctrine.entitymanager.batch_writer.yaml b/config/packages/process/demo.doctrine.entitymanager.batch_writer.yaml new file mode 100644 index 0000000..2855ca8 --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.batch_writer.yaml @@ -0,0 +1,54 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.batch_writer: + description: > + A simple process to use DoctrineProcessBundle as entity batch_writer + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.batch_writer + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\ProcessBundle\Task\ConstantIterableOutputTask' + options: + output: + - author1: + firstname: Firstname 1 + lastname: Lastname + - author2: + firstname: Firstname 2 + lastname: Lastname + - author3: + firstname: Firstname 3 + lastname: Lastname + outputs: [iterate] + iterate: + service: '@CleverAge\ProcessBundle\Task\InputIteratorTask' + outputs: [denormalizer] + denormalizer: + service: '@CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask' + options: + class: App\Entity\Author + outputs: [batch_write] + batch_write: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask' + outputs: [aggregate_write] + options: + batch_count: 2 + aggregate_write: + service: '@CleverAge\ProcessBundle\Task\AggregateIterableTask' + outputs: [fetch] + fetch: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'Lastname' + outputs: [agregate_fetch] + agregate_fetch: + service: '@CleverAge\ProcessBundle\Task\AggregateIterableTask' + outputs: [dump] + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' \ No newline at end of file diff --git a/config/packages/process/demo.doctrine.entitymanager.reader_cleaner.yaml b/config/packages/process/demo.doctrine.entitymanager.reader_cleaner.yaml new file mode 100644 index 0000000..fe135bd --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.reader_cleaner.yaml @@ -0,0 +1,28 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.reader_cleaner: + description: > + A simple process to use DoctrineProcessBundle as entity reader (then clean the entitymanager) + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.reader_cleaner + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [dump] + + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [clean] + + clean: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask' diff --git a/config/packages/process/demo.doctrine.entitymanager.reader_clearer.yaml b/config/packages/process/demo.doctrine.entitymanager.reader_clearer.yaml new file mode 100644 index 0000000..1d4e4df --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.reader_clearer.yaml @@ -0,0 +1,28 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.reader_clearer: + description: > + A simple process to use DoctrineProcessBundle as entity reader (then clear the entitymanager) + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.reader_clear + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [dump] + + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [clear] + + clear: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask' diff --git a/config/packages/process/demo.doctrine.entitymanager.reader_detacher.yaml b/config/packages/process/demo.doctrine.entitymanager.reader_detacher.yaml new file mode 100644 index 0000000..b82ea12 --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.reader_detacher.yaml @@ -0,0 +1,28 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.reader_detacher: + description: > + A simple process to use DoctrineProcessBundle as entity reader then detach the entity + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.reader_detacher + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [dump] + + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [detach] + + detach: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask' diff --git a/config/packages/process/demo.doctrine.entitymanager.reader_refresher.yaml b/config/packages/process/demo.doctrine.entitymanager.reader_refresher.yaml new file mode 100644 index 0000000..59f2f29 --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.reader_refresher.yaml @@ -0,0 +1,43 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.reader_refresher: + description: > + A simple process to use DoctrineProcessBundle as entity reader, modify the entity then refresh it + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.reader_refresher + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [dump] + + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [modify] + + modify: + service: '@CleverAge\ProcessBundle\Task\PropertySetterTask' + options: + values: + firstname: Gérard + outputs: [dump_modified] + + dump_modified: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [refresh] + + refresh: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask' + outputs: [dump_refreshed] + + dump_refreshed: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' diff --git a/config/packages/process/demo.doctrine.entitymanager.reader_remover.yaml b/config/packages/process/demo.doctrine.entitymanager.reader_remover.yaml new file mode 100644 index 0000000..f8d1205 --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.reader_remover.yaml @@ -0,0 +1,38 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.reader_remover: + description: > + A simple process to use DoctrineProcessBundle as entity reader (remove the entity and tries to fetch the same entity) + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.reader_remover + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Book' + criteria: + title: 'Dracula' + outputs: [dump] + + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [remover] + + remover: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask' + outputs: [refetch] + + refetch: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Book' + criteria: + title: 'Dracula' + outputs: [dumpnullid] + + dumpnullid: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' diff --git a/config/packages/process/demo.doctrine.entitymanager.writer.yaml b/config/packages/process/demo.doctrine.entitymanager.writer.yaml new file mode 100644 index 0000000..ab9b121 --- /dev/null +++ b/config/packages/process/demo.doctrine.entitymanager.writer.yaml @@ -0,0 +1,36 @@ +clever_age_process: + configurations: + demo.doctrine.entitymanager.writer: + description: > + A simple process to use DoctrineProcessBundle as entity writer + help: > + Ex: bin/console cleverage:process:execute demo.doctrine.entitymanager.writer + options: + ui: + source: Bar + target: Foo + tasks: + entry: + service: '@CleverAge\ProcessBundle\Task\ConstantOutputTask' + options: + output: + firstname: Isaac + lastname: Asimov + outputs: [denormalize] + denormalize: + service: '@CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask' + options: + class: App\Entity\Author + outputs: [save] + save: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask' + outputs: [fetch] + fetch: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'Asimov' + outputs: [dump] + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' \ No newline at end of file diff --git a/migrations/Version20241210154810.php b/migrations/Version20241210154810.php new file mode 100644 index 0000000..a05a0a4 --- /dev/null +++ b/migrations/Version20241210154810.php @@ -0,0 +1,35 @@ +addSql('CREATE TABLE author (id INT AUTO_INCREMENT NOT NULL, firstname VARCHAR(255) NOT NULL, lastname VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('CREATE TABLE book (id INT AUTO_INCREMENT NOT NULL, author_id INT NOT NULL, title VARCHAR(255) NOT NULL, INDEX IDX_CBE5A331F675F31B (author_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE book ADD CONSTRAINT FK_CBE5A331F675F31B FOREIGN KEY (author_id) REFERENCES author (id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE book DROP FOREIGN KEY FK_CBE5A331F675F31B'); + $this->addSql('DROP TABLE author'); + $this->addSql('DROP TABLE book'); + } +} diff --git a/src/DataFixtures/DemoFixtures.php b/src/DataFixtures/DemoFixtures.php new file mode 100644 index 0000000..18c2636 --- /dev/null +++ b/src/DataFixtures/DemoFixtures.php @@ -0,0 +1,60 @@ +setFirstName('Stephen'); + $author1->setLastname('King'); + $manager->persist($author1); + + $book1 = new Book(); + $book1->setAuthor($author1); + $book1->setTitle('It'); + $manager->persist($book1); + + $book2 = new Book(); + $book2->setAuthor($author1); + $book2->setTitle('Salem'); + $manager->persist($book2); + + $author2 = new Author(); + $author2->setFirstName('Ray'); + $author2->setLastname('Bradbury'); + $manager->persist($author2); + + $book3 = new Book(); + $book3->setAuthor($author2); + $book3->setTitle('Fahrenheit 451'); + $manager->persist($book3); + + $author3 = new Author(); + $author3->setFirstName('Bram'); + $author3->setLastname('Stoker'); + $manager->persist($author3); + + $book4 = new Book(); + $book4->setAuthor($author3); + $book4->setTitle('Dracula'); + $manager->persist($book4); + + $manager->flush(); + } +} diff --git a/src/Entity/Author.php b/src/Entity/Author.php new file mode 100644 index 0000000..a4af45f --- /dev/null +++ b/src/Entity/Author.php @@ -0,0 +1,80 @@ + + */ + #[ORM\OneToMany(targetEntity: Book::class, mappedBy: 'author', orphanRemoval: true)] + private Collection $books; + + public function __construct() + { + $this->books = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getFirstname(): ?string + { + return $this->firstname; + } + + public function setFirstname(string $firstname): static + { + $this->firstname = $firstname; + + return $this; + } + + public function getLastname(): ?string + { + return $this->lastname; + } + + public function setLastname(string $lastname): static + { + $this->lastname = $lastname; + + return $this; + } + + /** + * @return Collection + */ + public function getBooks(): Collection + { + return $this->books; + } +} diff --git a/src/Entity/Book.php b/src/Entity/Book.php new file mode 100644 index 0000000..e559638 --- /dev/null +++ b/src/Entity/Book.php @@ -0,0 +1,60 @@ +id; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function setTitle(string $title): static + { + $this->title = $title; + + return $this; + } + + public function getAuthor(): ?Author + { + return $this->author; + } + + public function setAuthor(Author $author): static + { + $this->author = $author; + + return $this; + } +} diff --git a/src/Repository/AuthorRepository.php b/src/Repository/AuthorRepository.php new file mode 100644 index 0000000..110d668 --- /dev/null +++ b/src/Repository/AuthorRepository.php @@ -0,0 +1,52 @@ + + */ +class AuthorRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Author::class); + } + + // /** + // * @return Author[] Returns an array of Author objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('a') + // ->andWhere('a.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('a.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Author + // { + // return $this->createQueryBuilder('a') + // ->andWhere('a.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/BookRepository.php b/src/Repository/BookRepository.php new file mode 100644 index 0000000..c6c4114 --- /dev/null +++ b/src/Repository/BookRepository.php @@ -0,0 +1,52 @@ + + */ +class BookRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Book::class); + } + + // /** + // * @return Book[] Returns an array of Book objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('b') + // ->andWhere('b.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('b.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Book + // { + // return $this->createQueryBuilder('b') + // ->andWhere('b.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +}