package mil.nga.giat.geowave.core.store.index; import java.nio.ByteBuffer; import java.util.List; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.IndexMetaData; import mil.nga.giat.geowave.core.index.IndexStrategy; import mil.nga.giat.geowave.core.index.Mergeable; import mil.nga.giat.geowave.core.index.PersistenceUtils; import mil.nga.giat.geowave.core.store.adapter.statistics.AbstractDataStatistics; import mil.nga.giat.geowave.core.store.adapter.statistics.DataStatistics; import mil.nga.giat.geowave.core.store.adapter.statistics.DataStatisticsStore; import mil.nga.giat.geowave.core.store.base.DataStoreEntryInfo; import mil.nga.giat.geowave.core.store.callback.DeleteCallback; import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; public class IndexMetaDataSet<T> extends AbstractDataStatistics<T> implements DeleteCallback<T> { private List<IndexMetaData> metaData; public static final ByteArrayId STATS_TYPE = new ByteArrayId( "INDEX_METADATA"); protected IndexMetaDataSet() {} private IndexMetaDataSet( final ByteArrayId adapterId, final ByteArrayId statisticsId, final List<IndexMetaData> metaData ) { super( adapterId, composeId(statisticsId)); this.metaData = metaData; } public IndexMetaDataSet( final ByteArrayId adapterId, final ByteArrayId statisticsId, final IndexStrategy<?, ?> indexStrategy ) { super( adapterId, composeId(statisticsId)); this.metaData = indexStrategy.createMetaData(); } public static ByteArrayId composeId( final ByteArrayId statisticsId ) { return composeId( STATS_TYPE.getString(), statisticsId.getString()); } @Override public DataStatistics<T> duplicate() { return new IndexMetaDataSet<T>( dataAdapterId, statisticsId, this.metaData); } public List<IndexMetaData> getMetaData() { return metaData; } @Override public byte[] toBinary() { final byte[] metaBytes = PersistenceUtils.toBinary(metaData); final ByteBuffer buffer = super.binaryBuffer(metaBytes.length); buffer.put(metaBytes); return buffer.array(); } @SuppressWarnings("unchecked") @Override public void fromBinary( final byte[] bytes ) { final ByteBuffer buffer = super.binaryBuffer(bytes); final byte[] metaBytes = new byte[buffer.remaining()]; buffer.get(metaBytes); metaData = (List) PersistenceUtils.fromBinary(metaBytes); } public IndexMetaData[] toArray() { return metaData.toArray(new IndexMetaData[metaData.size()]); } @Override public void merge( final Mergeable merge ) { if ((merge != null) && (merge instanceof IndexMetaDataSet)) { for (int i = 0; i < metaData.size(); i++) { metaData.get( i).merge( ((IndexMetaDataSet<T>) merge).metaData.get(i)); } } } @Override public void entryIngested( final DataStoreEntryInfo entryInfo, final T entry ) { for (final IndexMetaData imd : this.metaData) { imd.insertionIdsAdded(entryInfo.getInsertionIds()); } } @Override public void entryDeleted( final DataStoreEntryInfo entryInfo, final T entry ) { for (final IndexMetaData imd : this.metaData) { imd.insertionIdsRemoved(entryInfo.getInsertionIds()); } } public static IndexMetaData[] getIndexMetadata( final PrimaryIndex index, final List<ByteArrayId> adapterIdsToQuery, final DataStatisticsStore statisticsStore, final String... authorizations ) { IndexMetaDataSet combinedMetaData = null; for (final ByteArrayId adapterId : adapterIdsToQuery) { final IndexMetaDataSet adapterMetadata = (IndexMetaDataSet) statisticsStore.getDataStatistics( adapterId, IndexMetaDataSet.composeId(index.getId()), authorizations); if (combinedMetaData == null) { combinedMetaData = adapterMetadata; } else { combinedMetaData.merge(adapterMetadata); } } return combinedMetaData != null ? combinedMetaData.toArray() : null; } /** * Convert Index Metadata statistics to a JSON object */ public JSONObject toJSONObject() throws JSONException { JSONObject jo = new JSONObject(); jo.put( "type", STATS_TYPE.getString()); jo.put( "statisticsID", statisticsId.getString()); JSONArray mdArray = new JSONArray(); for (final IndexMetaData imd : this.metaData) { mdArray.add(imd.toJSONObject()); } jo.put( "metadata", mdArray); return jo; } }