diff --git a/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala b/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala index 30737bba..8ef30826 100644 --- a/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala +++ b/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala @@ -119,8 +119,9 @@ object CreateItem { private def findExisting[F[_]: Sync]: Task[F, ProcessItemArgs, Option[ItemData]] = Task { ctx => + val fileMetaIds = ctx.args.files.map(_.fileMetaId).toSet for { - cand <- ctx.store.transact(QItem.findByFileIds(ctx.args.files.map(_.fileMetaId))) + cand <- ctx.store.transact(QItem.findByFileIds(fileMetaIds.toSeq)) _ <- if (cand.nonEmpty) ctx.logger.warn("Found existing item with these files.") else ().pure[F] @@ -130,8 +131,11 @@ object CreateItem { ctx.logger.warn(s"Removed ${ht.sum} items with same attachments") else ().pure[F] rms <- OptionT( + //load attachments but only those mentioned in the task's arguments cand.headOption.traverse(ri => - ctx.store.transact(RAttachment.findByItemAndCollective(ri.id, ri.cid)) + ctx.store + .transact(RAttachment.findByItemAndCollective(ri.id, ri.cid)) + .map(_.filter(r => fileMetaIds.contains(r.fileId))) ) ).getOrElse(Vector.empty) orig <- rms.traverse(a => diff --git a/modules/store/src/main/scala/docspell/store/queries/QItem.scala b/modules/store/src/main/scala/docspell/store/queries/QItem.scala index 6230a3bb..619c0dbf 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QItem.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QItem.scala @@ -287,7 +287,7 @@ object QItem { n <- store.transact(RItem.deleteByIdAndCollective(itemId, collective)) } yield tn + rn + n - def findByFileIds(fileMetaIds: List[Ident]): ConnectionIO[Vector[RItem]] = { + def findByFileIds(fileMetaIds: Seq[Ident]): ConnectionIO[Vector[RItem]] = { val IC = RItem.Columns val AC = RAttachment.Columns val q =