package mil.nga.giat.geowave.core.store.adapter.statistics;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.EntryVisibilityHandler;
import mil.nga.giat.geowave.core.store.base.DataStoreEntryInfo;
import mil.nga.giat.geowave.core.store.callback.DeleteCallback;
import mil.nga.giat.geowave.core.store.callback.IngestCallback;
import mil.nga.giat.geowave.core.store.callback.ScanCallback;
public class DataStatisticsBuilder<T> implements
IngestCallback<T>,
DeleteCallback<T>,
ScanCallback<T>
{
private final StatisticsProvider<T> statisticsProvider;
private final Map<ByteArrayId, DataStatistics<T>> statisticsMap = new HashMap<ByteArrayId, DataStatistics<T>>();
private final ByteArrayId statisticsId;
private final EntryVisibilityHandler<T> visibilityHandler;
public DataStatisticsBuilder(
final StatisticsProvider<T> statisticsProvider,
final ByteArrayId statisticsId ) {
this.statisticsProvider = statisticsProvider;
this.statisticsId = statisticsId;
this.visibilityHandler = statisticsProvider.getVisibilityHandler(statisticsId);
}
@Override
public void entryIngested(
final DataStoreEntryInfo entryInfo,
final T entry ) {
final ByteArrayId visibility = new ByteArrayId(
visibilityHandler.getVisibility(
entryInfo,
entry));
DataStatistics<T> statistics = statisticsMap.get(visibility);
if (statistics == null) {
statistics = statisticsProvider.createDataStatistics(statisticsId);
if (statistics == null) {
return;
}
statistics.setVisibility(visibility.getBytes());
statisticsMap.put(
visibility,
statistics);
}
statistics.entryIngested(
entryInfo,
entry);
}
public Collection<DataStatistics<T>> getStatistics() {
return statisticsMap.values();
}
@SuppressWarnings("unchecked")
@Override
public void entryDeleted(
final DataStoreEntryInfo entryInfo,
final T entry ) {
final ByteArrayId visibilityByteArray = new ByteArrayId(
visibilityHandler.getVisibility(
entryInfo,
entry));
DataStatistics<T> statistics = statisticsMap.get(visibilityByteArray);
if (statistics == null) {
statistics = statisticsProvider.createDataStatistics(statisticsId);
statistics.setVisibility(visibilityByteArray.getBytes());
statisticsMap.put(
visibilityByteArray,
statistics);
}
if (statistics instanceof DeleteCallback) {
((DeleteCallback<T>) statistics).entryDeleted(
entryInfo,
entry);
}
}
@Override
public void entryScanned(
DataStoreEntryInfo entryInfo,
T entry ) {
final ByteArrayId visibility = new ByteArrayId(
visibilityHandler.getVisibility(
entryInfo,
entry));
DataStatistics<T> statistics = statisticsMap.get(visibility);
if (statistics == null) {
statistics = statisticsProvider.createDataStatistics(statisticsId);
if (statistics == null) {
return;
}
statistics.setVisibility(visibility.getBytes());
statisticsMap.put(
visibility,
statistics);
}
statistics.entryIngested(
entryInfo,
entry);
}
}