private <T> void searchIndex(TxnId txnId, IMetadataIndex index, ITupleReference searchKey,
IValueExtractor<T> valueExtractor, List<T> results)
throws AlgebricksException, HyracksDataException, RemoteException {
IBinaryComparatorFactory[] comparatorFactories = index.getKeyBinaryComparatorFactory();
if (index.getFile() == null) {
throw new AlgebricksException("No file for Index " + index.getDataverseName() + "." + index.getIndexName());
}
String resourceName = index.getFile().getRelativePath();
IIndex indexInstance = datasetLifecycleManager.get(resourceName);
datasetLifecycleManager.open(resourceName);
IIndexAccessor indexAccessor = indexInstance.createAccessor(NoOpIndexAccessParameters.INSTANCE);
try {
IBinaryComparator[] searchCmps = null;
MultiComparator searchCmp = null;
if (searchKey != null) {
searchCmps = new IBinaryComparator[searchKey.getFieldCount()];
for (int i = 0; i < searchKey.getFieldCount(); i++) {
searchCmps[i] = comparatorFactories[i].createBinaryComparator();
}
searchCmp = new MultiComparator(searchCmps);
}
RangePredicate rangePred = new RangePredicate(searchKey, searchKey, true, true, searchCmp, searchCmp);
search(indexAccessor, rangePred, results, valueExtractor, txnId);
} finally {
indexAccessor.destroy();
}
datasetLifecycleManager.close(resourceName);
}