Skip to main content

Conditional Operations

Modifying operations (Put, Delete, Update) can be performed conditionally, so that they only have an effect if some state of the DynamoDB table is true at the time of execution.

import org.scanamo._
import org.scanamo.syntax._
import org.scanamo.generic.auto._
import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType._
val client = LocalDynamoDB.syncClient()
val scanamo = Scanamo(client)
case class Gremlin(number: Int, name: String, wet: Boolean, friendly: Boolean)
val gremlinsTable = Table[Gremlin]("gremlins")
// gremlinsTable: Table[Gremlin] = Table("gremlins")
LocalDynamoDB.withTable(client)("gremlins")("number" -> N) {
val ops = for {
_ <- gremlinsTable.putAll(
Set(Gremlin(1, "Gizmo", false, true), Gremlin(2, "George", true, false)))
// Only `put` Gremlins if not already one with the same number
_ <- gremlinsTable.when(not(attributeExists("number")))
.put(Gremlin(2, "Stripe", false, true))
_ <- gremlinsTable.when(not(attributeExists("number")))
.put(Gremlin(3, "Greta", true, true))
allGremlins <- gremlinsTable.scan()
_ <- gremlinsTable.when("wet" === true)
.delete("number" === 1)
_ <- gremlinsTable.when("wet" === true)
.delete("number" === 2)
_ <- gremlinsTable.when("wet" === true)
.update("number" === 1, set("friendly", false))
_ <- gremlinsTable.when("wet" === true)
.update("number" === 3, set("friendly", false))
remainingGremlins <- gremlinsTable.scan()
} yield (allGremlins, remainingGremlins)
scanamo.exec(ops)
}
// res0: (List[Either[DynamoReadError, Gremlin]], List[Either[DynamoReadError, Gremlin]]) = (
// List(
// Right(Gremlin(2, "George", true, false)),
// Right(Gremlin(1, "Gizmo", false, true)),
// Right(Gremlin(3, "Greta", true, true))
// ),
// List(
// Right(Gremlin(1, "Gizmo", false, true)),
// Right(Gremlin(3, "Greta", true, false))
// )
// )

More examples can be found in the Table scaladoc.