aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala b/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
index 0daa84d..dc03a52 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/db/SlickQueryBuilder.scala
@@ -1,6 +1,6 @@
package xyz.driver.pdsuicommon.db
-import java.sql.PreparedStatement
+import java.sql.{JDBCType, PreparedStatement}
import java.time.LocalDateTime
import slick.jdbc.{JdbcProfile, PositionedParameters, SQLActionBuilder, SetParameter}
@@ -38,6 +38,12 @@ object SlickQueryBuilder {
})
}
}
+
+ implicit object SetQueryParameter extends SetParameter[AnyRef] {
+ def apply(v: AnyRef, pp: PositionedParameters) = {
+ pp.setObject(v, JDBCType.BINARY.getVendorTypeNumber)
+ }
+ }
}
final case class SlickTableLink(keyColumnName: String, foreignTableName: String, foreignKeyColumnName: String)
@@ -175,6 +181,16 @@ sealed trait SlickQueryBuilderParameters {
} else sql
}
+ def concatenateParameters(sql: SQLActionBuilder, first: Boolean, tail: Seq[AnyRef]): SQLActionBuilder = {
+ if (tail.nonEmpty) {
+ if (!first) {
+ concatenateParameters(sql concat sql""",${tail.head}""", false, tail.tail)
+ } else {
+ concatenateParameters(sql"""(${tail.head}""", false, tail.tail)
+ }
+ } else sql concat sql")"
+ }
+
filter match {
case x if isEmpty(x) =>
sql""
@@ -196,7 +212,7 @@ sealed trait SlickQueryBuilderParameters {
// So, to handle NotEq for nullable fields we need to use more complex SQL expression.
// http://dev.mysql.com/doc/refman/5.7/en/working-with-null.html
val escapedColumn = escapeDimension(dimension)
- sql"(#${escapedColumn} is null or #${escapedColumn} != ${value.toString})"
+ sql"(#${escapedColumn} is null or #${escapedColumn} != $value)"
case Atom.Binary(dimension, op, value) =>
val operator = op match {
@@ -208,7 +224,7 @@ sealed trait SlickQueryBuilderParameters {
case Lt => sql"<"
case LtEq => sql"<="
}
- sql"#${escapeDimension(dimension)}" concat operator concat sql"""${value.toString}"""
+ sql"#${escapeDimension(dimension)}" concat operator concat sql"""$value"""
case Atom.NAry(dimension, op, values) =>
val sqlOp = op match {
@@ -217,8 +233,7 @@ sealed trait SlickQueryBuilderParameters {
}
val formattedValues = if (values.nonEmpty) {
- val condition = s"(${values.map(v => "'" + v.toString + "'").mkString(",")})"
- sql"#${condition}"
+ concatenateParameters(sql"", true, values)
} else sql"NULL"
sql"#${escapeDimension(dimension)}" concat sqlOp concat formattedValues