diff --git a/vendor/magento/module-catalog-staging/Model/Mview/View/Attribute/Subscription.php b/vendor/magento/module-catalog-staging/Model/Mview/View/Attribute/Subscription.php index 0be98aa9fbd..bde0d4fff7e 100644 --- a/vendor/magento/module-catalog-staging/Model/Mview/View/Attribute/Subscription.php +++ b/vendor/magento/module-catalog-staging/Model/Mview/View/Attribute/Subscription.php @@ -5,17 +5,15 @@ */ namespace Magento\CatalogStaging\Model\Mview\View\Attribute; -use Magento\Catalog\Api\Data\CategoryInterface; use Magento\Framework\DB\Ddl\Trigger; use Magento\Framework\App\ResourceConnection; use Magento\Framework\DB\Ddl\TriggerFactory; use Magento\Framework\EntityManager\EntityMetadata; use Magento\Framework\EntityManager\MetadataPool; -use Magento\Framework\Mview\View\ChangelogInterface; use Magento\Framework\Mview\View\CollectionInterface; +use Magento\Framework\Mview\View\SubscriptionStatementPostprocessorInterface; use Magento\Framework\Mview\ViewInterface; use Magento\Framework\Mview\Config; -use Magento\Framework\Mview\View\Changelog; /** * Class Subscription implements statement building for staged entity attribute subscription @@ -54,7 +52,9 @@ class Subscription extends \Magento\Framework\Mview\View\Subscription * @param array $ignoredUpdateColumns * @param array $ignoredUpdateColumnsBySubscription * @param Config|null $mviewConfig + * @param SubscriptionStatementPostprocessorInterface|null $statementPostprocessor * @throws \Exception + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( ResourceConnection $resource, @@ -67,7 +67,8 @@ class Subscription extends \Magento\Framework\Mview\View\Subscription $entityInterface = null, $ignoredUpdateColumns = [], $ignoredUpdateColumnsBySubscription = [], - Config $mviewConfig = null + ?Config $mviewConfig = null, + ?SubscriptionStatementPostprocessorInterface $statementPostprocessor = null ) { parent::__construct( $resource, @@ -78,7 +79,8 @@ class Subscription extends \Magento\Framework\Mview\View\Subscription $columnName, $ignoredUpdateColumns, $ignoredUpdateColumnsBySubscription, - $mviewConfig + $mviewConfig, + $statementPostprocessor ); $this->ignoredUpdateColumns = $ignoredUpdateColumns; $this->entityMetadata = $metadataPool->getMetadata($entityInterface); @@ -119,6 +121,12 @@ class Subscription extends \Magento\Framework\Mview\View\Subscription if ($event == Trigger::EVENT_UPDATE) { $trigger = $this->addConditionsToTrigger($trigger); } + + $trigger = sprintf( + "IF (@entity_id IS NOT NULL) THEN %s END IF;", + $trigger + ); + $triggerBody .= $trigger; return $triggerBody; @@ -166,7 +174,7 @@ class Subscription extends \Magento\Framework\Mview\View\Subscription private function buildEntityIdStatementByEventType(string $eventType): string { return vsprintf( - 'SET @entity_id = (SELECT %1$s FROM %2$s WHERE %3$s = %4$s.%3$s);', + 'SET @entity_id = (SELECT %1$s FROM %2$s WHERE %3$s = %4$s.%3$s AND created_in <= UNIX_TIMESTAMP());', [ $this->connection->quoteIdentifier( $this->entityMetadata->getIdentifierField() @@ -188,6 +196,7 @@ class Subscription extends \Magento\Framework\Mview\View\Subscription * @param string $prefix * @param ViewInterface $view * @return string + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function getEntityColumn(string $prefix, ViewInterface $view): string { diff --git a/vendor/magento/module-catalog-staging/Model/Mview/View/FutureUpdatesAvoider.php b/vendor/magento/module-catalog-staging/Model/Mview/View/FutureUpdatesAvoider.php new file mode 100644 index 00000000000..5ce5a6d5276 --- /dev/null +++ b/vendor/magento/module-catalog-staging/Model/Mview/View/FutureUpdatesAvoider.php @@ -0,0 +1,55 @@ +resource = $resource; + } + + /** + * @inheritdoc + */ + public function process(string $tableName, string $event, string $statement): string + { + $connection = $this->resource->getConnection(); + $tableName = $this->resource->getTableName($tableName); + if ($connection->isTableExists($tableName)) { + $columns = $connection->describeTable($tableName); + if (isset($columns['created_in'])) { + switch ($event) { + case Trigger::EVENT_DELETE: + $condition = 'OLD.created_in <= UNIX_TIMESTAMP()'; + break; + default: + $condition = 'NEW.created_in <= UNIX_TIMESTAMP()'; + } + $statement = sprintf('IF (%s) THEN %s END IF;', $condition, $statement); + } + } + + return $statement; + } +} diff --git a/vendor/magento/module-catalog-staging/etc/di.xml b/vendor/magento/module-catalog-staging/etc/di.xml index 7640b05041b..352b110b442 100644 --- a/vendor/magento/module-catalog-staging/etc/di.xml +++ b/vendor/magento/module-catalog-staging/etc/di.xml @@ -414,4 +414,11 @@ type="Magento\CatalogStaging\Model\Plugin\Model\Product\ActionPlugin" sortOrder="1"/> + + + + Magento\CatalogStaging\Model\Mview\View\FutureUpdatesAvoider + + + diff --git a/vendor/magento/module-staging/etc/di.xml b/vendor/magento/module-staging/etc/di.xml index ac93a397cb5..a06b7d477a5 100644 --- a/vendor/magento/module-staging/etc/di.xml +++ b/vendor/magento/module-staging/etc/di.xml @@ -264,4 +264,11 @@ Magento\Staging\Model\Entity\PeriodSync\Scheduler\Proxy + + + + updated_in + + + diff --git a/vendor/magento/module-target-rule/Model/Mview/View/StatusAttributeTriggerFilter.php b/vendor/magento/module-target-rule/Model/Mview/View/StatusAttributeTriggerFilter.php new file mode 100644 index 00000000000..f4dd12999ad --- /dev/null +++ b/vendor/magento/module-target-rule/Model/Mview/View/StatusAttributeTriggerFilter.php @@ -0,0 +1,93 @@ +resource->getTableName(self::VIEW_ID . '_cl'); + if (strpos($statement, $triggerTable) === false) { + return $statement; + } + + $statusAttributeId = $this->getStatusAttributeId(); + if ($statusAttributeId === null) { + return $statement; + } + + $condition = $event === Trigger::EVENT_DELETE + ? sprintf('OLD.attribute_id = %d', $statusAttributeId) + : sprintf('NEW.attribute_id = %d', $statusAttributeId); + + return sprintf('IF (%s) THEN %s END IF;', $condition, $statement); + } + + /** + * Retrieve status attribute ID + * + * @return int|null + */ + private function getStatusAttributeId(): ?int + { + if ($this->statusAttributeId !== null) { + return $this->statusAttributeId; + } + + $attribute = $this->eavConfig->getAttribute(Product::ENTITY, 'status'); + $attributeId = (int) $attribute->getAttributeId(); + $this->statusAttributeId = $attributeId > 0 ? $attributeId : null; + + return $this->statusAttributeId; + } +} diff --git a/vendor/magento/module-target-rule/etc/di.xml b/vendor/magento/module-target-rule/etc/di.xml index e37de21318c..5d454f577ff 100644 --- a/vendor/magento/module-target-rule/etc/di.xml +++ b/vendor/magento/module-target-rule/etc/di.xml @@ -83,4 +83,11 @@ + + + + Magento\TargetRule\Model\Mview\View\StatusAttributeTriggerFilter + + + diff --git a/vendor/magento/module-target-rule/etc/mview.xml b/vendor/magento/module-target-rule/etc/mview.xml index b0f6428774f..d1a3e9aa7e8 100644 --- a/vendor/magento/module-target-rule/etc/mview.xml +++ b/vendor/magento/module-target-rule/etc/mview.xml @@ -9,6 +9,7 @@ +