ストアで複数キー操作を行う場合、操作対象の行の範囲を指定できます。これは、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には、一般的な名前(Bob、Patricia、Robertなど)が含まれます。
この仮定で、フィールド範囲を指定して、ユーザーBob SmithとPatricia 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
}