final PersistentDataset<CommonIndexValue> indexData = new PersistentDataset<CommonIndexValue>();
final PersistentDataset<Object> extendedData = new PersistentDataset<Object>();
// for now we are assuming all entries in a row are of the same type
// and use the same adapter
boolean adapterMatchVerified;
ByteArrayId adapterId;
if (adapter != null) {
adapterId = adapter.getAdapterId();
adapterMatchVerified = false;
}
else {
adapterMatchVerified = true;
adapterId = null;
}
final List<FieldInfo> fieldInfoList = new ArrayList<FieldInfo>(
rowMapping.size());
for (final Entry<Key, Value> entry : rowMapping.entrySet()) {
// the column family is the data element's type ID
if (adapterId == null) {
adapterId = new ByteArrayId(
entry.getKey().getColumnFamilyData().getBackingArray());
}
if (adapter == null) {
adapter = (DataAdapter<T>) adapterStore.getAdapter(adapterId);
if (adapter == null) {
LOGGER.error("DataAdapter does not exist");
return null;
}
}
if (!adapterMatchVerified) {
if (!adapterId.equals(adapter.getAdapterId())) {
return null;
}
adapterMatchVerified = true;
}
final ByteArrayId fieldId = new ByteArrayId(
entry.getKey().getColumnQualifierData().getBackingArray());
// first check if this field is part of the index model
final FieldReader<? extends CommonIndexValue> indexFieldReader = index.getIndexModel().getReader(
fieldId);
final byte byteValue[] = entry.getValue().get();
if (indexFieldReader != null) {
final CommonIndexValue indexValue = indexFieldReader.readField(byteValue);
indexValue.setVisibility(entry.getKey().getColumnVisibilityData().getBackingArray());
final PersistentValue<CommonIndexValue> val = new PersistentValue<CommonIndexValue>(
fieldId,
indexValue);
indexData.addValue(val);
fieldInfoList.add(getFieldInfo(
val,
byteValue,
indexValue.getVisibility()));
}
else {
// next check if this field is part of the adapter's
// extended data model
final FieldReader<?> extFieldReader = adapter.getReader(fieldId);
if (extFieldReader == null) {
// if it still isn't resolved, log an error, and
// continue
LOGGER.error("field reader not found for data entry, the value will be ignored");
continue;
}
final Object value = extFieldReader.readField(byteValue);
final PersistentValue<Object> val = new PersistentValue<Object>(
fieldId,
value);
extendedData.addValue(val);
fieldInfoList.add(getFieldInfo(
val,
byteValue,
entry.getKey().getColumnVisibility().getBytes()));
}
}
final IndexedAdapterPersistenceEncoding encodedRow = new IndexedAdapterPersistenceEncoding(
adapterId,
new ByteArrayId(
rowId.getDataId()),
new ByteArrayId(
rowId.getIndexId()),
rowId.getNumberOfDuplicates(),
indexData,
extendedData);
if ((clientFilter == null) || clientFilter.accept(encodedRow)) {
// cannot get here unless adapter is found (not null)
return Pair.of(
adapter.decode(
encodedRow,
index),
new IngestEntryInfo(
Arrays.asList(new ByteArrayId(
k.getRowData().getBackingArray())),
fieldInfoList));
}
return null;
}