From a923351b09f4d62a147f9af8ad98aff405e40159 Mon Sep 17 00:00:00 2001 From: eikek Date: Mon, 16 Aug 2021 13:18:47 +0200 Subject: [PATCH] Fix item merge when merging tags and text fields Also hard delete the remaining items. They are empty (have no attachments), because data is moved if possible. Doesn't make much sense to keep them, because restoring them isn't much useful. --- .../scala/docspell/backend/item/Merge.scala | 4 ++-- .../scala/docspell/store/records/RTagItem.scala | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/backend/src/main/scala/docspell/backend/item/Merge.scala b/modules/backend/src/main/scala/docspell/backend/item/Merge.scala index 06885313..12d27a28 100644 --- a/modules/backend/src/main/scala/docspell/backend/item/Merge.scala +++ b/modules/backend/src/main/scala/docspell/backend/item/Merge.scala @@ -58,7 +58,7 @@ object Merge { ) _ <- EitherT.right[Error]( NonEmptyList.fromList(items.tail.map(_.id)) match { - case Some(nel) => itemOps.setDeletedState(nel, collective) + case Some(nel) => itemOps.deleteItemMultiple(nel, collective) case None => 0.pure[F] } ) @@ -146,7 +146,7 @@ object Merge { case CustomFieldType.Text => val text = fields.toList - .map(fv => CustomFieldType.Text.parseValue(fv.value).toOption) + .flatMap(fv => CustomFieldType.Text.parseValue(fv.value).toOption) .mkString(", ") fields.head.copy(value = CustomFieldType.Text.valueString(text)) } diff --git a/modules/store/src/main/scala/docspell/store/records/RTagItem.scala b/modules/store/src/main/scala/docspell/store/records/RTagItem.scala index 95c8d441..c4bec512 100644 --- a/modules/store/src/main/scala/docspell/store/records/RTagItem.scala +++ b/modules/store/src/main/scala/docspell/store/records/RTagItem.scala @@ -34,8 +34,21 @@ object RTagItem { def insert(v: RTagItem): ConnectionIO[Int] = DML.insert(T, T.all, fr"${v.tagItemId},${v.itemId},${v.tagId}") - def moveTags(from: Ident, to: Ident): ConnectionIO[Int] = - DML.update(T, T.itemId === from, DML.set(T.itemId.setTo(to))) + def moveTags(fromItem: Ident, toItem: Ident): ConnectionIO[Int] = + for { + both <- intersect( + Select(select(T.tagId), from(T), T.itemId === fromItem).distinct, + Select(select(T.tagId), from(T), T.itemId === toItem).distinct + ).build + .query[Ident] + .to[List] + skipIds = NonEmptyList.fromList(both) + n <- DML.update( + T, + T.itemId === fromItem &&? skipIds.map(ids => T.tagId.notIn(ids)), + DML.set(T.itemId.setTo(toItem)) + ) + } yield n def deleteItemTags(item: Ident): ConnectionIO[Int] = DML.delete(T, T.itemId === item)