@Override public ITreeIndexMetadataFrame createFrame() { return new LIFOMetaDataFrame(); } }
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; }
private int getTupleStart(int index) { int offset = HEADER_END_OFFSET; int i = 0; while (i < index) { i++; offset = getNextTupleStart(offset); } return offset; }
@Override public void initBuffer(byte level) { super.initBuffer(level); buf.putInt(RIGHT_LEAF_OFFSET, -1); }
@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; }
@Override public IMetadataPageManager createPageManager(IBufferCache bufferCache) { return new LinkedMetaDataPageManager(bufferCache, new LIFOMetaDataFrameFactory()); }
@Override public boolean isMetadataPage() { return getLevel() == META_PAGE_LEVEL_INDICATOR; }
public ITupleReference getLeftmostTuple() { int tupleCount = getTupleCount(); if (tupleCount == 0) { return null; } else { frameTuple.resetByTupleIndex(this, 0); return frameTuple; } }
@Override public int getMaxTupleSize(int pageSize) { return (pageSize - getPageHeaderSize()) / 2; }
@Override public int getSlotOff(int tupleIndex) { return getSlotStartOff() - tupleIndex * slotSize; }
@Override public int getFreePage() { int freePages = buf.getInt(FREE_PAGE_COUNT_OFFSET); if (freePages > 0) { decrement(FREE_PAGE_COUNT_OFFSET); return buf.getInt(buf.array().length - Integer.BYTES * freePages); } return -1; }
@Override public void addFreePage(int freePage) { increment(FREE_PAGE_COUNT_OFFSET); int numFreePages = buf.getInt(FREE_PAGE_COUNT_OFFSET); buf.putInt(buf.array().length - (Integer.BYTES * numFreePages), freePage); }
@Override public String printHeader() { StringBuilder strBuilder = new StringBuilder(super.printHeader()); strBuilder.append("nextLeafOff: " + NEXT_LEAF_OFFSET + "\n"); return strBuilder.toString(); } }
@Override public void initBuffer(byte level) { buf.putLong(PAGE_LSN_OFFSET, 0); // TODO: might to set to a different lsn // during creation buf.putInt(Constants.TUPLE_COUNT_OFFSET, 0); resetSpaceParams(); buf.put(Constants.LEVEL_OFFSET, level); buf.put(FLAG_OFFSET, (byte) 0); }
@Override public void init() { buf.putInt(Constants.TUPLE_COUNT_OFFSET, 0); buf.putInt(Constants.FREE_SPACE_OFFSET, HEADER_END_OFFSET); buf.putInt(MAX_PAGE_OFFSET, 0); buf.put(Constants.LEVEL_OFFSET, META_PAGE_LEVEL_INDICATOR); buf.putInt(NEXT_PAGE_OFFSET, -1); buf.putInt(ROOT_PAGE_OFFSET, 1); buf.putInt(FREE_PAGE_COUNT_OFFSET, 0); buf.putInt(STORAGE_VERSION_OFFSET, ITreeIndexFrame.Constants.VERSION); setValid(false); }
@Override public FrameOpSpaceStatus hasSpaceInsert(ITupleReference tuple) throws HyracksDataException { int tupleSize = getBytesRequiredToWriteTuple(tuple); if (isLargeTuple(tupleSize)) { // when do we want to overload this frame instead of creating a new one? // If we have fewer than two tuples in the frame, grow the current page return getTupleCount() < 2 ? FrameOpSpaceStatus.EXPAND : FrameOpSpaceStatus.INSUFFICIENT_SPACE; } else { return super.hasSpaceInsert(tuple); } }
@Override public void initBuffer(byte level) { super.initBuffer(level); buf.putInt(NEXT_LEAF_OFFSET, -1); }
@Override public boolean isFreePage() { return getLevel() == FREE_PAGE_LEVEL_INDICATOR; }
public ITupleReference getRightmostTuple() { int tupleCount = getTupleCount(); if (tupleCount == 0) { return null; } else { frameTuple.resetByTupleIndex(this, tupleCount - 1); return frameTuple; } } }
@Override public void initBuffer(byte level) { super.initBuffer(level); buf.putLong(PAGE_NSN_OFFSET, 0); buf.putInt(RIGHT_PAGE_OFFSET, -1); }