package mil.nga.giat.geowave.core.store.index.numeric;
import java.nio.ByteBuffer;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.index.lexicoder.Lexicoders;
import mil.nga.giat.geowave.core.store.data.IndexedPersistenceEncoding;
import mil.nga.giat.geowave.core.store.filter.DistributableQueryFilter;
import mil.nga.giat.geowave.core.store.index.CommonIndexModel;
public class NumberRangeFilter implements
DistributableQueryFilter
{
protected ByteArrayId fieldId;
protected Number lowerValue;
protected Number upperValue;
protected boolean inclusiveLow;
protected boolean inclusiveHigh;
protected NumberRangeFilter() {
super();
}
public NumberRangeFilter(
ByteArrayId fieldId,
Number lowerValue,
Number upperValue,
boolean inclusiveLow,
boolean inclusiveHigh ) {
super();
this.fieldId = fieldId;
this.lowerValue = lowerValue;
this.upperValue = upperValue;
this.inclusiveHigh = inclusiveHigh;
this.inclusiveLow = inclusiveLow;
}
public ByteArrayId getFieldId() {
return fieldId;
}
public Number getLowerValue() {
return lowerValue;
}
public Number getUpperValue() {
return upperValue;
}
public boolean isInclusiveLow() {
return inclusiveLow;
}
public boolean isInclusiveHigh() {
return inclusiveHigh;
}
@Override
public boolean accept(
final CommonIndexModel indexModel,
final IndexedPersistenceEncoding<?> persistenceEncoding ) {
final ByteArrayId value = (ByteArrayId) persistenceEncoding.getCommonData().getValue(
fieldId);
if (value != null) {
final double val = Lexicoders.DOUBLE.fromByteArray(value.getBytes());
if (inclusiveLow && inclusiveHigh)
return val >= lowerValue.doubleValue() && val <= upperValue.doubleValue();
else if (inclusiveLow)
return val >= lowerValue.doubleValue() && val < upperValue.doubleValue();
else if (inclusiveHigh)
return val > lowerValue.doubleValue() && val <= upperValue.doubleValue();
else
return val > lowerValue.doubleValue() && val < upperValue.doubleValue();
}
return false;
}
@Override
public byte[] toBinary() {
final ByteBuffer bb = ByteBuffer.allocate(4 + fieldId.getBytes().length + 16);
bb.putInt(fieldId.getBytes().length);
bb.put(fieldId.getBytes());
bb.putDouble(lowerValue.doubleValue());
bb.putDouble(upperValue.doubleValue());
return bb.array();
}
@Override
public void fromBinary(
final byte[] bytes ) {
final ByteBuffer bb = ByteBuffer.wrap(bytes);
final byte[] fieldIdBytes = new byte[bb.getInt()];
bb.get(fieldIdBytes);
fieldId = new ByteArrayId(
fieldIdBytes);
lowerValue = new Double(
bb.getDouble());
upperValue = new Double(
bb.getDouble());
}
}