Allo wildcards when searching by attachment ids

This commit is contained in:
eikek
2021-07-31 01:23:37 +02:00
parent 860e146bf0
commit 1256a6e8cf
3 changed files with 42 additions and 7 deletions

View File

@ -171,12 +171,16 @@ object ItemQueryGenerator {
tables.item.id.in(select.withSelect(Nel.of(RItem.as("i").id.s)))
case Expr.AttachId(id) =>
tables.item.id.in(
Select(
select(RAttachment.T.itemId),
from(RAttachment.T),
val idWildcard = QueryWildcard(id)
val query =
if (id == idWildcard) {
RAttachment.T.id.cast[String] === id
).distinct
} else {
RAttachment.T.id.cast[String].like(idWildcard)
}
tables.item.id.in(
Select(select(RAttachment.T.itemId), from(RAttachment.T), query).distinct
)
case Expr.Fulltext(_) =>

View File

@ -11,6 +11,7 @@ import java.time.LocalDate
import docspell.common._
import docspell.query.ItemQueryParser
import docspell.store.qb.DSL._
import docspell.store.qb.Select
import docspell.store.qb.generator.{ItemQueryGenerator, Tables}
import docspell.store.queries.AttachCountTable
import docspell.store.records._
@ -56,4 +57,31 @@ class ItemQueryGeneratorTest extends FunSuite {
assertEquals(cond, expect)
}
test("attach.id with wildcard") {
val q = ItemQueryParser.parseUnsafe("attach.id=abcde*")
val cond = ItemQueryGenerator(now, tables, Ident.unsafe("coll"))(q)
val expect = tables.item.id.in(
Select(
select(RAttachment.T.itemId),
from(RAttachment.T),
RAttachment.T.id.cast[String].like("abcde%")
).distinct
)
assertEquals(cond, expect)
}
test("attach.id with equals") {
val q = ItemQueryParser.parseUnsafe("attach.id=abcde")
val cond = ItemQueryGenerator(now, tables, Ident.unsafe("coll"))(q)
val expect = tables.item.id.in(
Select(
select(RAttachment.T.itemId),
from(RAttachment.T),
RAttachment.T.id.cast[String] === "abcde"
).distinct
)
assertEquals(cond, expect)
}
}