package mil.nga.giat.geowave.datastore.accumulo.query;
import java.io.Closeable;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
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.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.index.IndexMetaData;
import mil.nga.giat.geowave.core.index.sfc.data.MultiDimensionalNumericData;
import mil.nga.giat.geowave.core.store.CloseableIterator;
import mil.nga.giat.geowave.core.store.CloseableIteratorWrapper;
import mil.nga.giat.geowave.core.store.adapter.DataAdapter;
import mil.nga.giat.geowave.core.store.adapter.statistics.DuplicateEntryCount;
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.filter.DedupeFilter;
import mil.nga.giat.geowave.core.store.filter.QueryFilter;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
import mil.nga.giat.geowave.core.store.query.Query;
import mil.nga.giat.geowave.core.store.query.aggregate.Aggregation;
import mil.nga.giat.geowave.datastore.accumulo.AccumuloOperations;
public class AccumuloConstraintsDelete extends
AccumuloConstraintsQuery
{
private static final Logger LOGGER = LoggerFactory.getLogger(AccumuloConstraintsDelete.class);
public AccumuloConstraintsDelete(
List<ByteArrayId> adapterIds,
PrimaryIndex index,
Query query,
DedupeFilter clientDedupeFilter,
ScanCallback<?> scanCallback,
Pair<DataAdapter<?>, Aggregation<?, ?, ?>> aggregation,
Pair<List<String>, DataAdapter<?>> fieldIdsAdapterPair,
IndexMetaData[] indexMetaData,
DuplicateEntryCount duplicateCounts,
DifferingFieldVisibilityEntryCount visibilityCounts,
String[] authorizations ) {
super(
adapterIds,
index,
query,
clientDedupeFilter,
scanCallback,
aggregation,
fieldIdsAdapterPair,
indexMetaData,
duplicateCounts,
visibilityCounts,
authorizations);
}
public AccumuloConstraintsDelete(
List<ByteArrayId> adapterIds,
PrimaryIndex index,
List<MultiDimensionalNumericData> constraints,
List<QueryFilter> queryFilters,
DedupeFilter clientDedupeFilter,
ScanCallback<?> scanCallback,
Pair<DataAdapter<?>, Aggregation<?, ?, ?>> aggregation,
Pair<List<String>, DataAdapter<?>> fieldIdsAdapterPair,
IndexMetaData[] indexMetaData,
DuplicateEntryCount duplicateCounts,
DifferingFieldVisibilityEntryCount visibilityCounts,
String[] authorizations ) {
super(
adapterIds,
index,
constraints,
queryFilters,
clientDedupeFilter,
scanCallback,
aggregation,
fieldIdsAdapterPair,
indexMetaData,
duplicateCounts,
visibilityCounts,
authorizations);
}
@Override
protected CloseableIterator<Object> 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 boolean useWholeRowIterator() {
return false;
}
@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;
}
}