package mil.nga.giat.geowave.core.store.dimension;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.index.PersistenceUtils;
import mil.nga.giat.geowave.core.index.dimension.NumericDimensionDefinition;
import mil.nga.giat.geowave.core.index.dimension.bin.BinRange;
import mil.nga.giat.geowave.core.index.sfc.data.NumericData;
import mil.nga.giat.geowave.core.index.sfc.data.NumericRange;
import mil.nga.giat.geowave.core.index.sfc.data.NumericValue;
import mil.nga.giat.geowave.core.store.data.field.FieldReader;
import mil.nga.giat.geowave.core.store.data.field.FieldWriter;
import mil.nga.giat.geowave.core.store.index.CommonIndexValue;
abstract public class ArrayField<T extends CommonIndexValue> implements
NumericDimensionField<ArrayWrapper<T>>
{
protected NumericDimensionField<T> elementField;
public ArrayField(
final NumericDimensionField<T> elementField ) {
this.elementField = elementField;
}
public ArrayField() {}
@Override
public byte[] toBinary() {
return PersistenceUtils.toBinary(elementField);
}
@Override
public void fromBinary(
final byte[] bytes ) {
elementField = PersistenceUtils.fromBinary(
bytes,
NumericDimensionField.class);
}
@Override
public double getRange() {
return elementField.getRange();
}
@Override
public double normalize(
final double value ) {
return elementField.normalize(value);
}
@Override
public double denormalize(
final double value ) {
return elementField.denormalize(value);
}
@Override
public ByteArrayId getFieldId() {
return elementField.getFieldId();
}
@Override
public BinRange[] getNormalizedRanges(
final NumericData range ) {
return elementField.getNormalizedRanges(range);
}
@Override
public NumericRange getDenormalizedRange(
final BinRange range ) {
return elementField.getDenormalizedRange(range);
}
@Override
public NumericData getNumericData(
final ArrayWrapper<T> dataElement ) {
Double min = null, max = null;
for (final T element : dataElement.getArray()) {
final NumericData data = elementField.getNumericData(element);
if ((min == null) || (max == null)) {
min = data.getMin();
max = data.getMax();
}
else {
min = Math.min(
min,
data.getMin());
max = Math.max(
max,
data.getMax());
}
}
if ((min == null) || (max == null)) {
return null;
}
if (min.equals(max)) {
return new NumericValue(
min);
}
return new NumericRange(
min,
max);
}
@Override
abstract public FieldWriter<?, ArrayWrapper<T>> getWriter();
@Override
abstract public FieldReader<ArrayWrapper<T>> getReader();
@Override
public NumericDimensionDefinition getBaseDefinition() {
return elementField.getBaseDefinition();
}
@Override
public int getFixedBinIdSize() {
return elementField.getFixedBinIdSize();
}
@Override
public NumericRange getBounds() {
return elementField.getBounds();
}
@Override
public NumericData getFullRange() {
return elementField.getFullRange();
}
}