//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.history.elasticsearch;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
import uk.gov.dstl.baleen.core.history.HistoryEvent;
import uk.gov.dstl.baleen.history.helpers.AbstractDocumentHistory;
/** A document history for ElasticSearch.
*
* This is an in-memory implementation. When a document history is requested from
* {@link ElasticsearchHistory} the entire history is loaded into memory
* (and not kept synchronised with ES). Events are added or the history
* queried and saved back to ES on close.
*
* Thus the get events here act on memory and can be considered quick (i.e.
* don't require a round trip to the server).
*
*
*
*/
public class ElasticsearchDocumentHistory extends AbstractDocumentHistory<ElasticsearchHistory> {
private BlockingDeque<HistoryEvent> events;
/** New instance, with an empty history.
* @param history the elasticsearch owning this history
* @param documentId the document id
*/
public ElasticsearchDocumentHistory(ElasticsearchHistory history, String documentId) {
this(history, documentId, new LinkedBlockingDeque<HistoryEvent>());
}
/** New instance, with an existing history.
* @param history the elasticsearch owning this history
* @param documentId the document id
* @param events the events to populate the history with. This class assumes ownership (and will likely modify)
*/
public ElasticsearchDocumentHistory(ElasticsearchHistory history, String documentId,
BlockingDeque<HistoryEvent> events) {
super(history, documentId);
this.events = events != null ? events : new LinkedBlockingDeque<HistoryEvent>();
}
@Override
public void add(HistoryEvent event) {
events.add(event);
}
@Override
public Collection<HistoryEvent> getAllHistory() {
return Collections.unmodifiableCollection(events);
}
}