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