Using Embedded Records

A record entry can contain fields of differing types. However, embedded records should be used only when the data is relatively static. In general, child tables provide a better solution over embedded records, especially if the child dataset is large or is likely to change in size.

When you declare a table field as a record, you use add-record-field. This puts you into a special submode that allows you to identify the record's various fields.

To define a simple two-column table where the primary key is a UID and the second column contains a record, you use the following script:

## Enter into table creation mode
table create -name myTable
## Now add the fields
add-field -type INTEGER -name uid

## Create a record field. This puts us into a new submode.
add-record-field -name myRecord
add-field -type STRING -name firstField
add-field -type INTEGER -name secondField

### Exit array record creation mode
exit

## A primary key must be defined for every table
primary-key -field uid

## Exit table creation mode
exit

## Add the table to the store.
plan add-table -name myTable -wait 

To write the record, use Row.putRecord(), which returns a RecordValue class instance. You then use RecordValue.put() to write fields to the record:

TableAPI tableH = kvstore.getTableAPI();

Table myTable = tableH.getTable("myTable");

Row row = myTable.createRow();
row.put("uid", 12345);

Row row = myTable.createRow();
row.put("uid", "12345");
RecordValue rv = row.putRecord("myRecord");
rv.put("firstField", "An embedded record STRING field");
rv.put("secondField", 3388);

tableH.put(row, null, null); 

To read the record, use Row.get().asRecord(). This returns a RecordValue class instance. You can then use RecordValue.get() to retrieve a field from the record. The retrieved value is returned as a FieldValue, which allows you to retrieve the encapsulated value using a cast method such as FieldValue.asInteger().

For example, to retrieve field values from the embedded record created in the previous example:

TableAPI tableH = kvstore.getTableAPI();

Table myTable = tableH.getTable("myTable");

/* Create a primary key for user id 12345 and get a row */
PrimaryKey key = myTable.createPrimaryKey();
key.put("uid", 12345);
Row row = tableH.get(key, null);

RecordValue rv = row.get("myRecord").asRecord();
FieldValue fv = rv.get("firstField");
System.out.println("firstField: " + fv.asString().get());
fv = rv.get("secondField");
System.out.println("secondField: " + fv.asInteger().get());