From 909d53f5dbfca3d660ee86a24dd8fbad96c0cece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20Eugon=C3=A9?= Date: Wed, 18 May 2022 09:06:44 +0200 Subject: [PATCH 1/2] Add an item writer that will only write items that are satisfying a condition --- .../src/Job/Item/Writer/ConditionalWriter.php | 70 +++++++++++++++++++ .../Job/Item/Writer/ConditionalWriterTest.php | 50 +++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/batch/src/Job/Item/Writer/ConditionalWriter.php create mode 100644 src/batch/tests/Job/Item/Writer/ConditionalWriterTest.php diff --git a/src/batch/src/Job/Item/Writer/ConditionalWriter.php b/src/batch/src/Job/Item/Writer/ConditionalWriter.php new file mode 100644 index 00000000..1c563871 --- /dev/null +++ b/src/batch/src/Job/Item/Writer/ConditionalWriter.php @@ -0,0 +1,70 @@ +shouldWrite)($item, $this->jobExecution)) { + $keptItems[] = $item; + } + } + + if ($keptItems === []) { + return; + } + + if (!$this->initialized) { + $this->configureElementJobContext($this->writer, $this->jobExecution); + $this->initializeElement($this->writer); + $this->initialized = true; + } + + $this->writer->write($keptItems); + } + + public function initialize(): void + { + $this->initialized = false; + } + + public function flush(): void + { + if ($this->initialized) { + $this->flushElement($this->writer); + } + } +} diff --git a/src/batch/tests/Job/Item/Writer/ConditionalWriterTest.php b/src/batch/tests/Job/Item/Writer/ConditionalWriterTest.php new file mode 100644 index 00000000..4daf2027 --- /dev/null +++ b/src/batch/tests/Job/Item/Writer/ConditionalWriterTest.php @@ -0,0 +1,50 @@ + ($number % 2) === 0, + $debugWriter = new TestDebugWriter($memoryWriter = new InMemoryWriter()) + ); + + $writer->setJobExecution(JobExecution::createRoot('123', 'test.conditional_writer')); + $writer->initialize(); + $writer->write([1, 2, 3, 4, 5]); + $writer->write([6, 7, 8]); + $writer->flush(); + + $debugWriter->assertWasConfigured(); + $debugWriter->assertWasUsed(); + self::assertSame([[2, 4], [6, 8]], $memoryWriter->getBatchItems()); + } + + public function testWriteNothing(): void + { + $writer = new ConditionalWriter( + fn () => false, + $debugWriter = new TestDebugWriter($memoryWriter = new InMemoryWriter()) + ); + + $writer->setJobExecution(JobExecution::createRoot('123', 'test.conditional_writer')); + $writer->initialize(); + $writer->write([1, 2, 3, 4, 5]); + $writer->write([6, 7, 8]); + $writer->flush(); + + $debugWriter->assertWasNotConfigured(); + $debugWriter->assertWasNotUsed(); + self::assertSame([], $memoryWriter->getBatchItems()); + } +} From 431facd1ce456a96a37cfcac4bce6099c471736e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20Eugon=C3=A9?= Date: Wed, 18 May 2022 11:37:04 +0200 Subject: [PATCH 2/2] Add ConditionalWriter in main doc --- src/batch/docs/domain/item-job/item-writer.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/batch/docs/domain/item-job/item-writer.md b/src/batch/docs/domain/item-job/item-writer.md index 7b32c3af..5ba2fc92 100644 --- a/src/batch/docs/domain/item-job/item-writer.md +++ b/src/batch/docs/domain/item-job/item-writer.md @@ -11,6 +11,8 @@ It can be any class implementing [ItemWriterInterface](../../../src/Job/Item/Ite write items as a json string each on a line of a file. - [ChainWriter](../../../src/Job/Item/Writer/ChainWriter.php): write items on multiple item writers. +- [ConditionalWriter](../../../src/Job/Item/Writer/ConditionalWriter.php): + will only write items that are matching your conditions. - [NullWriter](../../../src/Job/Item/Writer/NullWriter.php): do not write items. - [RoutingWriter](../../../src/Job/Item/Writer/RoutingWriter.php):