From f20375b90d916ed03814e534ecb4feee112330d5 Mon Sep 17 00:00:00 2001 From: "Victor.Sergeyev" Date: Wed, 27 Jul 2022 12:48:57 +0400 Subject: [PATCH 1/2] Mass delete templates in container version --- Dao/TagsDao.php | 17 ++++++++++++++++- Dao/TriggersDao.php | 15 +++++++++++++++ Dao/VariablesDao.php | 15 +++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Dao/TagsDao.php b/Dao/TagsDao.php index 9c0167f5e..a52a1b66c 100644 --- a/Dao/TagsDao.php +++ b/Dao/TagsDao.php @@ -189,6 +189,21 @@ public function deleteContainerTag($idSite, $idContainerVersion, $idTag, $delete Db::query($query, $bind); } + /** + * @param int $idSite + * @param int $idContainerVersion + * @param string $deletedDate + */ + public function deleteContainerTags($idSite, $idContainerVersion, $deletedDate) + { + $table = $this->tablePrefixed; + + $query = "UPDATE $table SET status = ?, deleted_date = ? WHERE idsite = ? and idcontainerversion = ? and status != ?"; + $bind = array(self::STATUS_DELETED, $deletedDate, $idSite, $idContainerVersion, self::STATUS_DELETED); + + Db::query($query, $bind); + } + private function enrichTags($tags) { if (empty($tags)) { @@ -217,7 +232,7 @@ private function enrichTag($tag) $tag['idcontainerversion'] = (int) $tag['idcontainerversion']; $tag['fire_delay'] = (int)$tag['fire_delay']; $tag['priority'] = (int)$tag['priority']; - + if ($tag['start_date'] === '0000-00-00 00:00:00') { $tag['start_date'] = null; } diff --git a/Dao/TriggersDao.php b/Dao/TriggersDao.php index ab49053ba..f69b95c77 100644 --- a/Dao/TriggersDao.php +++ b/Dao/TriggersDao.php @@ -170,6 +170,21 @@ public function deleteContainerTrigger($idSite, $idContainerVersion, $idTrigger, Db::query($query, $bind); } + /** + * @param int $idSite + * @param int $idContainerVersion + * @param string $deletedDate + */ + public function deleteContainerTriggers($idSite, $idContainerVersion, $deletedDate) + { + $table = $this->tablePrefixed; + + $query = "UPDATE $table SET status = ?, deleted_date = ? WHERE idsite = ? and idcontainerversion = ? and status != ?"; + $bind = array(self::STATUS_DELETED, $deletedDate, $idSite, $idContainerVersion, self::STATUS_DELETED); + + Db::query($query, $bind); + } + private function enrichTriggers($triggers) { if (empty($triggers)) { diff --git a/Dao/VariablesDao.php b/Dao/VariablesDao.php index 23ca8ed33..d5dda6eea 100644 --- a/Dao/VariablesDao.php +++ b/Dao/VariablesDao.php @@ -187,6 +187,21 @@ public function deleteContainerVariable($idSite, $idContainerVersion, $idVariabl Db::query($query, $bind); } + /** + * @param int $idSite + * @param int $idContainerVersion + * @param string $deletedDate + */ + public function deleteContainerVariables($idSite, $idContainerVersion, $deletedDate) + { + $table = $this->tablePrefixed; + + $query = "UPDATE $table SET status = ?, deleted_date = ? WHERE idsite = ? and idcontainerversion = ? and status != ?"; + $bind = array(self::STATUS_DELETED, $deletedDate, $idSite, $idContainerVersion, self::STATUS_DELETED); + + Db::query($query, $bind); + } + private function enrichVariables($variables) { if (empty($variables)) { From 0bb9d7ec10373b2192dddac0a18a66dbd8aef81a Mon Sep 17 00:00:00 2001 From: "Victor.Sergeyev" Date: Thu, 4 Aug 2022 13:05:04 +0400 Subject: [PATCH 2/2] optimize import with mass delete --- API/Import.php | 60 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/API/Import.php b/API/Import.php index 4e241b890..f9810620a 100644 --- a/API/Import.php +++ b/API/Import.php @@ -5,6 +5,7 @@ * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ + namespace Piwik\Plugins\TagManager\API; use Piwik\API\Request; @@ -16,6 +17,10 @@ use Piwik\Plugins\TagManager\Model\Trigger; use Piwik\Plugins\TagManager\Model\Variable; use Exception; +use Piwik\Date; +use Piwik\Plugins\TagManager\Dao\TagsDao; +use Piwik\Plugins\TagManager\Dao\TriggersDao; +use Piwik\Plugins\TagManager\Dao\VariablesDao; use Piwik\Plugins\TagManager\Template\Tag\TagsProvider; use Piwik\Plugins\TagManager\Template\Trigger\TriggersProvider; use Piwik\Plugins\TagManager\Template\Variable\VariablesProvider; @@ -62,16 +67,48 @@ class Import */ private $accessValidator; - public function __construct(Tag $tags, Trigger $triggers, Variable $variables, Container $containers, AccessValidator $accessValidator, TagsProvider $tagsProvider, TriggersProvider $triggersProvider, VariablesProvider $variablesProvider) - { + /** + * @var TagsDao + */ + protected $tagsDao; + + /** + * @var TriggersDao + */ + protected $triggersDao; + + /** + * @var VariablesDao + */ + protected $variablesDao; + + public function __construct( + Tag $tags, + Trigger $triggers, + Variable $variables, + Container $containers, + AccessValidator $accessValidator, + TagsProvider $tagsProvider, + TriggersProvider $triggersProvider, + VariablesProvider $variablesProvider, + TagsDao $tagsDao, + TriggersDao $triggersDao, + VariablesDao $variablesDao + ) { $this->tags = $tags; $this->triggers = $triggers; $this->variables = $variables; $this->containers = $containers; + $this->accessValidator = $accessValidator; + $this->tagsProvider = $tagsProvider; $this->triggersProvider = $triggersProvider; $this->variablesProvider = $variablesProvider; + + $this->tagsDao = $tagsDao; + $this->triggersDao = $triggersDao; + $this->variablesDao = $variablesDao; } public function checkImportContainerIsPossible($exportedContainerVersion, $idSite, $idContainer) @@ -119,17 +156,10 @@ public function importContainerVersion($exportedContainerVersion, $idSite, $idCo { $this->checkImportContainerIsPossible($exportedContainerVersion, $idSite, $idContainer); - foreach ($this->tags->getContainerTags($idSite, $idContainerVersion) as $tag) { - $this->tags->deleteContainerTag($idSite, $idContainerVersion, $tag['idtag']); - } - - foreach ($this->triggers->getContainerTriggers($idSite, $idContainerVersion) as $trigger) { - $this->triggers->deleteContainerTrigger($idSite, $idContainerVersion, $trigger['idtrigger']); - } - - foreach ($this->variables->getContainerVariables($idSite, $idContainerVersion) as $variable) { - $this->variables->deleteContainerVariable($idSite, $idContainerVersion, $variable['idvariable']); - } + $now = Date::now()->getDatetime(); + $this->tagsDao->deleteContainerTags($idSite, $idContainerVersion, $now); + $this->triggersDao->deleteContainerTriggers($idSite, $idContainerVersion, $now); + $this->variablesDao->deleteContainerVariables($idSite, $idContainerVersion, $now); $ecv = $exportedContainerVersion; @@ -145,7 +175,7 @@ public function importContainerVersion($exportedContainerVersion, $idSite, $idCo 'defaultValue' => $variable['default_value'], 'lookupTable' => $variable['lookup_table'], )); - } catch (EntityRecursionException $e){ + } catch (EntityRecursionException $e) { throw new \Exception(Piwik::translate('TagManager_EntityRecursionExceptionForVariable', array($variable['name'] . '(' . $variable['type'] . ')'))); } } @@ -200,6 +230,4 @@ public function importContainerVersion($exportedContainerVersion, $idSite, $idCo )); } } - - }