package mil.nga.giat.geowave.cli.debug; import java.io.IOException; import java.util.ArrayList; import java.util.List; import mil.nga.giat.geowave.adapter.vector.GeotoolsFeatureDataAdapter; import mil.nga.giat.geowave.core.cli.api.Command; import mil.nga.giat.geowave.core.cli.api.DefaultOperation; import mil.nga.giat.geowave.core.cli.api.OperationParams; import mil.nga.giat.geowave.core.cli.converters.GeoWaveBaseConverter; 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.adapter.AdapterStore; import mil.nga.giat.geowave.core.store.adapter.DataAdapter; import mil.nga.giat.geowave.core.store.operations.remote.options.StoreLoader; import org.apache.commons.cli.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import com.google.common.base.Stopwatch; abstract public class AbstractGeoWaveQuery extends DefaultOperation implements Command { private static Logger LOGGER = LoggerFactory.getLogger(AbstractGeoWaveQuery.class); @Parameter(description = "<storename>") private List<String> parameters = new ArrayList<String>(); @Parameter(names = "--indexId", description = "The name of the index (optional)", converter = StringToByteArrayConverter.class) private ByteArrayId indexId; @Parameter(names = "--adapterId", description = "Optional ability to provide an adapter ID", converter = StringToByteArrayConverter.class) private ByteArrayId adapterId; @Parameter(names = "--debug", description = "Print out additional info for debug purposes") private boolean debug = false; @Override public void execute( OperationParams params ) throws ParseException { final Stopwatch stopWatch = new Stopwatch(); // Ensure we have all the required arguments if (parameters.size() != 1) { throw new ParameterException( "Requires arguments: <storename>"); } String storeName = parameters.get(0); // Attempt to load store. StoreLoader storeOptions = new StoreLoader( storeName); if (!storeOptions.loadFromConfig(getGeoWaveConfigFile(params))) { throw new ParameterException( "Cannot find store name: " + storeOptions.getStoreName()); } DataStore dataStore; AdapterStore adapterStore; try { dataStore = storeOptions.createDataStore(); adapterStore = storeOptions.createAdapterStore(); final GeotoolsFeatureDataAdapter adapter; if (adapterId != null) { adapter = (GeotoolsFeatureDataAdapter) adapterStore.getAdapter(adapterId); } else { final CloseableIterator<DataAdapter<?>> it = adapterStore.getAdapters(); adapter = (GeotoolsFeatureDataAdapter) it.next(); it.close(); } if (debug && (adapter != null)) { System.out.println(adapter); } stopWatch.start(); final long results = runQuery( adapter, adapterId, indexId, dataStore, debug); stopWatch.stop(); System.out.println("Got " + results + " results in " + stopWatch.toString()); } catch (IOException e) { LOGGER.warn( "Unable to read adapter", e); } } abstract protected long runQuery( final GeotoolsFeatureDataAdapter adapter, final ByteArrayId adapterId, final ByteArrayId indexId, DataStore dataStore, boolean debug ); public static class StringToByteArrayConverter extends GeoWaveBaseConverter<ByteArrayId> { public StringToByteArrayConverter( String optionName ) { super( optionName); } @Override public ByteArrayId convert( String value ) { return new ByteArrayId( value); } } }