DynamoDBでPartiQLをjavaSDKで実行してみる。

# この記事について

将来的に書く予定の「JavaFX で DynamoDB Viewer作ってみた」記事の１ステップ。
結構大きな話になると思うので、少しずつ技術ポイント毎に記事を書いて、ある一定程度の要件を満たせた段階で前述まとめ記事書く予定。

第一回記事：[DynamoDBの情報を読み込んでJavaFXで表示してみる](https://qiita.com/silverbox/items/eba824a9f003df67181e)
第二回記事：[JavaFXで動的にテーブル列を設定する](https://qiita.com/silverbox/items/904a01d561014d800696)
第三回記事：[AWS java SDKでDynamoDBテーブル情報を取得してみる](https://qiita.com/silverbox/items/3caefb782f1bb269490f)
第四回記事：[JavaFX の TableView の選択範囲をクリップボードにコピーする。](https://qiita.com/silverbox/items/19e131bd3da02940a8c1)
第五回記事：[JavaFX でコンポーネント作って動的生成してみる](https://qiita.com/silverbox/items/3128fd2128374e11c1f7)
第六回記事：[DynamoDBのデータ型をjava SDKから把握してみる。](https://qiita.com/silverbox/items/3a434ec4a85262f973c9)
第七回記事：[JavaFXでジェネリック使って入力ダイアログ作成してみる](https://qiita.com/silverbox/items/bb3cee5a328ccc63246c)
第八回記事：[JavaFXで各種サイズ制御](https://qiita.com/silverbox/items/17b7982683be06c32240)
第九回記事：[JavaFXのDialogで入力値チェック制御](https://qiita.com/silverbox/items/ad7542db5d34a442dce5)

※これまでの記事が基本になってます。メソッドなど細かい部分で再説明していない部分があります。不明点などありましたらコメントなど頂けたら対応しようと思います。


# 今回の追加機能

PartiQL対応
DynamoDBのレコード更新時、確認メッセージを出すように
表のカラム幅を最大1000に

# 現在の進捗
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530376/053f9b19-4ab4-c137-051c-4e74fa80e8f0.png)
[この時点でのソース(github)](https://github.com/silverbox/dynamodbtool/tree/11th-complexquery)

# 今回の記事の背景

前回までの状態では、データ読み込みは一括読み込みか、プライマリーキーを１つだけ指定して読み込むという事のみ。実際のデータ取得では、複数のデータを指定して読み込む事を行いたい。
SQLライクに問い合わせ可能な [PartiQL](https://partiql.org/) を[AWSがサポートした](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ql-reference.html)という話を聞いた。
確かにJavaSDKのページ [Interface DynamoDbClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/DynamoDbClient.html) を見てみると、PartiQLの文字が見える。が、[SDKの使用サンプルページ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/example_code/dynamodb/src/main/java/com/example/dynamodb)は更新されていない様子。
待っていればサンプルも充実すると思うが、ここはチャレンジしておきたい。

# 前準備

前述のSDKページからすると、現時点でのsoftware.amazon.awssdk最新バージョンは2.16.23らしいので（2021-03-20時点）、pomのバージョンを変更しておく。

## SDKページ確認

基本的な問い合わせが出来そうなSDKページの[executeStatement](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/DynamoDbClient.html#executeStatement-software.amazon.awssdk.services.dynamodb.model.ExecuteStatementRequest-)部分を見る。ちゃんとPartQLが使えると書いてある。

### DynamoDbClient#executeStatement

多分一番基本的な問い合わせ。引数に[Class ExecuteStatementRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/model/ExecuteStatementRequest.html) を指定するらしい。

### テストしてみる。
そして、ちょっとEclipseのコード補完を頼りにやってみたらあっさり出来た。

```java
	String partiQLString = "select * from hogehoge_table";
	DynamoDbClient dbclient = DynamoDbClient.builder().region(Region.AP_NORTHEAST_1).build();
	ExecuteStatementRequest executeStatementRequest = ExecuteStatementRequest.builder().statement(partiQLString).build();
	ExecuteStatementResponse executeStatementResponse = dbclient.executeStatement(executeStatementRequest);
	List<Map<String, AttributeValue>> items = executeStatementResponse.items();
```

もうちょっと苦労するかと思っていたが、ちょっと拍子抜け。もちろんRDBのSQLの様な好き勝手は出来ず、基本的にはDynamoDBの読み込みで可能な範囲のみ出来る。例：キー属性出ないとwhere句に指定できない。しかし、キー値でin句が使えるのは個人的には嬉しい。

# 次回予定

csv、json形式などでのファイル出力

# 累積残課題

- 変更ダイアログで取り消しボタンでもチェックが走ってしまう
- 新要素を追加した時、テーブルに列が追加されない

# 参考にさせて頂いたページ

## 公式ページ

[Interface DynamoDbClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/DynamoDbClient.html)
[executeStatement](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/DynamoDbClient.html#executeStatement-software.amazon.awssdk.services.dynamodb.model.ExecuteStatementRequest-)
[Class ExecuteStatementRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/model/ExecuteStatementRequest.html)