mirror of
				https://github.com/TheAnachronism/docspell.git
				synced 2025-10-31 17:50:11 +00:00 
			
		
		
		
	Fix fulltext search queries for new collective-id
This commit is contained in:
		| @@ -29,7 +29,7 @@ object FtsResult { | ||||
|   case class ItemMatch( | ||||
|       id: Ident, | ||||
|       itemId: Ident, | ||||
|       collectiveId: Ident, | ||||
|       collectiveId: CollectiveId, | ||||
|       score: Double, | ||||
|       data: MatchData | ||||
|   ) | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import doobie._ | ||||
| import doobie.implicits._ | ||||
|  | ||||
| object FtsRepository extends DoobieMeta { | ||||
|   private[this] val logger = docspell.logging.getLogger[ConnectionIO] | ||||
|   val table = fr"ftspsql_search" | ||||
|  | ||||
|   def containsData: ConnectionIO[Boolean] = | ||||
| @@ -62,15 +63,17 @@ object FtsRepository extends DoobieMeta { | ||||
|  | ||||
|     val query = mkQueryPart(pq, q) | ||||
|  | ||||
|     sql"""select $select  | ||||
|          |from $table, $query | ||||
|          |where ${mkCondition(q)} AND query @@ text_index  | ||||
|          |order by rank desc | ||||
|          |limit ${q.limit} | ||||
|          |offset ${q.offset} | ||||
|          |""".stripMargin | ||||
|       .query[SearchResult] | ||||
|       .to[Vector] | ||||
|     val sqlFrag = | ||||
|       sql"""select $select  | ||||
|            |from $table, $query | ||||
|            |where ${mkCondition(q)} AND query @@ text_index  | ||||
|            |order by rank desc | ||||
|            |limit ${q.limit} | ||||
|            |offset ${q.offset} | ||||
|            |""".stripMargin | ||||
|  | ||||
|     logger.asUnsafe.trace(s"PSQL Fulltext query: $sqlFrag") | ||||
|     sqlFrag.query[SearchResult].to[Vector] | ||||
|   } | ||||
|  | ||||
|   private def mkCondition(q: FtsQuery): Fragment = { | ||||
| @@ -84,7 +87,7 @@ object FtsRepository extends DoobieMeta { | ||||
|     val folders = | ||||
|       NonEmptyList.fromList(q.folders.toList).map { nel => | ||||
|         val ids = nel.map(id => fr"$id").reduceLeft(_ ++ fr"," ++ _) | ||||
|         fr"folder_id in ($ids)" | ||||
|         fr"(folder_id in ($ids) or folder_id is null)" | ||||
|       } | ||||
|  | ||||
|     List(items, folders).flatten.foldLeft(coll)(_ ++ fr"AND" ++ _) | ||||
|   | ||||
| @@ -26,6 +26,8 @@ final class PsqlFtsClient[F[_]: Sync](cfg: PsqlConfig, xa: Transactor[F]) | ||||
|   val engine = Ident.unsafe("postgres") | ||||
|  | ||||
|   val config = cfg | ||||
|   private[this] val logger = docspell.logging.getLogger[F] | ||||
|  | ||||
|   private[ftspsql] val transactor = xa | ||||
|  | ||||
|   private[this] val searchSummary = | ||||
| @@ -83,6 +85,7 @@ final class PsqlFtsClient[F[_]: Sync](cfg: PsqlConfig, xa: Transactor[F]) | ||||
|       summary <- searchSummary(q).transact(xa) | ||||
|       results <- search(q, true).transact(xa) | ||||
|       endNanos <- Sync[F].delay(System.nanoTime()) | ||||
|       _ <- logger.debug(s"PSQL fulltext search hits: ${results.size}") | ||||
|       duration = Duration.nanos(endNanos - startNanos) | ||||
|       res = SearchResult | ||||
|         .toFtsResult(summary, results) | ||||
|   | ||||
| @@ -13,7 +13,7 @@ import docspell.ftsclient.FtsResult.{ItemMatch, MatchData} | ||||
| final case class SearchResult( | ||||
|     id: Ident, | ||||
|     itemId: Ident, | ||||
|     collective: Ident, | ||||
|     collective: CollectiveId, | ||||
|     language: Language, | ||||
|     attachId: Option[Ident], | ||||
|     folderId: Option[Ident], | ||||
|   | ||||
| @@ -125,7 +125,7 @@ trait JsonCodec { | ||||
|         for { | ||||
|           itemId <- c.get[Ident](Field.itemId.name) | ||||
|           id <- c.get[Ident](Field.id.name) | ||||
|           coll <- c.get[Ident](Field.collectiveId.name) | ||||
|           coll <- c.get[CollectiveId](Field.collectiveId.name) | ||||
|           score <- c.get[Double]("score") | ||||
|           md <- decodeMatchData(c) | ||||
|         } yield FtsResult.ItemMatch(id, itemId, coll, score, md) | ||||
|   | ||||
| @@ -130,14 +130,14 @@ class TempFtsOpsTest extends DatabaseTest { | ||||
|         ItemMatch( | ||||
|           id(s"m$n"), | ||||
|           id(s"item-$n"), | ||||
|           DocspellSystem.user, | ||||
|           CollectiveId(1), | ||||
|           math.random(), | ||||
|           FtsResult.ItemData | ||||
|         ), | ||||
|         ItemMatch( | ||||
|           id(s"m$n-1"), | ||||
|           id(s"item-$n"), | ||||
|           DocspellSystem.user, | ||||
|           CollectiveId(1), | ||||
|           math.random(), | ||||
|           AttachmentData(id(s"item-$n-attach-1"), "attachment.pdf") | ||||
|         ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user