マップの使用

すべてのマップ・エントリは同じ型である必要があります。マップの値の型にかかわらず、キーは常に文字列です。

文字列「[]」は予約されていて、キー名に使用することはできません。

表のフィールドをマップとして宣言する場合、MAP()文を使用します。マップ要素データ型も宣言する必要があります。

主キーがUIDで2番目のフィールドに整数のマップを持つシンプルな2つのフィールドの表を定義するには、次のDDL文を使用します。

CREATE TABLE myTable (
    uid INTEGER,
    myMap MAP(INTEGER),
    PRIMARY KEY (uid)
) 

マップ・フィールドでは、DEFAULTおよびNOT NULL制約はサポートされていません。

マップを書き込むには、Row.putMap()を使用し、これによりMapValueクラス・インスタンスが返されます。次に、マップに要素を書き込むには、MapValue.put()を使用します。

TableAPI tableH = kvstore.getTableAPI();

Table myTable = tableH.getTable("myTable");

Row row = myTable.createRow();
row.put("uid", 12345);

MapValue mv = row.putMap("myMap");
mv.put("field1", 1);
mv.put("field2", 2);
mv.put("field3", 3);

tableH.put(row, null, null); 

マップを読み込むにはRow.get().asMap()を使用します。これにより、MapValueクラス・インスタンスが返されます。次にMapValue.get()を使用してマップ値を取得できます。取得した値はFieldValueとして返され、これにより、FieldValue.asInteger()などのキャスト・メソッドを使用してカプセル化された値が取得できます。

たとえば、前述の例で作成したマップから要素を取得します。

TableAPI tableH = kvstore.getTableAPI();

Table myTable = tableH.getTable("myTable");

/* Create a primary key for user id 12345 and get a row */
PrimaryKey key = myTable.createPrimaryKey();
key.put("uid", 12345);
Row row = tableH.get(key, null);

MapValue mv = row.get("testMap").asMap();
FieldValue fv = mv.get("field3");
System.out.println("fv: " + fv.asInteger().get());