mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-06 15:15:58 +00:00
Fix paging when using full-text search
This commit is contained in:
parent
15c0fb4395
commit
647911563e
@ -110,6 +110,8 @@ object OFulltext {
|
|||||||
.compile
|
.compile
|
||||||
.toVector
|
.toVector
|
||||||
|
|
||||||
|
// Helper
|
||||||
|
|
||||||
private def findItemsFts[A: ItemId, B](
|
private def findItemsFts[A: ItemId, B](
|
||||||
q: Query,
|
q: Query,
|
||||||
ftsQ: FtsInput,
|
ftsQ: FtsInput,
|
||||||
@ -119,15 +121,28 @@ object OFulltext {
|
|||||||
FtsResult,
|
FtsResult,
|
||||||
Map[Ident, List[FtsResult.ItemMatch]]
|
Map[Ident, List[FtsResult.ItemMatch]]
|
||||||
) => PartialFunction[A, (A, FtsData)]
|
) => PartialFunction[A, (A, FtsData)]
|
||||||
): Stream[F, (A, FtsData)] = {
|
): Stream[F, (A, FtsData)] =
|
||||||
|
findItemsFts0(q, ftsQ, batch, search, convert)
|
||||||
|
.takeThrough(_._1 >= batch.limit)
|
||||||
|
.flatMap(x => Stream.emits(x._2))
|
||||||
|
|
||||||
|
private def findItemsFts0[A: ItemId, B](
|
||||||
|
q: Query,
|
||||||
|
ftsQ: FtsInput,
|
||||||
|
batch: Batch,
|
||||||
|
search: (Query, Batch) => F[Vector[A]],
|
||||||
|
convert: (
|
||||||
|
FtsResult,
|
||||||
|
Map[Ident, List[FtsResult.ItemMatch]]
|
||||||
|
) => PartialFunction[A, (A, FtsData)]
|
||||||
|
): Stream[F, (Int, Vector[(A, FtsData)])] = {
|
||||||
val sqlResult = search(q, batch)
|
val sqlResult = search(q, batch)
|
||||||
val fq = FtsQuery(
|
val fq = FtsQuery(
|
||||||
ftsQ.query,
|
ftsQ.query,
|
||||||
q.collective,
|
q.collective,
|
||||||
Set.empty,
|
Set.empty,
|
||||||
batch.limit,
|
0,
|
||||||
batch.offset,
|
0,
|
||||||
FtsQuery.HighlightSetting(ftsQ.highlightPre, ftsQ.highlightPost)
|
FtsQuery.HighlightSetting(ftsQ.highlightPre, ftsQ.highlightPost)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -135,17 +150,17 @@ object OFulltext {
|
|||||||
for {
|
for {
|
||||||
items <- sqlResult
|
items <- sqlResult
|
||||||
ids = items.map(a => ItemId[A].itemId(a))
|
ids = items.map(a => ItemId[A].itemId(a))
|
||||||
ftsQ = fq.copy(items = ids.toSet)
|
// must find all index results involving the items.
|
||||||
|
// Currently there is one result per item + one result per
|
||||||
|
// attachment
|
||||||
|
limit = items.map(a => ItemId[A].fileCount(a)).sum + items.size
|
||||||
|
ftsQ = fq.copy(items = ids.toSet, limit = limit)
|
||||||
ftsR <- fts.search(ftsQ)
|
ftsR <- fts.search(ftsQ)
|
||||||
ftsItems = ftsR.results.groupBy(_.itemId)
|
ftsItems = ftsR.results.groupBy(_.itemId)
|
||||||
res = items.collect(convert(ftsR, ftsItems))
|
res = items.collect(convert(ftsR, ftsItems))
|
||||||
} yield res
|
} yield (items.size, res)
|
||||||
|
|
||||||
Stream.eval(qres).flatMap { v =>
|
Stream.eval(qres) ++ findItemsFts0(q, ftsQ, batch.next, search, convert)
|
||||||
val results = Stream.emits(v)
|
|
||||||
if (v.size < batch.limit) results
|
|
||||||
else results ++ findItemsFts(q, ftsQ, batch.next, search, convert)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private def convertFtsData[A: ItemId](
|
private def convertFtsData[A: ItemId](
|
||||||
@ -165,19 +180,22 @@ object OFulltext {
|
|||||||
|
|
||||||
trait ItemId[A] {
|
trait ItemId[A] {
|
||||||
def itemId(a: A): Ident
|
def itemId(a: A): Ident
|
||||||
|
|
||||||
|
def fileCount(a: A): Int
|
||||||
}
|
}
|
||||||
object ItemId {
|
object ItemId {
|
||||||
def apply[A](implicit ev: ItemId[A]): ItemId[A] = ev
|
def apply[A](implicit ev: ItemId[A]): ItemId[A] = ev
|
||||||
|
|
||||||
def from[A](f: A => Ident): ItemId[A] =
|
def from[A](f: A => Ident, g: A => Int): ItemId[A] =
|
||||||
new ItemId[A] {
|
new ItemId[A] {
|
||||||
def itemId(a: A) = f(a)
|
def itemId(a: A) = f(a)
|
||||||
|
def fileCount(a: A) = g(a)
|
||||||
}
|
}
|
||||||
|
|
||||||
implicit val listItemId: ItemId[ListItem] =
|
implicit val listItemId: ItemId[ListItem] =
|
||||||
ItemId.from(_.id)
|
ItemId.from(_.id, _.fileCount)
|
||||||
|
|
||||||
implicit val listItemWithTagsId: ItemId[ListItemWithTags] =
|
implicit val listItemWithTagsId: ItemId[ListItemWithTags] =
|
||||||
ItemId.from(_.item.id)
|
ItemId.from(_.item.id, _.item.fileCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user