表の索引を使用して表の行を取得するには、TableIterator
を使用します。表の主キーを使用して表の行を読み取るためにTableIterator
を使用する場合と同様に、索引を使用して読み取る場合、フィールド範囲、トラバース方向などのオプションを設定できます。デフォルトでは、索引スキャンはの順番(Direction.FORWARD
)にエントリを戻します。
この場合、PrimaryKey
インスタンスでTableIterator
を指定するのではなく、IndexKey
のインスタンスを使用します。
たとえば、次のような表を定義したとします。
CREATE TABLE myTable ( surname STRING, familiarName STRING, userID STRING, phonenumber STRING, address STRING, email STRING, dateOfBirth STRING, PRIMARY KEY (SHARD(surname, familiarName), userID) )
CREATE INDEX DoB ON myTable (dateOfBirth)
これにより、dateOfBirth
フィールドの値に基づいて表myTable
のDoB
という名前の索引が作成されます。その索引を使用して読み取るには、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); try { while (iter.hasNext()) { Row row = iter.next(); // Examine your row's fields here } } finally { if (iter != null) { iter.close(); } }
前述の例では、コードは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); try { while (iter.hasNext()) { Row row = iter.next(); // Examine your row's fields here } } finally { if (iter != null) { iter.close(); } }