package mil.nga.giat.geowave.datastore.accumulo.query;
import java.util.Iterator;
import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.accumulo.core.client.ScannerBase;
import org.apache.accumulo.core.iterators.user.WholeRowIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import mil.nga.giat.geowave.core.store.CloseableIterator;
import mil.nga.giat.geowave.core.store.CloseableIteratorWrapper;
import mil.nga.giat.geowave.core.store.adapter.AdapterStore;
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.FilterList;
import mil.nga.giat.geowave.core.store.filter.QueryFilter;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
import mil.nga.giat.geowave.datastore.accumulo.AccumuloOperations;
import mil.nga.giat.geowave.datastore.accumulo.util.AccumuloEntryIteratorWrapper;
import mil.nga.giat.geowave.datastore.accumulo.util.ScannerClosableWrapper;
/**
* Represents a query operation by an Accumulo row. This abstraction is
* re-usable for both exact row ID queries and row prefix queries.
*
*/
abstract public class AbstractAccumuloRowQuery<T> extends
AccumuloQuery
{
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAccumuloRowQuery.class);
protected final ScanCallback<T> scanCallback;
public AbstractAccumuloRowQuery(
final PrimaryIndex index,
final String[] authorizations,
final ScanCallback<T> scanCallback,
final DifferingFieldVisibilityEntryCount visibilityCounts ) {
super(
index,
visibilityCounts,
authorizations);
this.scanCallback = scanCallback;
}
public CloseableIterator<T> query(
final AccumuloOperations accumuloOperations,
final double[] maxResolutionSubsamplingPerDimension,
final AdapterStore adapterStore ) {
final ScannerBase scanner = getScanner(
accumuloOperations,
maxResolutionSubsamplingPerDimension,
getScannerLimit());
if (scanner == null) {
LOGGER.error("Unable to get a new scanner instance, getScanner returned null");
return null;
}
addScanIteratorSettings(scanner);
return initCloseableIterator(
scanner,
initIterator(
adapterStore,
scanner));
}
protected Iterator initIterator(
final AdapterStore adapterStore,
final ScannerBase scanner ) {
return new AccumuloEntryIteratorWrapper(
useWholeRowIterator(),
adapterStore,
index,
scanner.iterator(),
null,
scanCallback);
}
protected void addScanIteratorSettings(
final ScannerBase scanner ) {
addFieldSubsettingToIterator(scanner);
if (useWholeRowIterator()) {
// we have to at least use a whole row iterator
final IteratorSetting iteratorSettings = new IteratorSetting(
QueryFilterIterator.QUERY_ITERATOR_PRIORITY,
QueryFilterIterator.QUERY_ITERATOR_NAME,
WholeRowIterator.class);
scanner.addScanIterator(iteratorSettings);
}
}
abstract protected Integer getScannerLimit();
protected CloseableIterator<T> initCloseableIterator(
ScannerBase scanner,
Iterator it ) {
return new CloseableIteratorWrapper(
new ScannerClosableWrapper(
scanner),
it);
}
}