この記事について
将来的に書く予定の「JavaFX で DynamoDB Viewer作ってみた」記事の1ステップ。
結構大きな話になると思うので、少しずつ技術ポイント毎に記事を書いて、ある一定程度の要件を満たせた段階で前述まとめ記事書く予定。
第一回記事:DynamoDBの情報を読み込んでJavaFXで表示してみる
第二回記事:JavaFXで動的にテーブル列を設定する
※前回の記事が基本になってます。メソッドなど再説明していない部分があります。
今回の進捗
今回終了時のソースはこちら。Github
今回つけた機能
- localDynamoDb対応
- テーブルリスト表示
- 選択したテーブルの構造から検索条件に主キー情報を自動設定
- ついでにレコード件数とテーブルサイズも表示
- 検索条件無指定も可能に
- パーティションキーとソートキーを表の冒頭に表示
それぞれのポイント
localDynamoDb対応
各dynamoDB機能(Scan、Query)のベースとなるAbstructクラスを準備し、そのクラス中でConnectorの分岐を行う。それぞれの継承先では気にしなくて良い様に。
テーブルリスト表示
基本は公式サンプル。読み込みクラスである ListTablesRequest では検索条件が指定できなさそうなので、java側でフィルタリング。
※読み込み条件を指定できる手法が見つかったら変更予定。
選択したテーブルの構造から検索条件に主キー情報を自動設定(ついでにレコード件数とテーブルサイズも表示)
同じく公式サンプル から DescribeTable 機能を使用。
TableDescription 形式の情報が取得可能。以下の情報が解る。
- tableName:テーブル名
- tableArn:ARN
- tableStatus:ステータス
- itemCount:レコード数
- tableSizeBytes:テーブルサイズ
- provisionedThroughput:プロビジョン済みスループット
- readCapacityUnits:読み込みキャパシティ
- writeCapacityUnits:書き込みキャパシティ
- attributeDefinitions:属性定義のリスト
- keySchema:キー情報
検索条件無指定も可能
検索条件がある時はQuery、全読み込みはScanを使う
パーティションキーとソートキーを頭に表示
今回一番面倒だった部分。
DynamoDBは、RDBの様にテーブル構造が明確に定義されているわけではない。取得されるデータのフィールド順は不定。そのままだと表にした時にデータの把握がしにくい。パーティションキー、ソートキーを冒頭にセットしたい。
その為にフィールド情報を以下の情報から組み立てる必要がある。今回はキーのフィールド名とデータ型情報は最初の2つから。それ以外のフィールド名とデータ型は実データから取得するようにした。
- TableDescription.keySchema から取得できるKeySchemaElementクラス。
KeySchemaElement.keyTypeでpartitionKey(HASH)とsortKey(RANGE)が解る。
KeySchemaElement.attributeNameでフィールド名が解る。 - TableDescription.attributeDefinitions から取得できる各フィールドのAttributeDefinitionクラス。
AttributeDefinition.attributeTypeでEnumのScalarAttributeTypeクラスで文字列か数値かが解る。
AttributeDefinition.attributeNameでフィールド名が解る。
※全フィールドがある訳ではない。キーやインデックスに使用していないフィールドは無いと思われる。 - 検索結果(QueryResponse、ScanResponseのitems)から List>が取得できる。
AttributeValueにはhasSs,hasNsなどがあり、ある程度のデータ型が解る。
しかし文字型と数値型などが解らず、一旦toString
で文字列を取得後「AttributeValue(N=」で始まるかなどで判断。
次回予定
- テーブル表示内容のコピー(キー値の取得など)
- 検索結果の複数表示(タブ表示で複数テーブル検索結果切り替え)