package mil.nga.giat.geowave.datastore.hbase.query; import java.io.IOException; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.index.StringUtils; 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.index.PrimaryIndex; import mil.nga.giat.geowave.datastore.hbase.operations.BasicHBaseOperations; import mil.nga.giat.geowave.datastore.hbase.util.HBaseEntryIteratorWrapper; import mil.nga.giat.geowave.datastore.hbase.util.HBaseUtils.ScannerClosableWrapper; abstract public class AbstractHBaseRowQuery<T> extends HBaseQuery { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractHBaseRowQuery.class); protected final ScanCallback<T> scanCallback; public AbstractHBaseRowQuery( final PrimaryIndex index, final String[] authorizations, final ScanCallback<T> scanCallback ) { super( index, authorizations); this.scanCallback = scanCallback; } public CloseableIterator<T> query( final BasicHBaseOperations operations, final double[] maxResolutionSubsamplingPerDimension, final AdapterStore adapterStore ) { final Scan scanner = new Scan(); scanner.setMaxResultSize(getScannerLimit()); ResultScanner results = null; try { results = operations.getScannedResults( scanner, StringUtils.stringFromBinary(index.getId().getBytes()), authorizations); } catch (final IOException e) { LOGGER.error( "Unable to get the scanned results.", e); } if (results != null) { return new CloseableIteratorWrapper<T>( new ScannerClosableWrapper( results), new HBaseEntryIteratorWrapper( adapterStore, index, results.iterator(), null, fieldIds, maxResolutionSubsamplingPerDimension, true, false)); } else { return new CloseableIterator.Empty<T>(); } } abstract protected Integer getScannerLimit(); }