配列の索引付け
配列フィールド(または別の配列内にネストされた配列のフィールド)には索引を作成できます。
配列を索引付けすると、場合によっては各行に複数の索引エントリになり、かなり大きな索引になる可能性があります。
索引を作成するには、まず表を作成します。
CREATE TABLE myArrayTable (
uid INTEGER,
testArray ARRAY(STRING),
PRIMARY KEY(uid)
)
表がストアに追加された後、索引を作成します。[]
をフィールド名とともに使用して、配列であることを示します。
CREATE INDEX arrayFieldIndex on myArrayTable (testArray[])
配列の場合、別の索引付けが可能な型の1つである型の値を配列に含む場合のみ、フィールドに索引付けが可能です。
配列の索引は複数キー索引です。索引は、表のデータ行ごとに索引に複数のエントリが作成される場合、複数キー索引と呼ばれます。複数キー索引には、[]
ステップを使用する少なくとも1つの索引パスがあります。このような索引パスはすべて、複数キー索引パスと呼ばれます。
複数キー索引では、表の行ごとに、索引付けされる配列のすべての要素に対して索引エントリが作成されます。評価で空の結果が返された場合は、特別な値EMPTYが索引エントリとして使用されます。重複する索引エントリは削除されます。
配列の索引を使用してデータを取得するには、まず名前を使用して索引を取得し、索引参照の実行に使用するIndexKey
のインスタンスを作成します。
Index arrayIndex = myTable.getIndex("arrayFieldIndex");
IndexKey indexKey = arrayIndex.createIndexKey();
次に、IndexKey.put()
メソッドを使用して作成したIndexKey
に配列フィールド名とその値を割り当てます。
indexKey.put("testArray[]", "One");
索引参照を実行するとき、返されるレコードはIndexKey
オブジェクトに設定される値と一致する項目が少なくとも1つはある配列を含むレコードのみです。たとえば、次のような配列を持つ個々のレコードを持っている場合、
Record 1: ["One," "Two", "Three"]
Record 2: ["Two", "Three", "One"]
Record 3: ["One", "Three", "One"]
Record 4: ["Two", "Three", "Four"]
配列値「One」で配列参照を実行すると、1から3のレコードは戻されますが、4は戻されません。
その後、一致する表の行を取得し、別の索引タイプと同じ方法で繰り返します。たとえば:
TableIterator<Row> iter = tableH.tableIterator(indexKey, null, null);
System.out.println("Results for Array value 'One' : ");
try {
while (iter.hasNext()) {
Row rowRet = iter.next();
int uid = rowRet.get("uid").asInteger().get();
System.out.println("uid: " + uid);
ArrayValue avRet = rowRet.get("testArray").asArray();
for (FieldValue fv: avRet.toList()) {
System.out.println(fv.asString().get());
}
}
} finally {
if (iter != null) {
iter.close();
}
}