mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 10:28:27 +00:00
Fix fulltext search queries for new collective-id
This commit is contained in:
@ -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],
|
||||
|
Reference in New Issue
Block a user