diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala b/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala index 8d47ed0b..d4f566b5 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala @@ -96,7 +96,10 @@ object OCustomFields { def findAll(coll: Ident, nameQuery: Option[String]): F[Vector[CustomFieldData]] = store.transact( - QCustomField.findAllLike(coll, nameQuery.map(WildcardString.apply).map(_.both)) + QCustomField.findAllLike( + coll, + nameQuery.map(WildcardString.apply).flatMap(_.both) + ) ) def findById(coll: Ident, field: Ident): F[Option[CustomFieldData]] = diff --git a/modules/backend/src/main/scala/docspell/backend/ops/WildcardString.scala b/modules/backend/src/main/scala/docspell/backend/ops/WildcardString.scala index 7fb0fec3..3da10172 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/WildcardString.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/WildcardString.scala @@ -2,10 +2,11 @@ package docspell.backend.ops final class WildcardString private (str: String) { - def both: String = - if (str.startsWith("\"") && str.endsWith("\"")) str.drop(1).dropRight(1) - else if (str.startsWith("*") || str.endsWith("*")) str - else s"*$str*" + def both: Option[String] = + if (str.startsWith("\"") && str.endsWith("\"")) Some(str.drop(1).dropRight(1)) + else if (str.startsWith("*") || str.endsWith("*")) Some(str) + else if (str.trim == "") None + else Some(s"*$str*") } object WildcardString { diff --git a/modules/store/src/main/scala/docspell/store/impl/DoobieSyntax.scala b/modules/store/src/main/scala/docspell/store/impl/DoobieSyntax.scala index b4ac5b7f..e465d8ea 100644 --- a/modules/store/src/main/scala/docspell/store/impl/DoobieSyntax.scala +++ b/modules/store/src/main/scala/docspell/store/impl/DoobieSyntax.scala @@ -13,7 +13,7 @@ trait DoobieSyntax { groupBy(NonEmptyList.of(c0, cs: _*)) def groupBy(cs: NonEmptyList[Column]): Fragment = - fr" GROUP BY (" ++ commas(cs.toList.map(_.f)) ++ fr")" + fr" GROUP BY " ++ commas(cs.toList.map(_.f)) def coalesce(f0: Fragment, fs: Fragment*): Fragment = sql" coalesce(" ++ commas(f0 :: fs.toList) ++ sql") " diff --git a/modules/store/src/main/scala/docspell/store/queries/QCustomField.scala b/modules/store/src/main/scala/docspell/store/queries/QCustomField.scala index 92cc0b1f..7b10964e 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QCustomField.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QCustomField.scala @@ -42,7 +42,7 @@ object QCustomField { val nameCond = nameQuery.map(QueryWildcard.apply) match { case Some(q) => - or(fName.lowerLike(q), fLabel.lowerLike(q)) + or(fName.lowerLike(q), and(fLabel.isNotNull, fLabel.lowerLike(q))) case None => Fragment.empty } diff --git a/modules/store/src/main/scala/docspell/store/queries/QueryWildcard.scala b/modules/store/src/main/scala/docspell/store/queries/QueryWildcard.scala index b11df4ec..4416de08 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QueryWildcard.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QueryWildcard.scala @@ -11,7 +11,9 @@ object QueryWildcard { if (n.endsWith("*")) s"${n.dropRight(1)}%" else n - prefix(suffix(value)) + val res = prefix(suffix(value)) + if (res == "%%") "%" + else res } } diff --git a/modules/store/src/test/scala/docspell/store/queries/QueryWildcardTest.scala b/modules/store/src/test/scala/docspell/store/queries/QueryWildcardTest.scala index 688a4bc6..91961d1f 100644 --- a/modules/store/src/test/scala/docspell/store/queries/QueryWildcardTest.scala +++ b/modules/store/src/test/scala/docspell/store/queries/QueryWildcardTest.scala @@ -18,4 +18,9 @@ object QueryWildcardTest extends SimpleTestSuite { assertEquals("%name%", QueryWildcard("*name*")) assertEquals("%some other name%", QueryWildcard("*some other name*")) } + + test("do not use multiple wildcards") { + assertEquals("%", QueryWildcard("**")) + assertEquals("%*%", QueryWildcard("***")) + } }