From d4cce15d4d1b112e18092eafaf78e646cc671842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Klatt?= Date: Wed, 9 Dec 2020 10:54:31 +0000 Subject: [PATCH 1/3] TE-8147 Added SynchronizationDataQueryExpanderPluginInterface. --- .../Transfer/synchronization.transfer.xml | 5 +++ .../Export/QueryContainerExporter.php | 11 ++++- ...zationDataQueryContainerPluginIterator.php | 35 ++++++++++++---- .../SynchronizationBusinessFactory.php | 10 +++++ ...QueryExpanderOffsetLimitStrategyPlugin.php | 36 ++++++++++++++++ ...ueryExpanderWhereBetweenStrategyPlugin.php | 42 +++++++++++++++++++ .../SynchronizationDependencyProvider.php | 25 +++++++++++ 7 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin.php create mode 100644 src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderWhereBetweenStrategyPlugin.php diff --git a/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml b/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml index c15a275..9fad24b 100644 --- a/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml +++ b/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml @@ -42,4 +42,9 @@ + + + + + diff --git a/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php b/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php index 27d1956..4f52ea0 100644 --- a/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php +++ b/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php @@ -15,6 +15,7 @@ use Spryker\Zed\Synchronization\Business\Message\QueueMessageCreatorInterface; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface; use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryContainerPluginInterface; +use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface; class QueryContainerExporter implements ExporterInterface { @@ -37,6 +38,11 @@ class QueryContainerExporter implements ExporterInterface */ protected $synchronizationDataPlugins; + /** + * @var \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface + */ + protected $synchronizationDataQueryExpanderStrategyPlugin; + /** * @var int */ @@ -45,15 +51,18 @@ class QueryContainerExporter implements ExporterInterface /** * @param \Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface $queueClient * @param \Spryker\Zed\Synchronization\Business\Message\QueueMessageCreatorInterface $synchronizationQueueMessageCreator + * @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface $synchronizationDataQueryExpanderStrategyPlugin * @param int $chunkSize */ public function __construct( SynchronizationToQueueClientInterface $queueClient, QueueMessageCreatorInterface $synchronizationQueueMessageCreator, + SynchronizationDataQueryExpanderStrategyPluginInterface $synchronizationDataQueryExpanderStrategyPlugin, $chunkSize ) { $this->queueClient = $queueClient; $this->queueMessageCreator = $synchronizationQueueMessageCreator; + $this->synchronizationDataQueryExpanderStrategyPlugin = $synchronizationDataQueryExpanderStrategyPlugin; $this->chunkSize = $chunkSize ?? static::DEFAULT_CHUNK_SIZE; } @@ -97,7 +106,7 @@ protected function exportData(array $ids, SynchronizationDataQueryContainerPlugi */ protected function createSynchronizationDataQueryContainerPluginIterator(array $ids, SynchronizationDataQueryContainerPluginInterface $plugin): Iterator { - return new SynchronizationDataQueryContainerPluginIterator($plugin, $this->chunkSize, $ids); + return new SynchronizationDataQueryContainerPluginIterator($plugin, $this->synchronizationDataQueryExpanderStrategyPlugin, $this->chunkSize, $ids); } /** diff --git a/src/Spryker/Zed/Synchronization/Business/Iterator/SynchronizationDataQueryContainerPluginIterator.php b/src/Spryker/Zed/Synchronization/Business/Iterator/SynchronizationDataQueryContainerPluginIterator.php index 83ac5b8..d05c381 100644 --- a/src/Spryker/Zed/Synchronization/Business/Iterator/SynchronizationDataQueryContainerPluginIterator.php +++ b/src/Spryker/Zed/Synchronization/Business/Iterator/SynchronizationDataQueryContainerPluginIterator.php @@ -7,7 +7,9 @@ namespace Spryker\Zed\Synchronization\Business\Iterator; +use Generated\Shared\Transfer\SynchronizationDataQueryExpanderStrategyConfigurationTransfer; use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryContainerPluginInterface; +use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface; class SynchronizationDataQueryContainerPluginIterator extends AbstractSynchronizationDataPluginIterator { @@ -16,6 +18,11 @@ class SynchronizationDataQueryContainerPluginIterator extends AbstractSynchroniz */ protected $plugin; + /** + * @var \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface + */ + protected $synchronizationDataQueryExpanderStrategyPlugin; + /** * @var int[] */ @@ -23,13 +30,19 @@ class SynchronizationDataQueryContainerPluginIterator extends AbstractSynchroniz /** * @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryContainerPluginInterface $plugin + * @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface $synchronizationDataQueryExpanderStrategyPlugin * @param int $chunkSize * @param int[] $ids */ - public function __construct(SynchronizationDataQueryContainerPluginInterface $plugin, int $chunkSize, array $ids = []) - { + public function __construct( + SynchronizationDataQueryContainerPluginInterface $plugin, + SynchronizationDataQueryExpanderStrategyPluginInterface $synchronizationDataQueryExpanderStrategyPlugin, + int $chunkSize, + array $ids = [] + ) { parent::__construct($plugin, $chunkSize); + $this->synchronizationDataQueryExpanderStrategyPlugin = $synchronizationDataQueryExpanderStrategyPlugin; $this->filterIds = $ids; } @@ -38,10 +51,18 @@ public function __construct(SynchronizationDataQueryContainerPluginInterface $pl */ protected function updateCurrent(): void { - $this->current = $this->plugin->queryData($this->filterIds) - ->offset($this->offset) - ->limit($this->chunkSize) - ->find() - ->getData(); + $synchronizationDataQueryExpanderStrategyConfigurationTransfer = new SynchronizationDataQueryExpanderStrategyConfigurationTransfer(); + $synchronizationDataQueryExpanderStrategyConfigurationTransfer + ->setOffset($this->offset) + ->setChunkSize($this->chunkSize); + + $query = $this->plugin->queryData($this->filterIds); + + $query = $this->synchronizationDataQueryExpanderStrategyPlugin->expandQuery( + $query, + $synchronizationDataQueryExpanderStrategyConfigurationTransfer + ); + + $this->current = $query->find()->getData(); } } diff --git a/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php b/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php index 453db20..e321c9b 100644 --- a/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php +++ b/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php @@ -21,6 +21,7 @@ use Spryker\Zed\Synchronization\Business\Storage\SynchronizationStorage; use Spryker\Zed\Synchronization\Business\Validation\OutdatedValidator; use Spryker\Zed\Synchronization\SynchronizationDependencyProvider; +use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface; /** * @method \Spryker\Zed\Synchronization\SynchronizationConfig getConfig() @@ -71,10 +72,19 @@ public function createQueryContainerExporter() return new QueryContainerExporter( $this->getQueueClient(), $this->createQueueMessageCreator(), + $this->getSynchronizationDataQueryExpanderStrategyPlugin(), $this->getConfig()->getSyncExportChunkSize() ); } + /** + * @return \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface + */ + public function getSynchronizationDataQueryExpanderStrategyPlugin(): SynchronizationDataQueryExpanderStrategyPluginInterface + { + return $this->getProvidedDependency(SynchronizationDependencyProvider::PLUGIN_SYNCHRONIZATION_DATA_QUERY_EXPANDER_STRATEGY); + } + /** * @return \Spryker\Zed\Synchronization\Business\Export\ExporterPluginResolverInterface */ diff --git a/src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin.php b/src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin.php new file mode 100644 index 0000000..379685c --- /dev/null +++ b/src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin.php @@ -0,0 +1,36 @@ +offset($synchronizationDataQueryExpanderStrategyConfigurationTransfer->getOffsetOrFail()) + ->limit($synchronizationDataQueryExpanderStrategyConfigurationTransfer->getChunkSizeOrFail()); + + return $query; + } +} diff --git a/src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderWhereBetweenStrategyPlugin.php b/src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderWhereBetweenStrategyPlugin.php new file mode 100644 index 0000000..888e944 --- /dev/null +++ b/src/Spryker/Zed/Synchronization/Communication/Plugin/Synchronization/SynchronizationDataQueryExpanderWhereBetweenStrategyPlugin.php @@ -0,0 +1,42 @@ +getTableMap()->getPrimaryKeys(); + + $offset = $synchronizationDataQueryExpanderStrategyConfigurationTransfer->getOffsetOrFail(); + $chunkSize = $synchronizationDataQueryExpanderStrategyConfigurationTransfer->getChunkSizeOrFail(); + + $nextRange = $offset + $chunkSize; + + $query + ->where(sprintf('%s BETWEEN %s AND %s', key($primaryKeys), $offset, $nextRange)); + + return $query; + } +} diff --git a/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php b/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php index 08565c2..3aea3d9 100644 --- a/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php +++ b/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php @@ -9,6 +9,7 @@ use Spryker\Zed\Kernel\AbstractBundleDependencyProvider; use Spryker\Zed\Kernel\Container; +use Spryker\Zed\Synchronization\Communication\Plugin\Synchronization\SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientBridge; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToSearchClientBridge; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToStorageClientBridge; @@ -24,6 +25,7 @@ class SynchronizationDependencyProvider extends AbstractBundleDependencyProvider public const CLIENT_QUEUE = 'CLIENT_QUEUE'; public const SERVICE_UTIL_ENCODING = 'UTIL_ENCODING_SERVICE'; public const PLUGINS_SYNCHRONIZATION_DATA = 'PLUGINS_SYNCHRONIZATION_DATA'; + public const PLUGIN_SYNCHRONIZATION_DATA_QUERY_EXPANDER_STRATEGY = 'PLUGIN_SYNCHRONIZATION_DATA_QUERY_EXPANDER_STRATEGY'; /** * @param \Spryker\Zed\Kernel\Container $container @@ -37,6 +39,7 @@ public function provideBusinessLayerDependencies(Container $container) $container = $this->addQueueClient($container); $container = $this->addUtilEncodingService($container); $container = $this->addSynchronizationDataPlugins($container); + $container = $this->addSynchronizationDataQueryExpanderStrategyPlugin($container); return $container; } @@ -130,4 +133,26 @@ protected function getSynchronizationDataPlugins() { return []; } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return \Spryker\Zed\Kernel\Container + */ + protected function addSynchronizationDataQueryExpanderStrategyPlugin($container) + { + $container->set(static::PLUGIN_SYNCHRONIZATION_DATA_QUERY_EXPANDER_STRATEGY, function (Container $container) { + return $this->getSynchronizationDataQueryExpanderStrategyPlugin(); + }); + + return $container; + } + + /** + * @return \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface + */ + protected function getSynchronizationDataQueryExpanderStrategyPlugin() + { + return new SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin(); + } } From 2daf1814004fd904d355a1f13d37b2969e1e292b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Klatt?= Date: Fri, 11 Dec 2020 10:12:04 +0000 Subject: [PATCH 2/3] TE-8174 Updated test. --- .../Business/SynchronizationFacadeTest.php | 17 ++++++++--------- .../_support/SynchronizationBusinessTester.php | 1 + .../Zed/Synchronization/codeception.yml | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php b/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php index fd391f3..c1aa342 100644 --- a/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php +++ b/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php @@ -367,8 +367,11 @@ public function testExecuteResolvedPluginsBySources(): void $this->tester->setConfig(KernelConstants::PROJECT_NAMESPACES, ['Pyz']); - $container = new Container(); - $container[SynchronizationDependencyProvider::CLIENT_QUEUE] = function (Container $container) { + $this->tester->setDependency(SynchronizationDependencyProvider::PLUGINS_SYNCHRONIZATION_DATA, function () { + return $this->createSynchronizationDataPlugins(); + }); + + $this->tester->setDependency(SynchronizationDependencyProvider::CLIENT_QUEUE, function () { $queueMock = $this->createQueueClientBridge(); $synchronizationPlugins = $this->createSynchronizationDataPlugins(); @@ -381,15 +384,11 @@ public function testExecuteResolvedPluginsBySources(): void $queueMock->expects($this->never())->method('sendMessages'); return $queueMock; - }; + }); - $container[SynchronizationDependencyProvider::PLUGINS_SYNCHRONIZATION_DATA] = function (Container $container) { - return $this->createSynchronizationDataPlugins(); - }; - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = $this->createUtilEncodingServiceBridge(); + $this->tester->setDependency(SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, $this->createUtilEncodingServiceBridge()); - $this->prepareFacade($container); - $this->synchronizationFacade->executeResolvedPluginsBySources([]); + $this->tester->getFacade()->executeResolvedPluginsBySources([]); } /** diff --git a/tests/SprykerTest/Zed/Synchronization/_support/SynchronizationBusinessTester.php b/tests/SprykerTest/Zed/Synchronization/_support/SynchronizationBusinessTester.php index 8462b33..a97ad1d 100644 --- a/tests/SprykerTest/Zed/Synchronization/_support/SynchronizationBusinessTester.php +++ b/tests/SprykerTest/Zed/Synchronization/_support/SynchronizationBusinessTester.php @@ -22,6 +22,7 @@ * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = null) * * @SuppressWarnings(PHPMD) + * @method \Spryker\Zed\Synchronization\Business\SynchronizationFacadeInterface getFacade() */ class SynchronizationBusinessTester extends Actor { diff --git a/tests/SprykerTest/Zed/Synchronization/codeception.yml b/tests/SprykerTest/Zed/Synchronization/codeception.yml index 6f79bbc..3bac3bd 100644 --- a/tests/SprykerTest/Zed/Synchronization/codeception.yml +++ b/tests/SprykerTest/Zed/Synchronization/codeception.yml @@ -23,3 +23,4 @@ suites: - \SprykerTest\Shared\Testify\Helper\LocatorHelper - \SprykerTest\Shared\Testify\Helper\DependencyHelper - \SprykerTest\Shared\Propel\Helper\TransactionHelper + - \SprykerTest\Zed\Testify\Helper\BusinessHelper From 60898a754d0aecc9d6f59de727b6baeeba831206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Klatt?= Date: Thu, 17 Dec 2020 10:41:53 +0000 Subject: [PATCH 3/3] TE-8174 Fixed constraints in synchronization module. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8d53833..9520efd 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "spryker/search": "^6.8.0 || ^7.0.0 || ^8.3.0", "spryker/storage": "^3.4.1", "spryker/symfony": "^3.1.0", - "spryker/synchronization-extension": "^1.1.0", + "spryker/synchronization-extension": "^1.2.0", "spryker/util-encoding": "^2.0.0" }, "require-dev": {