配列の索引付け

配列にスカラー・データが含まれている、またはスカラー・フィールド付きのレコードが含まれている場合には、配列フィールドに索引を作成できます。

ノート:

別のマップまたは配列の下にネストされたマップまたは配列には索引付けできません。これができないのは、索引エントリの数が極端に多くなる可能性があるからです。

配列を索引付けすると、場合によっては各行に複数の索引エントリになり、かなり大きな索引になる可能性があります。

索引を作成するには、まず表を作成します。

CREATE TABLE myArrayTable (
    uid INTEGER,
    testArray ARRAY(STRING),
    PRIMARY KEY(uid)
) 

表がストアに追加された後、索引を作成します。[]をフィールド名とともに使用して、配列であることを示します。

CREATE INDEX arrayFieldIndex on myArrayTable (testArray[]) 

配列の場合、別の索引付けが可能な型の1つである型の値を配列に含む場合のみ、フィールドに索引付けが可能です。たとえば、整数の配列には索引を作成できます。レコードの配列にある特定のレコードにも索引を作成できます。各配列エントリに索引エントリがあると、索引のサイズが急激に増加してしまうため、索引には1つの配列のみを加えます。

配列の索引を使用してデータを取得するには、まず名前を使用して索引を取得し、索引参照の実行に使用する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();
    }
}