package mil.nga.giat.geowave.datastore.hbase.index.secondary; import java.io.IOException; import java.util.NavigableMap; import java.util.Set; import java.util.Map.Entry; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.store.adapter.DataAdapter; import mil.nga.giat.geowave.core.store.index.SecondaryIndexUtils; import mil.nga.giat.geowave.core.store.util.SecondaryIndexEntryIteratorWrapper; /** * To be used when dealing with a 'JOIN' secondary index type */ public class HBaseSecondaryIndexJoinEntryIteratorWrapper<T> extends SecondaryIndexEntryIteratorWrapper<T, Pair<ByteArrayId, ByteArrayId>> { private final static Logger LOGGER = LoggerFactory.getLogger(HBaseSecondaryIndexJoinEntryIteratorWrapper.class); private final ResultScanner scanner; private final byte[] columnFamily; public HBaseSecondaryIndexJoinEntryIteratorWrapper( final ResultScanner scanner, final byte[] columnFamily, final DataAdapter<T> adapter ) { super( scanner.iterator(), adapter); this.scanner = scanner; this.columnFamily = columnFamily; } @Override protected Pair<ByteArrayId, ByteArrayId> decodeRow( final Object row ) { Result entry = null; try { entry = (Result) row; } catch (final ClassCastException e) { LOGGER.error("Row is not a hbase row entry."); return null; } final NavigableMap<byte[], byte[]> qualifierToValueMap = entry.getFamilyMap(columnFamily); final Set<Entry<byte[], byte[]>> entries = qualifierToValueMap.entrySet(); for (final Entry<byte[], byte[]> curr : entries) { final byte[] cq = curr.getKey(); // there will only be one entry in the map for a join index return Pair.of( SecondaryIndexUtils.getPrimaryIndexId(cq), SecondaryIndexUtils.getPrimaryRowId(cq)); } return null; } @Override public void close() throws IOException { scanner.close(); } }