Skip to content

Commit

Permalink
feat: adding Kotlin examples for Working with Items
Browse files Browse the repository at this point in the history
  • Loading branch information
plastic-karma authored and Benni Rogge committed Oct 9, 2024
1 parent a853f95 commit f06815e
Show file tree
Hide file tree
Showing 12 changed files with 384 additions and 0 deletions.
Empty file.
16 changes: 16 additions & 0 deletions examples/SDK/kotlin/data_plane/WorkingWithItems/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
plugins {
kotlin("jvm") version "1.9.10"
}

repositories {
mavenCentral()
}

dependencies {
implementation(kotlin("stdlib"))
implementation("aws.sdk.kotlin:dynamodb:1.0.0")
}

kotlin {
jvmToolchain(17)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.batchGetItem
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.model.KeysAndAttributes

suspend fun batchGetItem(
tableName: String,
keys: List<Map<String, AttributeValue.S>>,
) {
DynamoDbClient { region = "us-west-2" }.use { ddb ->
val response =
ddb.batchGetItem {
this.requestItems =
mapOf(
tableName to
KeysAndAttributes {
this.keys = keys
},
)
}

response.responses?.forEach { (tableName, items) ->
println("Items from table $tableName:")
items.forEach { item ->
println(item)
}
}

response.unprocessedKeys?.let { unprocessedKeys ->
if (unprocessedKeys.isNotEmpty()) {
println("Unprocessed keys:")
println(unprocessedKeys)
}
}
}
}

suspend fun main() {
val tableName = "YourTableName"
val keys =
listOf(
mapOf("PrimaryKey" to AttributeValue.S("YourPrimaryKeyValue1")),
mapOf("PrimaryKey" to AttributeValue.S("YourPrimaryKeyValue2")),
)

batchGetItem(tableName, keys)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.batchWriteItem
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.model.PutRequest
import aws.sdk.kotlin.services.dynamodb.model.WriteRequest

suspend fun batchWriteItem(
tableName: String,
items: List<Map<String, String>>,
) {
DynamoDbClient { region = "us-west-2" }.use { ddb ->

val putRequests =
items.map { item ->
val itemValues = item.mapValues { (_, value) -> AttributeValue.S(value) }
WriteRequest {
this.putRequest =
PutRequest {
this.item = itemValues
}
}
}

val response =
ddb.batchWriteItem {
this.requestItems =
mapOf(
tableName to putRequests,
)
}

response.unprocessedItems?.let { unprocessedKeys ->
if (unprocessedKeys.isNotEmpty()) {
println("Unprocessed keys:")
println(unprocessedKeys)
}
}
}
}

suspend fun main() {
val tableName = "YourTableName"
val items =
listOf(
mapOf(
"id" to "1234",
"name" to "John Doe",
"email" to "john.doe@example.com",
),
mapOf(
"id" to "1235",
"name" to "Jane Doe",
"email" to "jane.doe@example.com",
),
)

batchWriteItem(tableName, items)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.deleteItem
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue

suspend fun deleteItem(
tableName: String,
key: Map<String, AttributeValue>,
) {
DynamoDbClient { region = "us-west-2" }.use { ddb ->
ddb.deleteItem {
this.tableName = tableName
this.key = key
}
println("Deleted item with the given key.")
}
}

suspend fun main() {
val tableName = "YourTableName"
val key = mapOf("PrimaryKey" to AttributeValue.S("YourPrimaryKeyValue"))

deleteItem(tableName, key)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.getItem
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue

suspend fun getItem(
tableName: String,
key: Map<String, AttributeValue>,
) {
DynamoDbClient { region = "us-west-2" }.use { ddb ->
val response =
ddb.getItem {
this.tableName = tableName
this.key = key
}

response.item?.let {
println("Item: $it")
} ?: println("No item found with the given key.")
}
}

suspend fun main() {
val tableName = "YourTableName"
val key = mapOf("PrimaryKey" to AttributeValue.S("YourPrimaryKeyValue"))

getItem(tableName, key)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.putItem

suspend fun putItem(
tableName: String,
item: Map<String, String>,
) {
val itemValues = item.mapValues { (_, value) -> AttributeValue.S(value) }

DynamoDbClient { region = "us-west-2" }.use { dynamoDb ->
dynamoDb.putItem {
this.tableName = tableName
this.item = itemValues
}
println("Item successfully added to table $tableName")
}
}

suspend fun main() {
val tableName = "YourTableName"
val item =
mapOf(
"id" to "1234",
"name" to "John Doe",
"email" to "john.doe@example.com",
)

putItem(tableName, item)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.putItem

suspend fun putItemConditional(
tableName: String,
item: Map<String, String>,
) {
val itemValues = item.mapValues { (_, value) -> AttributeValue.S(value) }

DynamoDbClient { region = "us-west-2" }.use { dynamoDb ->
dynamoDb.putItem {
this.tableName = tableName
this.item = itemValues
this.conditionExpression = "attribute_not_exists(id)"
}
println("Item successfully added to table $tableName")
}
}

suspend fun main() {
val tableName = "YourTableName"
val item =
mapOf(
"id" to "1234",
"name" to "John Doe",
"email" to "john.doe@example.com",
)

putItemConditional(tableName, item)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.model.Get
import aws.sdk.kotlin.services.dynamodb.model.TransactGetItem
import aws.sdk.kotlin.services.dynamodb.transactGetItems

suspend fun transactGetItem(requestsPerTable: Map<String, Map<String, AttributeValue.S>>) {
DynamoDbClient { region = "us-west-2" }.use { ddb ->
val response =
ddb.transactGetItems {
this.transactItems =
requestsPerTable.map { (table, requests) ->
TransactGetItem {
this.get =
Get {
this.tableName = table
this.key = requests
}
}
}
}

response.responses?.forEach {
println("found item $it")
}
}
}

suspend fun main() {
val tableName1 = "YourTableName"
val tableName2 = "YourTableName2"
val requests =
mapOf(
tableName1 to mapOf("PrimaryKey1" to AttributeValue.S("YourPrimaryKeyValue1")),
tableName2 to mapOf("PrimaryKey2" to AttributeValue.S("YourPrimaryKeyValue2")),
)
transactGetItem(requests)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.model.TransactWriteItem
import aws.sdk.kotlin.services.dynamodb.transactWriteItems

suspend fun transactPutItem(requestsPerTable: Map<String, Map<String, String>>) {
DynamoDbClient { region = "us-west-2" }.use { ddb ->
ddb.transactWriteItems {
this.transactItems =
requestsPerTable.map { (table, requests) ->
TransactWriteItem {
this.put {
this.tableName = table
this.item = requests.mapValues { (_, value) -> AttributeValue.S(value) }
}
}
}
}
}
}

suspend fun main() {
val tableName1 = "YourTableName"
val tableName2 = "YourTableName2"

val requests =
mapOf(
tableName1 to
mapOf(
"id" to "1234",
"name" to "John Doe",
"email" to "john.doe@example.com",
),
tableName2 to
mapOf(
"order" to "5678",
"customer" to "1234",
),
)
transactPutItem(requests)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.AttributeAction
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.model.AttributeValueUpdate
import aws.sdk.kotlin.services.dynamodb.model.UpdateItemRequest
import aws.sdk.kotlin.services.dynamodb.updateItem

suspend fun updateItem(
tableName: String,
id: String,
newEmail: String,
) {
DynamoDbClient { region = "us-west-2" }.use { dynamoDb ->
dynamoDb.updateItem {
UpdateItemRequest {
this.tableName = tableName
this.key = mapOf("PrimaryKey" to AttributeValue.S(id))
this.attributeUpdates =
mapOf(
"email" to
AttributeValueUpdate {
this.action = AttributeAction.Put
this.value = AttributeValue.S(newEmail)
},
)
}
}
println("Item updated")
}
}

suspend fun main() {
val tableName = "YourTableName"
updateItem(tableName, id = "1234", newEmail = "new@example.com")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.AttributeValue
import aws.sdk.kotlin.services.dynamodb.model.UpdateItemRequest
import aws.sdk.kotlin.services.dynamodb.updateItem

suspend fun updateItemConditional(
tableName: String,
id: String,
newPrice: Long,
) {
DynamoDbClient { region = "us-west-2" }.use { dynamoDb ->
val updateExpression = "SET #attr = :val"
val conditionExpression = "#attr < :threshold"
val expressionAttributeNames = mapOf("#attr" to "price")
val expressionAttributeValues =
mapOf(
":val" to AttributeValue.N(newPrice.toString()),
":threshold" to AttributeValue.N("5000"),
)

dynamoDb.updateItem {
UpdateItemRequest {
this.tableName = tableName
this.key = mapOf("PrimaryKey" to AttributeValue.S(id))
this.conditionExpression = conditionExpression
this.updateExpression = updateExpression
this.expressionAttributeNames = expressionAttributeNames
this.expressionAttributeValues = expressionAttributeValues
}
}
println("Item updated")
}
}

suspend fun main() {
val tableName = "YourTableName"
updateItemConditional(tableName, id = "product_id_1", newPrice = 500)
}

0 comments on commit f06815e

Please sign in to comment.