From 6305de4d5a61774da8379bfc19a2036e4dd1703b Mon Sep 17 00:00:00 2001 From: yemkareems Date: Thu, 30 May 2024 14:39:58 +0530 Subject: [PATCH 1/3] fix: do a select in systemtag_object_mapping to see if tag exists already in db. if it does not exist alone insert the same or else do nothing Signed-off-by: yemkareems --- .../SystemTag/SystemTagObjectMapper.php | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php index 614d0274add27..9872b4fc95e2d 100644 --- a/lib/private/SystemTag/SystemTagObjectMapper.php +++ b/lib/private/SystemTag/SystemTagObjectMapper.php @@ -134,6 +134,15 @@ public function assignTags(string $objId, string $objectType, $tagIds): void { $this->assertTagsExist($tagIds); + $query = $this->connection->getQueryBuilder(); + $query->select('systemtagid') + ->from(self::RELATION_TABLE) + ->where($query->expr()->in('systemtagid', $query->createNamedParameter($tagIds, IQueryBuilder::PARAM_INT_ARRAY))) + ->andWhere($query->expr()->eq('objecttype', $query->createNamedParameter($objectType))) + ->andWhere($query->expr()->eq('objectid', $query->createNamedParameter($objId))); + $result = $query->executeQuery(); + $rows = $result->fetchAll(); + $query = $this->connection->getQueryBuilder(); $query->insert(self::RELATION_TABLE) ->values([ @@ -144,12 +153,17 @@ public function assignTags(string $objId, string $objectType, $tagIds): void { $tagsAssigned = []; foreach ($tagIds as $tagId) { - try { - $query->setParameter('tagid', $tagId); - $query->execute(); - $tagsAssigned[] = $tagId; - } catch (UniqueConstraintViolationException $e) { - // ignore existing relations + if(!in_array($tagId, array_column($rows, 'systemtagid'))) { + // tag not in db so create new one + try { + $query->setParameter('tagid', $tagId); + $query->execute(); + $tagsAssigned[] = $tagId; + } catch (UniqueConstraintViolationException $e) { + // ignore existing relations + } + } else { + //tag exists already don't insert } } From 42551c558a6e25458f891cb8f86906772fc1e338 Mon Sep 17 00:00:00 2001 From: yemkareems Date: Thu, 30 May 2024 15:38:06 +0530 Subject: [PATCH 2/3] fix: filtering tags based on existing tags and doing a transaction around the select and insert Signed-off-by: yemkareems --- .../SystemTag/SystemTagObjectMapper.php | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php index 9872b4fc95e2d..cb24ad29a89c2 100644 --- a/lib/private/SystemTag/SystemTagObjectMapper.php +++ b/lib/private/SystemTag/SystemTagObjectMapper.php @@ -133,6 +133,7 @@ public function assignTags(string $objId, string $objectType, $tagIds): void { } $this->assertTagsExist($tagIds); + $this->connection->beginTransaction(); $query = $this->connection->getQueryBuilder(); $query->select('systemtagid') @@ -142,6 +143,12 @@ public function assignTags(string $objId, string $objectType, $tagIds): void { ->andWhere($query->expr()->eq('objectid', $query->createNamedParameter($objId))); $result = $query->executeQuery(); $rows = $result->fetchAll(); + $existingTags = []; + foreach ($rows as $k => $row) { + $existingTags[] = $row['systemtagid']; + } + //filter only tags that do not exist in db + $tagIds = array_diff($tagIds, $existingTags); $query = $this->connection->getQueryBuilder(); $query->insert(self::RELATION_TABLE) @@ -153,20 +160,16 @@ public function assignTags(string $objId, string $objectType, $tagIds): void { $tagsAssigned = []; foreach ($tagIds as $tagId) { - if(!in_array($tagId, array_column($rows, 'systemtagid'))) { - // tag not in db so create new one - try { - $query->setParameter('tagid', $tagId); - $query->execute(); - $tagsAssigned[] = $tagId; - } catch (UniqueConstraintViolationException $e) { - // ignore existing relations - } - } else { - //tag exists already don't insert + try { + $query->setParameter('tagid', $tagId); + $query->execute(); + $tagsAssigned[] = $tagId; + } catch (UniqueConstraintViolationException $e) { + // ignore existing relations } } + $this->connection->commit(); if (empty($tagsAssigned)) { return; } From c47432fe49635c4b7aff193735937733c7e199a1 Mon Sep 17 00:00:00 2001 From: yemkareems Date: Wed, 19 Jun 2024 12:29:44 +0530 Subject: [PATCH 3/3] fix: removed unused variable and check if tag ids are empty before starting the inserts Signed-off-by: yemkareems --- lib/private/SystemTag/SystemTagObjectMapper.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php index cb24ad29a89c2..7a2e701515d4f 100644 --- a/lib/private/SystemTag/SystemTagObjectMapper.php +++ b/lib/private/SystemTag/SystemTagObjectMapper.php @@ -144,11 +144,16 @@ public function assignTags(string $objId, string $objectType, $tagIds): void { $result = $query->executeQuery(); $rows = $result->fetchAll(); $existingTags = []; - foreach ($rows as $k => $row) { + foreach ($rows as $row) { $existingTags[] = $row['systemtagid']; } //filter only tags that do not exist in db $tagIds = array_diff($tagIds, $existingTags); + if (empty($tagIds)) { + // no tags to insert so return here + $this->connection->commit(); + return; + } $query = $this->connection->getQueryBuilder(); $query->insert(self::RELATION_TABLE)