public RTreeNSMInteriorFrame(ITreeIndexTupleWriter tupleWriter, IPrimitiveValueProvider[] keyValueProviders, RTreePolicyType rtreePolicyType, boolean isPointMBR) { super(tupleWriter, keyValueProviders, rtreePolicyType, isPointMBR); keyFieldCount = keyValueProviders.length; frameTuple.setFieldCount(keyFieldCount); }
@Override public ITreeIndexTupleReference createTupleReference() { ITreeIndexTupleReference tuple = tupleWriter.createTupleReference(); tuple.setFieldCount(keyFieldCount); return tuple; }
@Override public void setMultiComparator(MultiComparator cmp) { this.cmp = cmp; cmpFrameTuple.setFieldCount(cmp.getKeyFieldCount()); frameTuple.setFieldCount(cmp.getKeyFieldCount()); previousFt.setFieldCount(cmp.getKeyFieldCount()); }
@Override public ITreeIndexTupleReference createTupleReference() { ITreeIndexTupleReference tuple = tupleWriter.createTupleReference(); tuple.setFieldCount(cmp.getKeyFieldCount()); return tuple; }
@Override public void insert(ITupleReference tuple, int tupleIndex) { frameTuple.setFieldCount(tuple.getFieldCount()); slotManager.insertSlot(AbstractSlotManager.GREATEST_KEY_INDICATOR, buf.getInt(Constants.FREE_SPACE_OFFSET)); int freeSpace = buf.getInt(Constants.FREE_SPACE_OFFSET); int bytesWritten = tupleWriter.writeTupleFields(tuple, 0, tuple.getFieldCount(), buf.array(), freeSpace); System.arraycopy(tuple.getFieldData(tuple.getFieldCount() - 1), getChildPointerOff(tuple), buf.array(), freeSpace + bytesWritten, childPtrSize); int tupleSize = bytesWritten + childPtrSize; buf.putInt(Constants.TUPLE_COUNT_OFFSET, buf.getInt(Constants.TUPLE_COUNT_OFFSET) + 1); buf.putInt(Constants.FREE_SPACE_OFFSET, buf.getInt(Constants.FREE_SPACE_OFFSET) + tupleSize); buf.putInt(TOTAL_FREE_SPACE_OFFSET, buf.getInt(TOTAL_FREE_SPACE_OFFSET) - tupleSize - slotManager.getSlotSize()); }
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 void delete(int tupleIndex, MultiComparator cmp) { frameTuple.setFieldCount(cmp.getKeyFieldCount()); int slotOff = slotManager.getSlotOff(tupleIndex); int tupleOff = slotManager.getTupleOff(slotOff); frameTuple.resetByTupleOffset(buf.array(), tupleOff); int tupleSize = tupleWriter.bytesRequired(frameTuple); // perform deletion (we just do a memcpy to overwrite the slot) int slotStartOff = slotManager.getSlotEndOff(); int length = slotOff - slotStartOff; System.arraycopy(buf.array(), slotStartOff, buf.array(), slotStartOff + slotManager.getSlotSize(), length); // maintain space information buf.putInt(Constants.TUPLE_COUNT_OFFSET, buf.getInt(Constants.TUPLE_COUNT_OFFSET) - 1); buf.putInt(TOTAL_FREE_SPACE_OFFSET, buf.getInt(TOTAL_FREE_SPACE_OFFSET) + tupleSize + childPtrSize + slotManager.getSlotSize()); }
@Override public void adjustMBR() { for (int i = 0; i < mbrTuples.length; i++) { mbrTuples[i].setFieldCount(getFieldCount()); mbrTuples[i].resetByTupleIndex(this, 0); } calculateMBRImpl(mbrTuples); }
protected void addLevel() throws HyracksDataException { NodeFrontier frontier = new NodeFrontier(tupleWriter.createTupleReference()); frontier.page = bufferCache.confiscatePage(IBufferCache.INVALID_DPID); frontier.pageId = -1; frontier.lastTuple.setFieldCount(cmp.getKeyFieldCount()); interiorFrame.setPage(frontier.page); interiorFrame.initBuffer((byte) nodeFrontiers.size()); nodeFrontiers.add(frontier); }
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; }
@Override public void adjustKey(ITupleReference tuple, int tupleIndex, MultiComparator cmp) throws HyracksDataException { frameTuple.setFieldCount(cmp.getKeyFieldCount()); if (tupleIndex == -1) { tupleIndex = findTupleByPointer(tuple, cmp); } if (tupleIndex != -1) { tupleWriter.writeTuple(tuple, buf.array(), getTupleOffset(tupleIndex)); } else { throw HyracksDataException.create(ErrorCode.FAILED_TO_FIND_TUPLE); } }
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; }
@Override public int findTupleByPointer(ITupleReference tuple, MultiComparator cmp) throws HyracksDataException { frameTuple.setFieldCount(cmp.getKeyFieldCount()); for (int i = 0; i < getTupleCount(); i++) { frameTuple.resetByTupleIndex(this, i); int c = pointerCmp(frameTuple, tuple, cmp); if (c == 0) { return i; } } return -1; }
public BTreeBulkLoader(float fillFactor, boolean verifyInput) throws HyracksDataException { super(fillFactor); this.verifyInput = verifyInput; splitKey = new BTreeSplitKey(leafFrame.getTupleWriter().createTupleReference()); splitKey.getTuple().setFieldCount(cmp.getKeyFieldCount()); }
@Override public int findBestChildPosition(ITreeIndexFrame frame, ITupleReference tuple, ITreeIndexTupleReference frameTuple, MultiComparator cmp) throws HyracksDataException { cmpFrameTuple.setFieldCount(cmp.getKeyFieldCount()); frameTuple.setFieldCount(cmp.getKeyFieldCount()); int bestChild = 0; double minEnlargedArea = Double.MAX_VALUE; // find minimum enlarged area, use minimum area to break tie for (int i = 0; i < frame.getTupleCount(); i++) { frameTuple.resetByTupleIndex(frame, i); double enlargedArea = RTreeComputationUtils.enlargedArea(frameTuple, tuple, cmp, keyValueProviders); if (enlargedArea < minEnlargedArea) { minEnlargedArea = enlargedArea; bestChild = i; } else if (enlargedArea == minEnlargedArea) { double area = RTreeComputationUtils.area(frameTuple, cmp, keyValueProviders); frameTuple.resetByTupleIndex(frame, bestChild); double minArea = RTreeComputationUtils.area(frameTuple, cmp, keyValueProviders); if (area < minArea) { bestChild = i; } } } return bestChild; }
@Override public int findTupleByPointer(ITupleReference tuple, PathList traverseList, int parentIndex, MultiComparator cmp) throws HyracksDataException { frameTuple.setFieldCount(cmp.getKeyFieldCount()); for (int i = 0; i < getTupleCount(); i++) { frameTuple.resetByTupleIndex(this, i); int c = pointerCmp(frameTuple, tuple, cmp); if (c == 0) { return i; } else { int pageId = IntegerPointable.getInteger(frameTuple.getFieldData(cmp.getKeyFieldCount() - 1), getChildPointerOff(frameTuple)); traverseList.add(pageId, -1, parentIndex); } } return -1; }
private void delete(ITupleReference tuple, RTreeOpContext ctx) throws HyracksDataException { ctx.reset(); ctx.setTuple(tuple); ctx.getSplitKey().reset(); ctx.getSplitKey().getLeftTuple().setFieldCount(cmpFactories.length); // We delete the first matching tuple (including the payload data). // We don't update the MBRs of the parents after deleting the record. int tupleIndex = findTupleToDelete(ctx); if (tupleIndex != -1) { try { deleteTuple(tupleIndex, ctx); } finally { ctx.getLeafFrame().getPage().releaseWriteLatch(true); bufferCache.unpin(ctx.getLeafFrame().getPage()); } } }
@Override public int getChildPageIdIfIntersect(ITupleReference tuple, int tupleIndex, MultiComparator cmp) throws HyracksDataException { frameTuple.setFieldCount(cmp.getKeyFieldCount()); frameTuple.resetByTupleIndex(this, tupleIndex); int maxFieldPos = cmp.getKeyFieldCount() / 2; for (int i = 0; i < maxFieldPos; i++) { int j = maxFieldPos + i; int c = cmp.getComparators()[i].compare(tuple.getFieldData(i), tuple.getFieldStart(i), tuple.getFieldLength(i), frameTuple.getFieldData(j), frameTuple.getFieldStart(j), frameTuple.getFieldLength(j)); if (c > 0) { return -1; } c = cmp.getComparators()[i].compare(tuple.getFieldData(j), tuple.getFieldStart(j), tuple.getFieldLength(j), frameTuple.getFieldData(i), frameTuple.getFieldStart(i), frameTuple.getFieldLength(i)); if (c < 0) { return -1; } } return buf.getInt(getChildPointerOff(frameTuple)); }
ctx.getPred().setHighKey(tuple, true); ctx.getSplitKey().reset(); ctx.getSplitKey().getTuple().setFieldCount(ctx.getCmp().getKeyFieldCount());