mirror of
				https://github.com/TheAnachronism/docspell.git
				synced 2025-11-04 12:30:12 +00:00 
			
		
		
		
	@@ -258,12 +258,12 @@ object OItemSearch {
 | 
				
			|||||||
        store.transact(QAttachment.getAttachmentMeta(id, collective))
 | 
					        store.transact(QAttachment.getAttachmentMeta(id, collective))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      def findByFileCollective(checksum: String, collective: Ident): F[Vector[RItem]] =
 | 
					      def findByFileCollective(checksum: String, collective: Ident): F[Vector[RItem]] =
 | 
				
			||||||
        store.transact(QItem.findByChecksum(checksum, collective))
 | 
					        store.transact(QItem.findByChecksum(checksum, collective, Set.empty))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      def findByFileSource(checksum: String, sourceId: Ident): F[Vector[RItem]] =
 | 
					      def findByFileSource(checksum: String, sourceId: Ident): F[Vector[RItem]] =
 | 
				
			||||||
        store.transact((for {
 | 
					        store.transact((for {
 | 
				
			||||||
          coll  <- OptionT(RSource.findCollective(sourceId))
 | 
					          coll  <- OptionT(RSource.findCollective(sourceId))
 | 
				
			||||||
          items <- OptionT.liftF(QItem.findByChecksum(checksum, coll))
 | 
					          items <- OptionT.liftF(QItem.findByChecksum(checksum, coll, Set.empty))
 | 
				
			||||||
        } yield items).getOrElse(Vector.empty))
 | 
					        } yield items).getOrElse(Vector.empty))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,10 +63,12 @@ object DuplicateCheck {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private def checkDuplicate[F[_]](
 | 
					  private def checkDuplicate[F[_]](
 | 
				
			||||||
      ctx: Context[F, Args]
 | 
					      ctx: Context[F, Args]
 | 
				
			||||||
  )(fm: FileMeta): ConnectionIO[FileMetaDupes] =
 | 
					  )(fm: FileMeta): ConnectionIO[FileMetaDupes] = {
 | 
				
			||||||
 | 
					    val excludes = ctx.args.files.map(_.fileMetaId).toSet
 | 
				
			||||||
    QItem
 | 
					    QItem
 | 
				
			||||||
      .findByChecksum(fm.checksum, ctx.args.meta.collective)
 | 
					      .findByChecksum(fm.checksum, ctx.args.meta.collective, excludes)
 | 
				
			||||||
      .map(v => FileMetaDupes(fm, v.nonEmpty))
 | 
					      .map(v => FileMetaDupes(fm, v.nonEmpty))
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case class FileMetaDupes(fm: FileMeta, exists: Boolean)
 | 
					  case class FileMetaDupes(fm: FileMeta, exists: Boolean)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -454,7 +454,7 @@ object QItem {
 | 
				
			|||||||
      (a.fileId.in(fileMetaIds) ||
 | 
					      (a.fileId.in(fileMetaIds) ||
 | 
				
			||||||
        s.fileId.in(fileMetaIds) ||
 | 
					        s.fileId.in(fileMetaIds) ||
 | 
				
			||||||
        r.fileId.in(fileMetaIds)) &&? states.map(nel => i.state.in(nel))
 | 
					        r.fileId.in(fileMetaIds)) &&? states.map(nel => i.state.in(nel))
 | 
				
			||||||
    )
 | 
					    ).distinct
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def findOneByFileIds(fileMetaIds: Seq[Ident]): ConnectionIO[Option[RItem]] =
 | 
					  def findOneByFileIds(fileMetaIds: Seq[Ident]): ConnectionIO[Option[RItem]] =
 | 
				
			||||||
@@ -476,7 +476,11 @@ object QItem {
 | 
				
			|||||||
        Vector.empty[RItem].pure[ConnectionIO]
 | 
					        Vector.empty[RItem].pure[ConnectionIO]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def findByChecksum(checksum: String, collective: Ident): ConnectionIO[Vector[RItem]] = {
 | 
					  def findByChecksum(
 | 
				
			||||||
 | 
					      checksum: String,
 | 
				
			||||||
 | 
					      collective: Ident,
 | 
				
			||||||
 | 
					      excludeFileMeta: Set[Ident]
 | 
				
			||||||
 | 
					  ): ConnectionIO[Vector[RItem]] = {
 | 
				
			||||||
    val m1 = RFileMeta.as("m1")
 | 
					    val m1 = RFileMeta.as("m1")
 | 
				
			||||||
    val m2 = RFileMeta.as("m2")
 | 
					    val m2 = RFileMeta.as("m2")
 | 
				
			||||||
    val m3 = RFileMeta.as("m3")
 | 
					    val m3 = RFileMeta.as("m3")
 | 
				
			||||||
@@ -496,9 +500,12 @@ object QItem {
 | 
				
			|||||||
        .leftJoin(m3, m3.id === r.fileId),
 | 
					        .leftJoin(m3, m3.id === r.fileId),
 | 
				
			||||||
      where(
 | 
					      where(
 | 
				
			||||||
        i.cid === collective &&
 | 
					        i.cid === collective &&
 | 
				
			||||||
          (m1.checksum === checksum || m2.checksum === checksum || m3.checksum === checksum)
 | 
					          (m1.checksum === checksum || m2.checksum === checksum || m3.checksum === checksum) &&?
 | 
				
			||||||
 | 
					          Nel
 | 
				
			||||||
 | 
					            .fromList(excludeFileMeta.toList)
 | 
				
			||||||
 | 
					            .map(excl => m1.id.notIn(excl) && m2.id.notIn(excl) && m3.id.notIn(excl))
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    ).build.query[RItem].to[Vector]
 | 
					    ).distinct.build.query[RItem].to[Vector]
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  final case class NameAndNotes(
 | 
					  final case class NameAndNotes(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user