Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: adding Kotlin examples for Working with Items #154

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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")),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is nice if you match the PrimaryKeyValue1 and PrimaryKeyValue2 to the examples 1234 and 1235 that you created with the Write operations, just for uniformity.

For a new user it will also help on the understanding.

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 "[email protected]",
),
mapOf(
"id" to "1235",
"name" to "Jane Doe",
"email" to "[email protected]",
),
)

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"))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment than the BatchGetItem.kt file, please match with the ids that are written.


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 "[email protected]",
)

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 "[email protected]",
)

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 "[email protected]",
),
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 = "[email protected]")
}
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)
}