package mil.nga.giat.geowave.datastore.accumulo;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.accumulo.core.client.IteratorSetting.Column;
import org.apache.accumulo.core.iterators.conf.ColumnSet;
import org.apache.hadoop.io.Text;
import mil.nga.giat.geowave.core.index.ByteArrayUtils;
import mil.nga.giat.geowave.core.index.PersistenceUtils;
import mil.nga.giat.geowave.core.store.adapter.RowMergingDataAdapter;
import mil.nga.giat.geowave.datastore.accumulo.IteratorConfig.OptionProvider;
public class RowMergingAdapterOptionProvider implements
OptionProvider
{
public static final String ROW_TRANSFORM_KEY = "ROW_TRANSFORM";
public static final String ROW_MERGING_ADAPTER_CACHE_ID = "ROW_MERGING_ADAPTER";
private final RowMergingDataAdapter<?, ?> adapter;
public RowMergingAdapterOptionProvider(
final RowMergingDataAdapter<?, ?> adapter ) {
this.adapter = adapter;
}
@Override
public Map<String, String> getOptions(
final Map<String, String> existingOptions ) {
final Map<String, String> newOptions = adapter.getOptions(existingOptions);
final Column adapterColumn = new Column(
new Text(
adapter.getAdapterId().getBytes()));
String nextColumnValue = ColumnSet.encodeColumns(
adapterColumn.getFirst(),
adapterColumn.getSecond());
if ((existingOptions != null) && existingOptions.containsKey(MergingCombiner.COLUMNS_OPTION)) {
final String encodedColumns = existingOptions.get(MergingCombiner.COLUMNS_OPTION);
final Set<String> nextColumns = new HashSet<String>();
for (final String column : nextColumnValue.split(",")) {
nextColumns.add(column);
}
final StringBuffer str = new StringBuffer(
nextColumnValue);
for (final String column : encodedColumns.split(",")) {
if (!nextColumns.contains(column)) {
str.append(",");
str.append(column);
}
}
nextColumnValue = str.toString();
}
newOptions.put(
MergingCombiner.COLUMNS_OPTION,
nextColumnValue);
newOptions.put(
ROW_TRANSFORM_KEY,
ByteArrayUtils.byteArrayToString(PersistenceUtils.toBinary(adapter.getTransform())));
return newOptions;
}
}