索引の読取り

表の索引を使用して表の行を取得するには、TableIteratorを使用します。表の主キーを使用して表の行を読み取るためにTableIteratorを使用する場合と同様に、索引を使用して読み取る場合、フィールド範囲、トラバース方向、パラレル・スキャン・オプションなどを設定できます。

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

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

## Enter into table creation mode
table create -name myTable
## Now add the fields
add-field -type STRING -name surname
add-field -type STRING -name familiarName
add-field -type STRING -name userID
add-field -type STRING -name phonenumber
add-field -type STRING -name address
add-field -type STRING -name email
add-field -type STRING -name dateOfBirth
primary-key -field surname -field familiarName -field userID 
shard-key -field surname -field familiarName
## Exit table creation mode
exit
plan add-table -name myTable -wait
plan add-index -name DoB -table myTable -field dateOfBirth -wait

これにより、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);
while (iter.hasNext()) {
    Row row = iter.next();
    // Examine your row's fields here
} 

前述の例では、コードは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);
while (iter.hasNext()) {
    Row row = iter.next();
    // Examine your row's fields here
}