diff --git a/composer.json b/composer.json
index 0de6c1b..6d81b8b 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,7 @@
"spryker/search": "^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": {
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();
+ }
}
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