package mil.nga.giat.geowave.cli.debug;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import mil.nga.giat.geowave.adapter.vector.GeotoolsFeatureDataAdapter;
import mil.nga.giat.geowave.core.cli.annotations.GeowaveOperation;
import mil.nga.giat.geowave.core.geotime.store.query.SpatialQuery;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.CloseableIterator;
import mil.nga.giat.geowave.core.store.DataStore;
import mil.nga.giat.geowave.core.store.query.QueryOptions;
import mil.nga.giat.geowave.core.store.query.aggregate.CountAggregation;
import mil.nga.giat.geowave.core.store.query.aggregate.CountResult;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import com.google.common.base.Stopwatch;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
@GeowaveOperation(name = "bbox", parentOperation = DebugSection.class)
@Parameters(commandDescription = "bbox query")
public class BBOXQuery extends
AbstractGeoWaveQuery
{
private static Logger LOGGER = LoggerFactory.getLogger(BBOXQuery.class);
@Parameter(names = {
"-e",
"--east"
}, required = true, description = "Max Longitude of BBOX")
private Double east;
@Parameter(names = {
"-w",
"--west"
}, required = true, description = "Min Longitude of BBOX")
private Double west;
@Parameter(names = {
"-n",
"--north"
}, required = true, description = "Max Latitude of BBOX")
private Double north;
@Parameter(names = {
"-s",
"--south"
}, required = true, description = "Min Latitude of BBOX")
private Double south;
@Parameter(names = {
"--useAggregation",
"-agg"
}, description = "Compute count on the server side")
private Boolean useAggregation = Boolean.FALSE;
private Geometry geom;
private void getBoxGeom() {
geom = new GeometryFactory().toGeometry(new Envelope(
west,
east,
south,
north));
}
@Override
protected long runQuery(
final GeotoolsFeatureDataAdapter adapter,
final ByteArrayId adapterId,
final ByteArrayId indexId,
final DataStore dataStore,
final boolean debug ) {
final Stopwatch stopWatch = new Stopwatch();
getBoxGeom();
long count = 0;
if (useAggregation) {
final QueryOptions options = new QueryOptions(
adapterId,
indexId);
options.setAggregation(
new CountAggregation(),
adapter);
try (final CloseableIterator<Object> it = dataStore.query(
options,
new SpatialQuery(
geom))) {
final CountResult result = ((CountResult) (it.next()));
if (result != null) {
count += result.getCount();
}
}
catch (final IOException e) {
LOGGER.warn(
"Unable to read result",
e);
}
}
else {
stopWatch.start();
CloseableIterator<Object> it = dataStore.query(
new QueryOptions(
adapterId,
indexId),
new SpatialQuery(
geom));
stopWatch.stop();
System.out.println("Ran BBOX query in " + stopWatch.toString());
stopWatch.reset();
stopWatch.start();
while (it.hasNext()) {
if (debug) {
System.out.println(it.next());
}
else {
it.next();
}
count++;
}
stopWatch.stop();
System.out.println("BBOX query results iteration took " + stopWatch.toString());
}
return count;
}
}