Open6
vtlメモ
AWSのドキュメントに基本的に全部乗っているが挙動がわかりにくいのでまとめておく
$util.qr
- vtlでMapに値をセットしたい場合等に利用する
#set($testMap = {})
$util.qr($testMap.put("test", "hoge"))
## 結果(出力なし)
以下のようにすると$testMap.put("test", "hoge")の文字列が結果として出力されてしまう
#set($testMap = {})
$testMap.put("test", "hoge")
## 結果
$testMap.put("test", "hoge")
$util.dynamodb.toDynamoDB 系
- データソースをdynamoにした場合に利用する
- 要はAWS CLIで指定するような形式に置き換えをしてくれる
https://docs.aws.amazon.com/cli/latest/reference/dynamodb/query.html - 以下の例はStringだが、Number、Binary、Boolean、Null、List、Mapなども同様の関数が存在する
$util.dynamodb.toDynamoDB("foo")
$util.dynamodb.toDynamoDBJson("foo")
$util.dynamodb.toString("foo")
$util.dynamodb.toStringJson("foo")
## 結果
{S=foo}
{"S":"foo"}
{S=foo}
{"S":"foo"}
- なぜか$util.dynamodb.toStringJson以外の挙動が公式ドキュメントと違う気がしますが、Jsonが付いた場合はJSONの形式、それ以外の場合は=で表現されます。
- dynamoDBに渡す場合はJsonの形式なので、基本的にはJsonのほうを指定しておけば間違いありません
$util.dynamodb.toDynamoDB 系の追記
- toDynamoDBの場合は(おそらくJavaの)Map形式を返しています。
- そのため、$util.toJsonで囲ってあげると、$util.dynamodb.toDynamoDBJsonと等価になります。
$util.toJson($util.dynamodb.toString("foo"))
## 結果
{"S":"foo"}
$util.transform.toDynamoDBFilterExpression
- Mapの値をいい感じにexpressionに変換してくれるもの
$util.transform.toDynamoDBFilterExpression({
"title":{
"contains":"Hello World"
}
})
## 結果
{
"expression" : "contains(#title, :title_contains)"
"expressionNames" : {
"#title" : "title",
},
"expressionValues" : {
":title_contains" : { "S" : "Hello World" }
},
}
- $util.transform.toDynamoDBFilterExpressionの戻りはJSONになるので、$util.parseJsonを使えば結果のMapに変換できる(意味ないけど)
#set( $json = $util.transform.toDynamoDBFilterExpression({
"title":{
"contains":"Hello World"
}
})
)
$util.parseJson($json)
## 結果
{expression=(contains(#title,:title_contains)), expressionNames={#title=title}, expressionValues={:title_contains={S=Hello World}}}
stringを操作する
- javaなので、文字列の操作ができる
#set($hoo = "hoo")
#set($bar = "bar")
## 文字列の結合 shellっぽく{}で明示的に囲むことができる
#set($hoobar = "$hoo#${bar}")
$hoobar
## 結果
hoo#bar
- hoobarはStringクラスなので、標準メソッドが使える
#set($split = $hoobar.split("#"))
## ただし、splitの結果はArrayではなくListなので、長さを取得するにはsize()
$split.size()
$split[0]
$split[1]
## 結果
2
hoo
bar
- Listなのでループ処理ができる
#foreach($object in $split)
$object
#end
## 結果
hoo
bar
- Listなので、streamにもできる。がラムダ式、メソッド参照のどちらもVelocityの解析でエラーになる
$split.stream()
## 以下はエラーになる
## $split.stream().map(String::toUpperCase)
## $split.stream().map($item -> "stream#$item")
dynamoDBのリファレンス
vtlでTransactWriteItemsなんて書きたくないよなーという気持ちが強い。