You use TableIterator
to retrieve table
rows using a table's indexes. Just as when you use
TableIterator
to read table rows using a
table's primary key(s), when reading using indexes you can set
options such as field ranges, traversal direction, and so
forth. By default, index scans return entries in order
(Direction.FORWARD
).
In this case, rather than provide TableIterator
with a PrimaryKey
instance, you use an
instance of IndexKey
.
For example, suppose you defined a table like this:
## 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 plan add-table -name myTable -wait plan add-index -name DoB -table myTable -field dateOfBirth -wait
This creates an index named DoB
for table
myTable
based on the value of the
dateOfBirth
field. To read using that index,
you use Table.getIndex()
to retrieve
the index named Dob
. You then create an
IndexKey
from the
Index
object. For example:
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(); } }
In the previous example, the code examines every row indexed by the
DoB
index. A more likely, and useful, example in
this case would be to limit the rows returned through the use of a
field range. You do that by using
Index.createFieldRange()
to create a
FieldRange
object. At that time, you must
specify the field to base the range on. Recall that an index can be
based on more than one table field, so the field name you give the
method must be one of the indexed fields.
For example, if the rows hold dates in the form of
yyyy-mm-dd
, you could retrieve all the people
born in the month of May, 1994 in the following way. This index
only examines one field, dateOfBirth
, so we give
that field name to
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(); } }