package mil.nga.giat.geowave.datastore.hbase.util; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.RowMutations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.store.adapter.AdapterStore; import mil.nga.giat.geowave.core.store.adapter.RowMergingDataAdapter; import mil.nga.giat.geowave.core.store.index.PrimaryIndex; import mil.nga.giat.geowave.datastore.hbase.io.HBaseWriter; public class RewritingMergingEntryIterator<T> extends MergingEntryIterator<T> { private final static Logger LOGGER = LoggerFactory.getLogger(RewritingMergingEntryIterator.class); private final HBaseWriter writer; public RewritingMergingEntryIterator( final AdapterStore adapterStore, final PrimaryIndex index, final Iterator<Result> scannerIt, final Map<ByteArrayId, RowMergingDataAdapter> mergingAdapters, final HBaseWriter writer ) { super( adapterStore, index, scannerIt, null, null, mergingAdapters, null, null, false); this.writer = writer; } @Override protected Result mergeResults( final RowMergingDataAdapter mergingAdapter, final ArrayList<Result> resultsToMerge ) { final Result retVal = super.mergeResults( mergingAdapter, resultsToMerge); final List<RowMutations> rowMutationsList = new ArrayList<>(); final byte[] uniqueRow = HBaseUtils.ensureUniqueId( retVal.getRow(), true).getBytes(); final RowMutations putRowMutations = new RowMutations( uniqueRow); try { for (final Cell oldCell : retVal.rawCells()) { final Cell newCell = CellUtil.createCell( uniqueRow, CellUtil.cloneFamily(oldCell), CellUtil.cloneQualifier(oldCell), oldCell.getTimestamp(), oldCell.getTypeByte(), CellUtil.cloneValue(oldCell)); final Put p = new Put( uniqueRow); p.add(newCell); putRowMutations.add(p); } rowMutationsList.add(putRowMutations); for (final Result input : resultsToMerge) { final RowMutations deleteRowMutations = new RowMutations( input.getRow()); deleteRowMutations.add(new Delete( input.getRow())); rowMutationsList.add(deleteRowMutations); } writer.write(rowMutationsList); } catch (final IOException e) { LOGGER.warn( "Unable to rewrite row", e); } return retVal; } }