package mil.nga.giat.geowave.core.store.base; import java.nio.ByteBuffer; import java.util.Arrays; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * This class encapsulates the elements that compose the row ID * * */ @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "private class only accessed internally") public class EntryRowID implements Comparable<EntryRowID> { private final byte[] insertionId; private final byte[] dataId; private final byte[] adapterId; private final int numberOfDuplicates; public EntryRowID( final byte[] byteID ) { final byte[] metadata = Arrays.copyOfRange( byteID, byteID.length - 12, byteID.length); final ByteBuffer metadataBuf = ByteBuffer.wrap(metadata); final int adapterIdLength = metadataBuf.getInt(); final int dataIdLength = metadataBuf.getInt(); final int numberOfDuplicates = metadataBuf.getInt(); final ByteBuffer buf = ByteBuffer.wrap( byteID, 0, byteID.length - 12); final byte[] insertionId = new byte[byteID.length - 12 - adapterIdLength - dataIdLength]; final byte[] adapterId = new byte[adapterIdLength]; final byte[] dataId = new byte[dataIdLength]; buf.get(insertionId); buf.get(adapterId); buf.get(dataId); this.insertionId = insertionId; this.dataId = dataId; this.adapterId = adapterId; this.numberOfDuplicates = numberOfDuplicates; } public EntryRowID( final byte[] indexId, final byte[] dataId, final byte[] adapterId, final int numberOfDuplicates ) { insertionId = indexId; this.dataId = dataId; this.adapterId = adapterId; this.numberOfDuplicates = numberOfDuplicates; } public byte[] getRowId() { final ByteBuffer buf = ByteBuffer.allocate(12 + dataId.length + adapterId.length + insertionId.length); buf.put(insertionId); buf.put(adapterId); buf.put(dataId); buf.putInt(adapterId.length); buf.putInt(dataId.length); buf.putInt(numberOfDuplicates); return buf.array(); } public byte[] getInsertionId() { return insertionId; } public byte[] getDataId() { return dataId; } public byte[] getAdapterId() { return adapterId; } public int getNumberOfDuplicates() { return numberOfDuplicates; } public boolean isDeduplicationEnabled() { return numberOfDuplicates >= 0; } @Override public int compareTo( final EntryRowID other ) { final int indexIdCompare = compare( insertionId, other.insertionId); if (indexIdCompare != 0) { return indexIdCompare; } final int dataIdCompare = compare( dataId, other.dataId); if (dataIdCompare != 0) { return dataIdCompare; } final int adapterIdCompare = compare( adapterId, other.adapterId); if (adapterIdCompare != 0) { return adapterIdCompare; } return 0; } private static final int compare( final byte[] a, final byte[] b ) { int j = 0; for (final byte aByte : a) { if (b.length <= j) { break; } final int val = aByte - b[j]; if (val != 0) { return val; } j++; } return a.length - b.length; } @Override public int hashCode() { final int prime = 31; int result = 1; result = (prime * result) + Arrays.hashCode(adapterId); result = (prime * result) + Arrays.hashCode(dataId); result = (prime * result) + Arrays.hashCode(insertionId); result = (prime * result) + numberOfDuplicates; 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 EntryRowID other = (EntryRowID) obj; if (!Arrays.equals( adapterId, other.adapterId)) { return false; } if (!Arrays.equals( dataId, other.dataId)) { return false; } if (!Arrays.equals( insertionId, other.insertionId)) { return false; } if (numberOfDuplicates != other.numberOfDuplicates) { return false; } return true; } }