diff --git a/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala b/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala index dc418810..58cca850 100644 --- a/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala +++ b/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala @@ -1,5 +1,7 @@ package docspell.store.qb +import cats.data.NonEmptyList + sealed trait DBFunction {} object DBFunction { @@ -31,6 +33,8 @@ object DBFunction { case class Sum(expr: SelectExpr) extends DBFunction + case class Concat(exprs: NonEmptyList[SelectExpr]) extends DBFunction + sealed trait Operator object Operator { case object Plus extends Operator diff --git a/modules/store/src/main/scala/docspell/store/qb/DSL.scala b/modules/store/src/main/scala/docspell/store/qb/DSL.scala index db80e20b..b3df71dd 100644 --- a/modules/store/src/main/scala/docspell/store/qb/DSL.scala +++ b/modules/store/src/main/scala/docspell/store/qb/DSL.scala @@ -98,6 +98,9 @@ trait DSL extends DoobieMeta { def substring(expr: SelectExpr, start: Int, length: Int): DBFunction = DBFunction.Substring(expr, start, length) + def concat(expr: SelectExpr, exprs: SelectExpr*): DBFunction = + DBFunction.Concat(Nel.of(expr, exprs: _*)) + def lit[A](value: A)(implicit P: Put[A]): SelectExpr.SelectLit[A] = SelectExpr.SelectLit(value, None) diff --git a/modules/store/src/main/scala/docspell/store/qb/impl/DBFunctionBuilder.scala b/modules/store/src/main/scala/docspell/store/qb/impl/DBFunctionBuilder.scala index 16c3e33f..3a75569a 100644 --- a/modules/store/src/main/scala/docspell/store/qb/impl/DBFunctionBuilder.scala +++ b/modules/store/src/main/scala/docspell/store/qb/impl/DBFunctionBuilder.scala @@ -32,6 +32,10 @@ object DBFunctionBuilder extends CommonBuilder { case DBFunction.Substring(expr, start, len) => sql"SUBSTRING(" ++ SelectExprBuilder.build(expr) ++ fr" FROM $start FOR $len)" + case DBFunction.Concat(exprs) => + val inner = exprs.map(SelectExprBuilder.build).toList.reduce(_ ++ comma ++ _) + sql"CONCAT(" ++ inner ++ sql")" + case DBFunction.Calc(op, left, right) => SelectExprBuilder.build(left) ++ buildOperator(op) ++