Skip to content

Commit

Permalink
zio#154: Implement renderUpdate for Oracle
Browse files Browse the repository at this point in the history
  • Loading branch information
baldram committed May 28, 2022
1 parent 2e7b0c3 commit 646e8cd
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 22 deletions.
3 changes: 2 additions & 1 deletion driver/src/main/scala/zio/sql/driver/Renderer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ private[sql] object Renderer {
def apply(): Renderer = new Renderer(new StringBuilder)

implicit class Extensions(val value: String) {
def quoted: String = s"\"$value\""
def doubleQuoted: String = s"\"$value\""
def singleQuoted: String = s"'$value'"
}
}
29 changes: 16 additions & 13 deletions oracle/src/main/scala/zio/sql/oracle/OracleRenderModule.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import zio.schema.Schema
import zio.sql.driver.Renderer
import zio.sql.driver.Renderer.Extensions

import scala.collection.mutable

trait OracleRenderModule extends OracleSqlModule { self =>

override def renderDelete(delete: self.Delete[_]): String = {
Expand Down Expand Up @@ -56,16 +58,20 @@ trait OracleRenderModule extends OracleSqlModule { self =>
case Expr.Relational(left, right, op) =>
buildExpr(left, builder)
builder.append(" ").append(op.symbol).append(" ")
buildExpr(right, builder)
right.asInstanceOf[Expr[_, A, B]] match {
case Expr.Literal(true) => val _ = builder.append("1")
case Expr.Literal(false) => val _ = builder.append("0")
case otherValue => buildExpr(otherValue, builder)
}
case Expr.In(value, set) =>
buildExpr(value, builder)
buildReadString(set, builder)
case Expr.Literal(true) =>
val _ = builder.append("1")
val _ = builder.append("1 = 1")
case Expr.Literal(false) =>
val _ = builder.append("0")
val _ = builder.append("0 = 1")
case Expr.Literal(value) =>
val _ = builder.append(value.toString) // todo fix escaping
val _ = builder.append(value.toString.singleQuoted)
case Expr.AggregationCall(param, aggregation) =>
builder.append(aggregation.name.name)
builder.append("(")
Expand Down Expand Up @@ -320,7 +326,7 @@ trait OracleRenderModule extends OracleSqlModule { self =>
val _ = builder.append(" ")
}

private def buildDeleteString(delete: Delete[_], builder: StringBuilder) = {
private def buildDeleteString(delete: Delete[_], builder: mutable.StringBuilder): Unit = {
builder.append("DELETE FROM ")
buildTable(delete.table, builder)
delete.whereExpr match {
Expand All @@ -331,7 +337,6 @@ trait OracleRenderModule extends OracleSqlModule { self =>
}
}


private[oracle] object OracleRender {

def renderUpdateImpl(update: Update[_])(implicit render: Renderer): Unit =
Expand Down Expand Up @@ -362,14 +367,12 @@ trait OracleRenderModule extends OracleSqlModule { self =>

private[zio] def renderSetLhs[A, B](expr: self.Expr[_, A, B])(implicit render: Renderer): Unit =
expr match {
// TODO: to check if Oracle allows for `tableName.columnName = value` format in update statement,
// or it requires `columnName = value` instead?
case Expr.Source(_, column) =>
column.name match {
case Some(columnName) => render(columnName.quoted)
case _ => ()
case Expr.Source(table, column) =>
(table, column.name) match {
case (tableName, Some(columnName)) => val _ = render(tableName, ".", columnName)
case _ => ()
}
case _ => ()
case _ => ()
}
}
}
23 changes: 20 additions & 3 deletions oracle/src/test/scala/zio/sql/oracle/OracleSqlModuleSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,36 @@ object OracleSqlModuleSpec extends OracleRunnableSpec with ShopSchema {

import Customers._

override def specLayered = suite("Postgres module")(
override def specLayered: Spec[SqlDriver, Exception] = suite("Oracle module")(
test("Can update rows") {
/**
* UPDATE customers SET customers.first_name = 'Jaroslav'
* WHERE 1 = 1 and customers.verified = 0 and customers.verified <> 1
*/
val query =
update(customers)
.set(fName, "Jaroslav")
.where(verified isNotTrue)
.where(verified <> true) // we intentionally verify two syntax variants

assertZIO(execute(query))(equalTo(1))
},
test("Can delete from single table with a condition") {
/**
* DELETE FROM customers WHERE customers.verified = 0
*/
val query = deleteFrom(customers) where (verified isNotTrue)
println(renderDelete(query))

val expected = 1
val result = execute(query)

assertZIO(result)(equalTo(expected))
},
test("Can delete all from a single table") {
/**
* DELETE FROM customers
*/
val query = deleteFrom(customers)
println(renderDelete(query))

val expected = 4
val result = execute(query)
Expand Down
8 changes: 5 additions & 3 deletions oracle/src/test/scala/zio/sql/oracle/ShopSchema.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import zio.sql.Jdbc
trait ShopSchema extends Jdbc { self =>
import self.ColumnSet._

object Customers {
object Customers {

val customers =
(uuid("id") ++ localDate("dob") ++ string("first_name") ++ string("last_name") ++ boolean("verified"))
(uuid("id") ++ localDate("dob") ++ string("first_name") ++ string("last_name") ++
boolean("verified") ++ zonedDateTime("Created_timestamp"))
.table("customers")

val (customerId, dob, fName, lName, verified) = customers.columns
val (customerId, dob, fName, lName, verified, createdTimestamp) = customers.columns
}
object Orders {
val orders = (uuid("id") ++ uuid("customer_id") ++ localDate("order_date")).table("orders")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import scala.language.postfixOps
import zio.schema.Schema
import java.time.format.DateTimeFormatter

object PostgresModuleSpec extends PostgresRunnableSpec with DbSchema {
object PostgresSqlModuleSpec extends PostgresRunnableSpec with DbSchema {

import AggregationDef._
import Customers._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package zio.sql.sqlserver

import zio.schema.Schema
import zio.sql.driver.Renderer
import zio.sql.driver.Renderer.Extensions

trait SqlServerRenderModule extends SqlServerSqlModule { self =>

Expand Down Expand Up @@ -153,7 +154,7 @@ trait SqlServerRenderModule extends SqlServerSqlModule { self =>
.asInstanceOf[java.time.OffsetDateTime]
.format(java.time.format.DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"))
s"'$x'"
case _ => s"'${value.toString}'"
case _ => value.toString.singleQuoted
}
render(lit)
case Expr.AggregationCall(param, aggregation) =>
Expand Down

0 comments on commit 646e8cd

Please sign in to comment.