索引の読取り
表の索引を使用して表の行を取得するには、TableIterator
を使用します。表の主キーを使用して表の行を読み取るためにTableIterator
を使用する場合と同様に、索引を使用して読み取る場合、フィールド範囲、トラバース方向などのオプションを設定できます。デフォルトでは、索引スキャンは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();
}
}
特定のフィールド名およびフィールド値に一致するエントリを返す場合は、IndexKey.put()
メソッドを使用します。 // Construct the IndexKey. The name we gave our index when
// we created it was 'DoB'.
Index dobIdx = myTable.getIndex("DoB");
IndexKey dobIdxKey = dobIdx.createIndexKey();
// Return only those entries with a dateOfBirth equal to
// "1991-08-23"
dobIdxKey.put("dateOfBirth", "1991-08-23");
// 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();
}
}
フィールドにNull値を含むすべてのエントリを返す場合は、IndexKey.putNull()
メソッドを使用します。 // Construct the IndexKey. The name we gave our index when
// we created it was 'DoB'.
Index dobIdx = myTable.getIndex("DoB");
IndexKey dobIdxKey = dobIdx.createIndexKey();
// Return only those entries with a NULL dateOfBirth
// value.
dobIdxKey.putNull("dateOfBirth");
// 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();
}
}