フィールド範囲の指定

ストアで複数キー操作を行う場合、操作対象の行の範囲を指定できます。これは、FieldRangeクラスを使用して行います。このクラスは、一括読取りを行うすべてのメソッドに受け入れられます。このクラスは、選択した行をフィールド値の一致する範囲に制限するために使用されます。

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

## 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

surnameには、個人の姓(Smithなど)が含まれます。familiarNameには、一般的な名前(BobPatriciaRobertなど)が含まれます。

この仮定で、フィールド範囲を指定して、ユーザーBob SmithPatricia Smithに関連するすべての行に対する操作を行うとします。

FieldRangeクラス・インスタンスは、Table.createFieldRange()を使用して作成されます。このメソッドは、1つの引数(範囲を設定する主キーの名前)のみを取ります。FieldRangeオブジェクトがある場合、範囲の開始値と終了値を設定できます。範囲値がその範囲を含むかどうかも指定します。

このケースでは、文字列"Bob"を使用してキー範囲の始まりを定義し、キー範囲の終わりを"Patricia"と定義します。キー範囲の両端は含まれます。

この例ではTableIteratorを使用しますが、TableAPI.multiGet()TableAPI.multiGetKeys()など、複数行の読取り操作でも同様にこの範囲を簡単に使用できます。FieldRangeオブジェクトは、MultiRowOptionsクラス・インスタンスを使用してこれらのメソッドに渡されます。このクラス・インスタンスは、FieldRange.createMultiRowOptions()メソッドを使用して作成します。

package kvstore.basicExample;

...

import oracle.kv.KVStore;
import oracle.kv.table.FieldRange;
import oracle.kv.table.MultiRowOptions;
import oracle.kv.table.PrimaryKey;
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();

// The name you give to getTable() must be identical
// to the name that you gave the table when you created
// the table using the CLI's 'table create' command.
Table myTable = tableH.getTable("myTable");

// Construct the PrimaryKey. In this case, we are
// using a partial primary key.
PrimaryKey key = myTable.createPrimaryKey();
key.put("surname", "Smith");

// Create the field range.
FieldRange fh = myTable.createFieldRange("familiarName");
fh.setStart("Bob", true);
fh.setEnd("Patricia", 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(key, mro, null);
while (iter.hasNext()) {
    Row row = iter.next();
    // Examine your row's fields here
}