package mil.nga.giat.geowave.core.store.operations.remote;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters;
import mil.nga.giat.geowave.core.cli.annotations.GeowaveOperation;
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.store.DataStoreOperations;
import mil.nga.giat.geowave.core.store.adapter.AdapterIndexMappingStore;
import mil.nga.giat.geowave.core.store.adapter.AdapterStore;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions;
import mil.nga.giat.geowave.core.store.operations.remote.options.IndexLoader;
import mil.nga.giat.geowave.core.store.operations.remote.options.IndexPluginOptions;
import mil.nga.giat.geowave.core.store.operations.remote.options.StoreLoader;
@GeowaveOperation(name = "mergedata", parentOperation = RemoteSection.class)
@Parameters(commandDescription = "Merge all rows for a given adapter and index")
public class MergeDataCommand extends
DefaultOperation implements
Command
{
@Parameter(description = "<storename> <indexname>")
private List<String> parameters = new ArrayList<String>();
private DataStorePluginOptions inputStoreOptions = null;
private List<IndexPluginOptions> inputIndexOptions = null;
/**
* Prep the driver & run the operation.
*/
@Override
public void execute(
final OperationParams params ) {
// Ensure we have all the required arguments
if (parameters.size() != 2) {
throw new ParameterException(
"Requires arguments: <storename> <indexname>");
}
final String inputStoreName = parameters.get(0);
final String indexList = parameters.get(1);
// Attempt to load input store.
if (inputStoreOptions == null) {
final StoreLoader inputStoreLoader = new StoreLoader(
inputStoreName);
if (!inputStoreLoader.loadFromConfig(getGeoWaveConfigFile(params))) {
throw new ParameterException(
"Cannot find store name: " + inputStoreLoader.getStoreName());
}
inputStoreOptions = inputStoreLoader.getDataStorePlugin();
} // Load the Indexes
if (inputIndexOptions == null) {
final IndexLoader indexLoader = new IndexLoader(
indexList);
if (!indexLoader.loadFromConfig(getGeoWaveConfigFile(params))) {
throw new ParameterException(
"Cannot find index(s) by name: " + indexList);
}
inputIndexOptions = indexLoader.getLoadedIndexes();
}
final AdapterStore adapterStore = inputStoreOptions.createAdapterStore();
final AdapterIndexMappingStore adapterIndexMappingStore = inputStoreOptions.createAdapterIndexMappingStore();
final DataStoreOperations operations = inputStoreOptions.createDataStoreOperations();
for (final IndexPluginOptions i : inputIndexOptions) {
final PrimaryIndex index = i.createPrimaryIndex();
if (!operations.mergeData(
index,
adapterStore,
adapterIndexMappingStore)) {
JCommander.getConsole().println(
"Unable to merge data within index '" + index.getId().getString() + "'");
}
else {
JCommander.getConsole().println(
"Data successfully merged within index '" + index.getId().getString() + "'");
}
}
}
public List<String> getParameters() {
return parameters;
}
public void setParameters(
final String storeName,
final String adapterId ) {
parameters = Arrays.asList(
storeName,
adapterId);
}
public DataStorePluginOptions getInputStoreOptions() {
return inputStoreOptions;
}
public void setInputStoreOptions(
final DataStorePluginOptions inputStoreOptions ) {
this.inputStoreOptions = inputStoreOptions;
}
}