final HBaseTableFactory tableFactory, final IdGenerator idGenerator)
throws IndexNotFoundException, IOException, InterruptedException {
this.serializationUtil = new DerefMapSerializationUtil(idGenerator);
final IndexManager indexManager = new IndexManager(hbaseConfiguration, tableFactory);
IndexDefinition forwardIndexDef = new IndexDefinition(forwardIndexName(indexName));
// For the record ID we use a variable length byte array field of which the first two bytes are fixed length
// The first byte is actually the record identifier byte.
// The second byte really is the first byte of the record id. We put this in the fixed length part
// (safely because a record id should at least be a single byte long) because this prevents BCD encoding
// on the first byte, thus making it easier to configure table splitting based on the original input.
forwardIndexDef.addVariableLengthByteField("dependant_recordid", 2);
forwardIndexDef.addByteField("dependant_vtag", DerefMapSerializationUtil.SCHEMA_ID_BYTE_LENGTH);
forwardDerefIndex = indexManager.getIndex(owningRepoName, forwardIndexDef);
IndexDefinition backwardIndexDef = new IndexDefinition(backwardIndexName(indexName));
// Same remark as in the forward index.
backwardIndexDef.addVariableLengthByteField("dependency_masterrecordid", 2);
backwardIndexDef.addByteField("dependant_vtag", DerefMapSerializationUtil.SCHEMA_ID_BYTE_LENGTH);
backwardIndexDef.addVariableLengthByteField("variant_properties_pattern");
backwardDerefIndex = indexManager.getIndex(owningRepoName, backwardIndexDef);
}