@Override public int getFieldCount() { return frameTuple.getFieldCount(); }
public ISplitKey duplicate(ITreeIndexTupleReference copyLeftTuple, ITreeIndexTupleReference copyRightTuple) { RTreeSplitKey copy = new RTreeSplitKey(copyLeftTuple, copyRightTuple); copy.leftPageData = leftPageData.clone(); copy.leftPageBuf = ByteBuffer.wrap(copy.leftPageData); copy.leftTuple.setFieldCount(leftTuple.getFieldCount()); copy.leftTuple.resetByTupleOffset(copy.leftPageBuf.array(), 0); copy.rightPageData = rightPageData.clone(); copy.rightPageBuf = ByteBuffer.wrap(copy.rightPageData); copy.rightTuple.setFieldCount(rightTuple.getFieldCount()); copy.rightTuple.resetByTupleOffset(copy.rightPageBuf.array(), 0); return copy; }
@Override public BTreeSplitKey duplicate(ITreeIndexTupleReference copyTuple) { BTreeSplitKey copy = new BTreeSplitKey(copyTuple); copy.data = data.clone(); copy.buf = ByteBuffer.wrap(copy.data); copy.tuple.setFieldCount(tuple.getFieldCount()); copy.tuple.resetByTupleOffset(copy.buf.array(), 0); return copy; } }
@Override public boolean compact() { resetSpaceParams(); int tupleCount = buf.getInt(Constants.TUPLE_COUNT_OFFSET); int freeSpace = buf.getInt(Constants.FREE_SPACE_OFFSET); ArrayList<SlotOffTupleOff> sortedTupleOffs = new ArrayList<>(); sortedTupleOffs.ensureCapacity(tupleCount); for (int i = 0; i < tupleCount; i++) { int slotOff = slotManager.getSlotOff(i); int tupleOff = slotManager.getTupleOff(slotOff); sortedTupleOffs.add(new SlotOffTupleOff(i, slotOff, tupleOff)); } Collections.sort(sortedTupleOffs); for (int i = 0; i < sortedTupleOffs.size(); i++) { int tupleOff = sortedTupleOffs.get(i).tupleOff; frameTuple.resetByTupleOffset(buf.array(), tupleOff); int tupleEndOff = frameTuple.getFieldStart(frameTuple.getFieldCount() - 1) + frameTuple.getFieldLength(frameTuple.getFieldCount() - 1); int tupleLength = tupleEndOff - tupleOff + childPtrSize; System.arraycopy(buf.array(), tupleOff, buf.array(), freeSpace, tupleLength); slotManager.setSlot(sortedTupleOffs.get(i).slotOff, freeSpace); freeSpace += tupleLength; } buf.putInt(Constants.FREE_SPACE_OFFSET, freeSpace); buf.putInt(TOTAL_FREE_SPACE_OFFSET, buf.capacity() - freeSpace - tupleCount * slotManager.getSlotSize()); return false; }
public ArrayList<Integer> getChildren(MultiComparator cmp) { ArrayList<Integer> ret = new ArrayList<>(); frameTuple.setFieldCount(cmp.getKeyFieldCount()); int tupleCount = buf.getInt(Constants.TUPLE_COUNT_OFFSET); for (int i = 0; i < tupleCount; i++) { int tupleOff = slotManager.getTupleOff(slotManager.getSlotOff(i)); frameTuple.resetByTupleOffset(buf.array(), tupleOff); int intVal = IntegerPointable.getInteger(buf.array(), frameTuple.getFieldStart(frameTuple.getFieldCount() - 1) + frameTuple.getFieldLength(frameTuple.getFieldCount() - 1)); ret.add(intVal); } return ret; }
int tupleOff = sortedTupleOffs.get(i).tupleOff; frameTuple.resetByTupleOffset(buf.array(), tupleOff); int tupleEndOff = frameTuple.getFieldStart(frameTuple.getFieldCount() - 1) + frameTuple.getFieldLength(frameTuple.getFieldCount() - 1); int tupleLength = tupleEndOff - tupleOff + CHILD_PTR_SIZE; System.arraycopy(buf.array(), tupleOff, buf.array(), freeSpace, tupleLength);
int tupleOff = sortedTupleOffs.get(i).tupleOff; frameTuple.resetByTupleOffset(buf.array(), tupleOff); int tupleEndOff = frameTuple.getFieldStart(frameTuple.getFieldCount() - 1) + frameTuple.getFieldLength(frameTuple.getFieldCount() - 1); int tupleLength = tupleEndOff - tupleOff; System.arraycopy(buf.array(), tupleOff, buf.array(), freeSpace, tupleLength);
public ArrayList<Integer> getChildren(MultiComparator cmp) { ArrayList<Integer> ret = new ArrayList<>(); frameTuple.setFieldCount(cmp.getKeyFieldCount()); int tupleCount = buf.getInt(Constants.TUPLE_COUNT_OFFSET); for (int i = 0; i < tupleCount; i++) { int tupleOff = slotManager.getTupleOff(slotManager.getSlotOff(i)); frameTuple.resetByTupleOffset(buf.array(), tupleOff); int intVal = IntegerPointable.getInteger(buf.array(), frameTuple.getFieldStart(frameTuple.getFieldCount() - 1) + frameTuple.getFieldLength(frameTuple.getFieldCount() - 1)); ret.add(intVal); } if (!isLeaf()) { int rightLeaf = buf.getInt(RIGHT_LEAF_OFFSET); if (rightLeaf > 0) { ret.add(buf.getInt(RIGHT_LEAF_OFFSET)); } } return ret; }
@SuppressWarnings("rawtypes") public static String printInteriorFrameTuples(IBTreeInteriorFrame interiorFrame, ISerializerDeserializer[] fieldSerdes) throws HyracksDataException { StringBuilder strBuilder = new StringBuilder(); ITreeIndexTupleReference tuple = interiorFrame.createTupleReference(); for (int i = 0; i < interiorFrame.getTupleCount(); i++) { tuple.resetByTupleIndex(interiorFrame, i); // Print child pointer. int numFields = tuple.getFieldCount(); int childPageId = IntegerPointable.getInteger(tuple.getFieldData(numFields - 1), tuple.getFieldStart(numFields - 1) + tuple.getFieldLength(numFields - 1)); strBuilder.append("(" + childPageId + ") "); String tupleString = TupleUtils.printTuple(tuple, fieldSerdes); strBuilder.append(tupleString + " | "); } // Print rightmost pointer. int rightMostChildPageId = interiorFrame.getRightmostChildPageId(); strBuilder.append("(" + rightMostChildPageId + ")"); return strBuilder.toString(); }
public int findPrefix(ITupleReference tuple, ITreeIndexTupleReference framePrefixTuple) throws HyracksDataException { int prefixMid; int prefixBegin = 0; int prefixEnd = frame.getPrefixTupleCount() - 1; if (frame.getPrefixTupleCount() > 0) { while (prefixBegin <= prefixEnd) { prefixMid = (prefixBegin + prefixEnd) / 2; framePrefixTuple.resetByTupleIndex(frame, prefixMid); int cmpVal = cmp.fieldRangeCompare(tuple, framePrefixTuple, 0, framePrefixTuple.getFieldCount()); if (cmpVal < 0) prefixEnd = prefixMid - 1; else if (cmpVal > 0) prefixBegin = prefixMid + 1; else return prefixMid; } } return FieldPrefixSlotManager.TUPLE_UNCOMPRESSED; }
@Override public int findTupleIndex(ITupleReference searchKey, ITreeIndexTupleReference frameTuple, MultiComparator multiCmp, FindTupleMode mode, FindTupleNoExactMatchPolicy matchPolicy) throws HyracksDataException { if (searchKey.getFieldCount() == frameTuple.getFieldCount()) { int maxFieldPos = multiCmp.getKeyFieldCount() / 2; for (int i = 0; i < frame.getTupleCount(); i++) { int remainingFieldCount = frameTuple.getFieldCount() - multiCmp.getKeyFieldCount(); for (int j = multiCmp.getKeyFieldCount(); j < multiCmp.getKeyFieldCount() + remainingFieldCount; j++) { if (!compareField(searchKey, frameTuple, j)) {
prefixMid = (prefixBegin + prefixEnd) / 2; framePrefixTuple.resetByTupleIndex(frame, prefixMid); int cmp = multiCmp.fieldRangeCompare(searchKey, framePrefixTuple, 0, framePrefixTuple.getFieldCount()); if (cmp < 0) { prefixEnd = prefixMid - 1;