package mil.nga.giat.geowave.datastore.hbase.mapreduce; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.io.InvalidObjectException; import org.apache.hadoop.io.WritableUtils; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.ByteArrayRange; import mil.nga.giat.geowave.mapreduce.splits.GeoWaveRowRange; public class HBaseRowRange implements GeoWaveRowRange { private ByteArrayRange range; private boolean infiniteStartKey = false; private boolean infiniteEndKey = false; public HBaseRowRange( final ByteArrayRange range ) { this.range = range; } public HBaseRowRange() { range = null; infiniteStartKey = true; infiniteEndKey = true; } public ByteArrayRange getRange() { return range; } @Override public void write( final DataOutput out ) throws IOException { byte[] startBytes = new byte[0]; byte[] endBytes = new byte[0]; if (!infiniteStartKey) { startBytes = range.getStart().getBytes(); } if (!infiniteEndKey) { endBytes = range.getEnd().getBytes(); } out.writeBoolean(infiniteStartKey); out.writeBoolean(infiniteEndKey); WritableUtils.writeVInt( out, startBytes.length); WritableUtils.writeVInt( out, endBytes.length); out.write(startBytes); out.write(endBytes); } @Override public void readFields( final DataInput in ) throws IOException { infiniteStartKey = in.readBoolean(); infiniteEndKey = in.readBoolean(); final int startKeyLen = WritableUtils.readVInt(in); final int endKeyLen = WritableUtils.readVInt(in); byte[] startBytes = null; byte[] endBytes = null; if (!infiniteStartKey) { startBytes = new byte[startKeyLen]; in.readFully(startBytes); } if (!infiniteEndKey) { endBytes = new byte[endKeyLen]; in.readFully(endBytes); } range = new ByteArrayRange( new ByteArrayId( startBytes), new ByteArrayId( endBytes)); if (range.getStart().compareTo( range.getEnd()) > 0) { throw new InvalidObjectException( "Start key must be less than end key in range (" + range.getStart().getHexString() + ", " + range.getEnd().getHexString() + ")"); } } @Override public byte[] getStartKey() { if (!infiniteStartKey) { return range.getStart().getBytes(); } return null; } @Override public byte[] getEndKey() { if (!infiniteEndKey) { return range.getEnd().getBytes(); } return null; } @Override public boolean isStartKeyInclusive() { return true; } @Override public boolean isEndKeyInclusive() { return false; } @Override public boolean isInfiniteStartKey() { return infiniteStartKey; } @Override public boolean isInfiniteStopKey() { return infiniteEndKey; } }