package mil.nga.giat.geowave.datastore.accumulo.query; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.accumulo.core.data.ByteSequence; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.iterators.IteratorEnvironment; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.hadoop.io.Text; import mil.nga.giat.geowave.core.store.data.CommonIndexedPersistenceEncoding; import mil.nga.giat.geowave.core.store.data.PersistentDataset; import mil.nga.giat.geowave.core.store.flatten.FlattenedUnreadData; import mil.nga.giat.geowave.core.store.index.CommonIndexValue; import mil.nga.giat.geowave.datastore.accumulo.encoding.AccumuloUnreadDataList; public class WholeRowAggregationIterator extends WholeRowQueryFilterIterator { private AggregationIterator aggregationIterator; public WholeRowAggregationIterator() { super(); } @Override protected boolean filter( final Text currentRow, final List<Key> keys, final List<Value> values ) { if ((aggregationIterator != null) && (aggregationIterator.queryFilterIterator != null)) { final PersistentDataset<CommonIndexValue> commonData = new PersistentDataset<CommonIndexValue>(); final List<FlattenedUnreadData> unreadData = new ArrayList<>(); for (int i = 0; (i < keys.size()) && (i < values.size()); i++) { final Key key = keys.get(i); final Value value = values.get(i); final FlattenedUnreadData singleRow = aggregationIterator.queryFilterIterator.aggregateFieldData( key, value, commonData); if (singleRow != null) { unreadData.add(singleRow); } } final CommonIndexedPersistenceEncoding encoding = QueryFilterIterator.getEncoding( currentRow, commonData, unreadData.isEmpty() ? null : new AccumuloUnreadDataList( unreadData)); boolean queryFilterResult = true; if (aggregationIterator.queryFilterIterator.isSet()) { queryFilterResult = aggregationIterator.queryFilterIterator.applyRowFilter(encoding); } if (queryFilterResult) { aggregationIterator.aggregateRow( currentRow, queryFilterIterator.model, encoding); } } // we don't want to return anything but the aggregation result return false; } @Override public void init( final SortedKeyValueIterator<Key, Value> source, final Map<String, String> options, final IteratorEnvironment env ) throws IOException { aggregationIterator = new AggregationIterator(); aggregationIterator.setParent(new WholeRowAggregationParent()); aggregationIterator.setOptions(options); aggregationIterator.queryFilterIterator = new QueryFilterIterator(); aggregationIterator.queryFilterIterator.setOptions(options); super.init( source, options, env); } @Override public SortedKeyValueIterator<Key, Value> deepCopy( final IteratorEnvironment env ) { final SortedKeyValueIterator<Key, Value> iterator = super.deepCopy(env); if (iterator instanceof WholeRowAggregationIterator) { aggregationIterator = new AggregationIterator(); aggregationIterator.deepCopyIterator(((WholeRowAggregationIterator) iterator).aggregationIterator); aggregationIterator.setParent(new WholeRowAggregationParent()); } return iterator; } @Override public Key getTopKey() { return aggregationIterator.getTopKey(); } @Override public Value getTopValue() { return aggregationIterator.getTopValue(); } @Override public boolean hasTop() { return aggregationIterator.hasTop(); } @Override public void next() throws IOException { aggregationIterator.next(); } @Override public void seek( final Range range, final Collection<ByteSequence> columnFamilies, final boolean inclusive ) throws IOException { aggregationIterator.seek( range, columnFamilies, inclusive); } public class WholeRowAggregationParent implements SortedKeyValueIterator<Key, Value> { @Override public void init( final SortedKeyValueIterator<Key, Value> source, final Map<String, String> options, final IteratorEnvironment env ) throws IOException { WholeRowAggregationIterator.super.init( source, options, env); } @Override public boolean hasTop() { return WholeRowAggregationIterator.super.hasTop(); } @Override public void next() throws IOException { WholeRowAggregationIterator.super.next(); } @Override public void seek( final Range range, final Collection<ByteSequence> columnFamilies, final boolean inclusive ) throws IOException { WholeRowAggregationIterator.super.seek( range, columnFamilies, inclusive); } @Override public Key getTopKey() { return WholeRowAggregationIterator.super.getTopKey(); } @Override public Value getTopValue() { return WholeRowAggregationIterator.super.getTopValue(); } @Override public SortedKeyValueIterator<Key, Value> deepCopy( final IteratorEnvironment env ) { return WholeRowAggregationIterator.super.deepCopy(env); } } }