package mil.nga.giat.geowave.datastore.accumulo.query; import java.io.Closeable; import java.io.IOException; import java.util.Iterator; import org.apache.accumulo.core.client.BatchDeleter; import org.apache.accumulo.core.client.MutationsRejectedException; import org.apache.accumulo.core.client.ScannerBase; import org.apache.accumulo.core.client.TableNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.store.CloseableIterator; import mil.nga.giat.geowave.core.store.CloseableIteratorWrapper; import mil.nga.giat.geowave.core.store.callback.ScanCallback; import mil.nga.giat.geowave.core.store.data.visibility.DifferingFieldVisibilityEntryCount; import mil.nga.giat.geowave.core.store.index.PrimaryIndex; import mil.nga.giat.geowave.datastore.accumulo.AccumuloOperations; public class AccumuloRowPrefixDelete<T> extends AccumuloRowPrefixQuery<T> { private static final Logger LOGGER = LoggerFactory.getLogger(AccumuloRowPrefixDelete.class); public AccumuloRowPrefixDelete( PrimaryIndex index, ByteArrayId rowPrefix, ScanCallback scanCallback, Integer limit, DifferingFieldVisibilityEntryCount visibilityCounts, String[] authorizations ) { super( index, rowPrefix, scanCallback, limit, visibilityCounts, authorizations); } @Override protected boolean useWholeRowIterator() { return false; } @Override protected CloseableIterator<T> initCloseableIterator( ScannerBase scanner, Iterator it ) { return new CloseableIteratorWrapper( new Closeable() { boolean closed = false; @Override public void close() throws IOException { if (!closed) { if (scanner instanceof BatchDeleter) { try { ((BatchDeleter) scanner).delete(); } catch (MutationsRejectedException | TableNotFoundException e) { LOGGER.warn( "Unable to delete rows by query constraints", e); } } scanner.close(); } closed = true; } }, it); } @Override protected ScannerBase createScanner( AccumuloOperations accumuloOperations, String tableName, boolean batchScanner, String... authorizations ) throws TableNotFoundException { BatchDeleter deleter = accumuloOperations.createBatchDeleter( tableName, authorizations); deleter.removeScanIterator(BatchDeleter.class.getName() + ".NOVALUE"); return deleter; } }