@Override public String toString() { StringBuilder aString = new StringBuilder(this.getClass().getSimpleName()).append('\n') .append("Tuple Count: " + getTupleCount()).append('\n') .append("Free Space offset: " + buf.getInt(Constants.FREE_SPACE_OFFSET)).append('\n') .append("Level: " + buf.get(Constants.LEVEL_OFFSET)).append('\n') .append("Version: " + buf.getInt(STORAGE_VERSION_OFFSET)).append('\n') .append("Max Page: " + buf.getInt(MAX_PAGE_OFFSET)).append('\n') .append("Root Page: " + buf.getInt(ROOT_PAGE_OFFSET)).append('\n') .append("Number of free pages: " + buf.getInt(FREE_PAGE_COUNT_OFFSET)); int tupleCount = getTupleCount(); int offset; for (int i = 0; i < tupleCount; i++) { offset = getTupleStart(i); int keyLength = buf.getInt(offset); aString.append('\n').append("Key " + i + " size = " + keyLength); offset += Integer.BYTES + keyLength; int valueLength = buf.getInt(offset); aString.append(", Value " + i + " size = " + valueLength); } return aString.toString(); } }
@Override public int getOffset(IValueReference key) { int index = find(key); if (index >= 0) { int offset = getTupleStart(index); return offset + key.getLength() + 2 * Integer.BYTES; } return -1; }
private void put(int index, IValueReference value) throws HyracksDataException { int offset = getTupleStart(index); int length = buf.getInt(offset); offset += Integer.BYTES + length; length = buf.getInt(offset); if (length != value.getLength()) { throw new HyracksDataException("This frame doesn't support overwriting dynamically sized values"); } offset += Integer.BYTES; System.arraycopy(value.getByteArray(), value.getStartOffset(), buf.array(), offset, value.getLength()); }
private int find(IValueReference key) { int tupleCount = getTupleCount(); int tupleStart = getTupleStart(0); for (int i = 0; i < tupleCount; i++) { if (isInner(key, tupleStart)) { return i; } tupleStart = getNextTupleStart(tupleStart); } return -1; }
@Override public void get(IValueReference key, IPointable value) { int tupleCount = getTupleCount(); int tupleStart = getTupleStart(0); for (int i = 0; i < tupleCount; i++) { if (isInner(key, tupleStart)) { get(tupleStart + key.getLength() + Integer.BYTES, value); return; } tupleStart = getNextTupleStart(tupleStart); } value.set(null, 0, 0); }