索引の読取り

表の索引を使用して表の行を取得するには、TableIteratorを使用します。表の主キーを使用して表の行を読み取るためにTableIteratorを使用する場合と同様に、索引を使用して読み取る場合、フィールド範囲、トラバース方向などのオプションを設定できます。デフォルトでは、索引スキャンはの順番(Direction.FORWARD)にエントリを戻します。

この場合、PrimaryKeyインスタンスでTableIteratorを指定するのではなく、IndexKeyのインスタンスを使用します。

たとえば、次のような表を定義したとします。

CREATE TABLE myTable (
    surname STRING,
    familiarName STRING,
    userID STRING,
    phonenumber STRING,
    address STRING,
    email STRING,
    dateOfBirth STRING,
    PRIMARY KEY (SHARD(surname, familiarName), userID)
) 
CREATE INDEX DoB ON myTable (dateOfBirth) 

これにより、dateOfBirthフィールドの値に基づいて表myTableDoBという名前の索引が作成されます。その索引を使用して読み取るには、Table.getIndex()を使用してDobという名前の索引を取得します。次に、IndexオブジェクトからIndexKeyを作成します。次に例を示します。

package kvstore.basicExample;

...

import oracle.kv.KVStore;
import oracle.kv.table.Index;
import oracle.kv.table.IndexKey;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;
import oracle.kv.table.TableIterator;

...

// KVStore handle creation is omitted for brevity

...

TableAPI tableH = kvstore.getTableAPI();

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

// Construct the IndexKey. The name we gave our index when 
// we created it was 'DoB'.
Index dobIdx = myTable.getIndex("DoB");
IndexKey dobIdxKey = dobIdx.createIndexKey();

// Exception handling is omitted, but in production code
// ConsistencyException, RequestTimeException, and FaultException
// would have to be handled.
TableIterator<Row> iter = tableH.tableIterator(dobIdxKey, null, null);
try {
    while (iter.hasNext()) {
        Row row = iter.next();
        // Examine your row's fields here
    } 
} finally {
    if (iter != null) {
        iter.close(); 
    }
}

前述の例では、コードはDoB索引で索引付けされたすべての行を調べます。さらに便利なことに、この場合の例では、フィールド範囲の使用によって返される行を制限することになります。これを実行するには、Index.createFieldRange()を使用してFieldRangeオブジェクトを作成します。その時点で、範囲の基になるフィールドを指定する必要があります。索引は複数の表フィールドに基づくことができるため、メソッドを指定するフィールド名は索引付けされたフィールドの1つである必要があります。

たとえば、行がyyyy-mm-ddの形式で日付を保持している場合、次のように1994年5月に生まれたすべての人を取得できます。この索引は1つのフィールド(dateOfBirth)のみを調べるため、そのフィールド名にIndex.createFieldRange()を指定します。

package kvstore.basicExample;

...

import oracle.kv.KVStore;
import oracle.kv.table.FieldRange;
import oracle.kv.table.Index;
import oracle.kv.table.IndexKey;
import oracle.kv.table.MultiRowOption;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;
import oracle.kv.table.TableIterator;

...

// KVStore handle creation is omitted for brevity

...

TableAPI tableH = kvstore.getTableAPI();

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

// Construct the IndexKey. The name we gave our index when 
// we created it was 'DoB'.
Index dobIdx = myTable.getIndex("DoB");
IndexKey dobIdxKey = dobIdx.createIndexKey();

// Create the field range.
FieldRange fh = dobIdx.createFieldRange("dateOfBirth");
fh.setStart("1994-05-01", true);
fh.setEnd("1994-05-30", true);
MultiRowOptions mro = fh.createMultiRowOptions();

// Exception handling is omitted, but in production code
// ConsistencyException, RequestTimeException, and FaultException
// would have to be handled.
TableIterator<Row> iter = tableH.tableIterator(dobIdxKey, mro, null);
try {
    while (iter.hasNext()) {
        Row row = iter.next();
        // Examine your row's fields here
    } 
} finally {
    if (iter != null) {
        iter.close(); 
    }
}