package mil.nga.giat.geowave.datastore.accumulo.index.secondary; import java.io.IOException; import java.util.Map.Entry; import org.apache.accumulo.core.client.Scanner; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Value; import org.apache.commons.lang3.tuple.Pair; 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 AccumuloSecondaryIndexJoinEntryIteratorWrapper<T> extends SecondaryIndexEntryIteratorWrapper<T, Pair<ByteArrayId, ByteArrayId>> { private final static Logger LOGGER = LoggerFactory.getLogger(AccumuloSecondaryIndexJoinEntryIteratorWrapper.class); private final Scanner scanner; public AccumuloSecondaryIndexJoinEntryIteratorWrapper( final Scanner scanner, final DataAdapter<T> adapter ) { super( scanner.iterator(), adapter); this.scanner = scanner; } @SuppressWarnings("unchecked") @Override protected Pair<ByteArrayId, ByteArrayId> decodeRow( final Object row ) { Entry<Key, Value> entry = null; try { entry = (Entry<Key, Value>) row; } catch (final ClassCastException e) { LOGGER.error("Row is not an accumulo row entry."); return null; } final byte[] cqBytes = entry.getKey().getColumnQualifierData().getBackingArray(); return Pair.of( SecondaryIndexUtils.getPrimaryIndexId(cqBytes), SecondaryIndexUtils.getPrimaryRowId(cqBytes)); } @Override public void close() throws IOException { scanner.close(); } }