フィールド範囲の指定
ストアで複数キー操作を行う場合、操作対象の行の範囲を指定できます。これは、FieldRange
クラスを使用して行います。このクラスは、一括読取りを行うすべてのメソッドに受け入れられます。このクラスは、選択した行をフィールド値の一致する範囲に制限するために使用されます。
たとえば、次のような表を定義したとします。
CREATE TABLE myTable (
surname STRING,
familiarName STRING,
userID STRING,
phonenumber STRING,
address STRING,
email STRING,
dateOfBirth STRING,
PRIMARY KEY (SHARD(surname, familiarName), userID)
)
surname
には、個人の姓(Smith
など)が含まれます。familiarName
には、一般的な名前(Bob
、Patricia
、Robert
など)が含まれます。
このとき、surnameがSmith
のユーザーに関連するすべての行に操作を実行できますが、フィールド範囲を指定して、familiarNameがアルファベット順でBob
からPatricia
までに含まれるユーザーのみに結果セットを制限することもできます。
FieldRange
は、Table.createFieldRange()
を使用して作成されます。このメソッドは、1つの引数(範囲を設定する主キーの名前)のみを取ります。
このケースでは、文字列"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 CREATE TABLE DDL statement.
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);
try {
while (iter.hasNext()) {
Row row = iter.next();
// Examine your row's fields here
}
} finally {
if (iter != null) {
iter.close();
}
}