package mil.nga.giat.geowave.core.index.sfc.data;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import mil.nga.giat.geowave.core.index.PersistenceUtils;
/**
* The Basic Index Result class creates an object associated with a generic
* query. This class can be used when the dimensions and/or axis are generic.
*
*/
public class BasicNumericDataset implements
MultiDimensionalNumericData
{
private NumericData[] dataPerDimension;
/**
* Open ended/unconstrained
*/
public BasicNumericDataset() {
dataPerDimension = new NumericData[0];
}
/**
* Constructor used to create a new Basic Numeric Dataset object.
*
* @param dataPerDimension
* an array of numeric data objects
*/
public BasicNumericDataset(
final NumericData[] dataPerDimension ) {
this.dataPerDimension = dataPerDimension;
}
/**
* @return all of the maximum values (for each dimension)
*/
@Override
public double[] getMaxValuesPerDimension() {
final NumericData[] ranges = getDataPerDimension();
final double[] maxPerDimension = new double[ranges.length];
for (int d = 0; d < ranges.length; d++) {
maxPerDimension[d] = ranges[d].getMax();
}
return maxPerDimension;
}
/**
* @return all of the minimum values (for each dimension)
*/
@Override
public double[] getMinValuesPerDimension() {
final NumericData[] ranges = getDataPerDimension();
final double[] minPerDimension = new double[ranges.length];
for (int d = 0; d < ranges.length; d++) {
minPerDimension[d] = ranges[d].getMin();
}
return minPerDimension;
}
/**
* @return all of the centroid values (for each dimension)
*/
@Override
public double[] getCentroidPerDimension() {
final NumericData[] ranges = getDataPerDimension();
final double[] centroid = new double[ranges.length];
for (int d = 0; d < ranges.length; d++) {
centroid[d] = ranges[d].getCentroid();
}
return centroid;
}
/**
*
* @return an array of NumericData objects
*/
@Override
public NumericData[] getDataPerDimension() {
return dataPerDimension;
}
/**
* @return the number of dimensions associated with this data set
*/
@Override
public int getDimensionCount() {
return dataPerDimension.length;
}
@Override
public boolean isEmpty() {
return (dataPerDimension == null) || (dataPerDimension.length == 0);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = (prime * result) + Arrays.hashCode(dataPerDimension);
return result;
}
@Override
public boolean equals(
final Object obj ) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final BasicNumericDataset other = (BasicNumericDataset) obj;
if (!Arrays.equals(
dataPerDimension,
other.dataPerDimension)) {
return false;
}
return true;
}
@Override
public byte[] toBinary() {
int totalBytes = 4;
final List<byte[]> serializedData = new ArrayList<byte[]>();
for (final NumericData data : dataPerDimension) {
final byte[] binary = PersistenceUtils.toBinary(data);
totalBytes += (binary.length + 4);
serializedData.add(binary);
}
final ByteBuffer buf = ByteBuffer.allocate(totalBytes);
buf.putInt(dataPerDimension.length);
for (final byte[] binary : serializedData) {
buf.putInt(binary.length);
buf.put(binary);
}
return buf.array();
}
@Override
public void fromBinary(
final byte[] bytes ) {
final ByteBuffer buf = ByteBuffer.wrap(bytes);
final int numDimensions = buf.getInt();
dataPerDimension = new NumericData[numDimensions];
for (int d = 0; d < numDimensions; d++) {
final byte[] binary = new byte[buf.getInt()];
buf.get(binary);
dataPerDimension[d] = PersistenceUtils.fromBinary(
binary,
NumericData.class);
}
}
}