From 3e28ce1254202f74da9b80953ae3e416bf666178 Mon Sep 17 00:00:00 2001
From: Eike Kettner <eike.kettner@posteo.de>
Date: Mon, 18 Jan 2021 21:48:05 +0100
Subject: [PATCH] Add the sql concat function to query builder

---
 .../store/src/main/scala/docspell/store/qb/DBFunction.scala   | 4 ++++
 modules/store/src/main/scala/docspell/store/qb/DSL.scala      | 3 +++
 .../main/scala/docspell/store/qb/impl/DBFunctionBuilder.scala | 4 ++++
 3 files changed, 11 insertions(+)

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) ++