package mil.nga.giat.geowave.core.store.filter;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import mil.nga.giat.geowave.core.index.PersistenceUtils;
/**
* This class wraps a list of distributable filters into a single distributable
* filter such that the list is persisted in its original order and if any one
* filter fails this class will fail acceptance.
*
*/
public class DistributableFilterList extends
FilterList<DistributableQueryFilter> implements
DistributableQueryFilter
{
protected DistributableFilterList() {
super();
}
public DistributableFilterList(
final List<DistributableQueryFilter> filters ) {
super(
filters);
}
public DistributableFilterList(
final boolean logicalAnd,
final List<DistributableQueryFilter> filters ) {
super(
logicalAnd,
filters);
}
@Override
public byte[] toBinary() {
int byteBufferLength = 8;
final List<byte[]> filterBinaries = new ArrayList<byte[]>(
filters.size());
for (final DistributableQueryFilter filter : filters) {
final byte[] filterBinary = PersistenceUtils.toBinary(filter);
byteBufferLength += (4 + filterBinary.length);
filterBinaries.add(filterBinary);
}
final ByteBuffer buf = ByteBuffer.allocate(byteBufferLength);
buf.putInt(this.logicalAnd ? 1 : 0);
buf.putInt(filters.size());
for (final byte[] filterBinary : filterBinaries) {
buf.putInt(filterBinary.length);
buf.put(filterBinary);
}
return buf.array();
}
@Override
public void fromBinary(
final byte[] bytes ) {
final ByteBuffer buf = ByteBuffer.wrap(bytes);
this.logicalAnd = buf.getInt() > 0;
final int numFilters = buf.getInt();
filters = new ArrayList<DistributableQueryFilter>(
numFilters);
for (int i = 0; i < numFilters; i++) {
final byte[] filter = new byte[buf.getInt()];
buf.get(filter);
filters.add(PersistenceUtils.fromBinary(
filter,
DistributableQueryFilter.class));
}
}
}