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.ByteArrayId;
import mil.nga.giat.geowave.core.store.data.IndexedPersistenceEncoding;
import mil.nga.giat.geowave.core.store.index.CommonIndexModel;
public class DataIdQueryFilter implements
DistributableQueryFilter
{
private ByteArrayId adapterId;
private List<ByteArrayId> dataIds;
protected DataIdQueryFilter() {}
public DataIdQueryFilter(
final ByteArrayId adapterId,
List<ByteArrayId> dataIds ) {
this.adapterId = adapterId;
this.dataIds = dataIds;
}
@Override
public boolean accept(
final CommonIndexModel indexModel,
final IndexedPersistenceEncoding persistenceEncoding ) {
return adapterId.equals(persistenceEncoding.getAdapterId())
&& dataIds.contains(persistenceEncoding.getDataId());
}
@Override
public byte[] toBinary() {
int size = 4;
final byte[] adapterIdBytes = adapterId.getBytes();
size += adapterIdBytes.length;
for (ByteArrayId id : dataIds) {
size += (id.getBytes().length + 4);
}
ByteBuffer buf = ByteBuffer.allocate(size);
buf.putInt(dataIds.size());
for (ByteArrayId id : dataIds) {
final byte[] idBytes = id.getBytes();
buf.putInt(idBytes.length);
buf.put(idBytes);
}
buf.put(adapterIdBytes);
return buf.array();
}
@Override
public void fromBinary(
final byte[] bytes ) {
ByteBuffer buf = ByteBuffer.wrap(bytes);
int size = buf.getInt();
dataIds = new ArrayList<ByteArrayId>(
size);
for (int i = 0; i < size; i++) {
final int bsize = buf.getInt();
final byte[] dataIdBytes = new byte[bsize];
buf.get(dataIdBytes);
dataIds.add(new ByteArrayId(
dataIdBytes));
}
final byte[] adapterIdBytes = new byte[bytes.length - buf.position()];
buf.get(adapterIdBytes);
this.adapterId = new ByteArrayId(
adapterIdBytes);
}
}