Open6

vtlメモ

merutinmerutin

AWSのドキュメントに基本的に全部乗っているが挙動がわかりにくいのでまとめておく
https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/resolver-util-reference.html

$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 系

$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のほうを指定しておけば間違いありません
merutinmerutin

$util.dynamodb.toDynamoDB 系の追記

  • toDynamoDBの場合は(おそらくJavaの)Map形式を返しています。
  • そのため、$util.toJsonで囲ってあげると、$util.dynamodb.toDynamoDBJsonと等価になります。
$util.toJson($util.dynamodb.toString("foo"))

## 結果
{"S":"foo"}
merutinmerutin

$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}}}
merutinmerutin

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")
merutinmerutin

vtlでTransactWriteItemsなんて書きたくないよなーという気持ちが強い。