package mil.nga.giat.geowave.datastore.accumulo; import java.io.Closeable; import java.util.Collections; import java.util.List; import org.apache.accumulo.core.client.TableNotFoundException; import org.apache.accumulo.core.data.Mutation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.StringUtils; import mil.nga.giat.geowave.core.store.adapter.DataAdapter; import mil.nga.giat.geowave.core.store.adapter.WritableDataAdapter; import mil.nga.giat.geowave.core.store.base.DataStoreEntryInfo; import mil.nga.giat.geowave.core.store.callback.IngestCallback; import mil.nga.giat.geowave.core.store.data.VisibilityWriter; import mil.nga.giat.geowave.core.store.index.DataStoreIndexWriter; import mil.nga.giat.geowave.core.store.index.PrimaryIndex; import mil.nga.giat.geowave.datastore.accumulo.operations.config.AccumuloOptions; import mil.nga.giat.geowave.datastore.accumulo.util.AccumuloUtils; /** * This class can write many entries for a single index by retaining a single * open writer. The first entry that is written will open a writer and it is the * responsibility of the caller to close this writer when complete. * */ public class AccumuloIndexWriter<T> extends DataStoreIndexWriter<T, Mutation> { private final static Logger LOGGER = LoggerFactory.getLogger(AccumuloIndexWriter.class); protected final AccumuloOperations accumuloOperations; protected final AccumuloOptions accumuloOptions; public AccumuloIndexWriter( final DataAdapter<T> adapter, final PrimaryIndex index, final AccumuloOperations accumuloOperations, final AccumuloOptions accumuloOptions, final IngestCallback<T> callback, final Closeable closable ) { super( adapter, index, accumuloOperations, accumuloOptions, callback, closable); this.accumuloOperations = accumuloOperations; this.accumuloOptions = accumuloOptions; } protected synchronized void ensureOpen() { if (writer == null) { try { writer = accumuloOperations.createWriter( StringUtils.stringFromBinary(index.getId().getBytes()), accumuloOptions.isCreateTable(), true, accumuloOptions.isEnableBlockCache(), index.getIndexStrategy().getNaturalSplits()); } catch (final TableNotFoundException e) { LOGGER.error( "Unable to open writer", e); } } } @Override protected DataStoreEntryInfo getEntryInfo( final T entry, final VisibilityWriter<T> visibilityWriter ) { return AccumuloUtils.write( (WritableDataAdapter<T>) adapter, index, entry, writer, accumuloOperations, visibilityWriter); } }