Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: filtering tags based on existing tags and doing a transaction ar…
…ound the select and insert

Signed-off-by: yemkareems <[email protected]>
  • Loading branch information
yemkareems authored and backportbot[bot] committed Jun 20, 2024
commit 42551c558a6e25458f891cb8f86906772fc1e338
25 changes: 14 additions & 11 deletions lib/private/SystemTag/SystemTagObjectMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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)
Expand All @@ -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;
}
Expand Down