public ITupleReference getLeftmostTuple() { int tupleCount = getTupleCount(); if (tupleCount == 0) { return null; } else { frameTuple.resetByTupleIndex(this, 0); return frameTuple; } }
@Override public int getChildPageId(int tupleIndex) { frameTuple.resetByTupleIndex(this, tupleIndex); return buf.getInt(getChildPointerOff(frameTuple)); }
public ITupleReference getRightmostTuple() { int tupleCount = getTupleCount(); if (tupleCount == 0) { return null; } else { frameTuple.resetByTupleIndex(this, tupleCount - 1); return frameTuple; } } }
@Override public boolean doHasNext() throws HyracksDataException { if (currentPageId > maxPageId) { return false; } if (tupleIndex >= frame.getTupleCount()) { boolean nextLeafExists = positionToNextLeaf(true); if (nextLeafExists) { frameTuple.resetByTupleIndex(frame, tupleIndex); return true; } else { return false; } } frameTuple.resetByTupleIndex(frame, tupleIndex); return true; }
@Override public int findBestChild(ITupleReference tuple, MultiComparator cmp) throws HyracksDataException { int bestChild = rtreePolicy.findBestChildPosition(this, tuple, frameTuple, cmp); frameTuple.resetByTupleIndex(this, bestChild); return buf.getInt(getChildPointerOff(frameTuple)); }
public static String printFrameTuples(ITreeIndexFrame frame, ISerializerDeserializer[] fieldSerdes) throws HyracksDataException { StringBuilder strBuilder = new StringBuilder(); ITreeIndexTupleReference tuple = frame.createTupleReference(); for (int i = 0; i < frame.getTupleCount(); i++) { tuple.resetByTupleIndex(frame, i); String tupleString = TupleUtils.printTuple(tuple, fieldSerdes); strBuilder.append(tupleString); if (i != frame.getTupleCount() - 1) { strBuilder.append(" | "); } } return strBuilder.toString(); } }
@SuppressWarnings("rawtypes") public static String printLeafFrameTuples(IBTreeLeafFrame leafFrame, ISerializerDeserializer[] fieldSerdes) throws HyracksDataException { StringBuilder strBuilder = new StringBuilder(); ITreeIndexTupleReference tuple = leafFrame.createTupleReference(); for (int i = 0; i < leafFrame.getTupleCount(); i++) { tuple.resetByTupleIndex(leafFrame, i); String tupleString = TupleUtils.printTuple(tuple, fieldSerdes); strBuilder.append(tupleString + " | "); } // Print right link. int rightPageId = leafFrame.getNextLeaf(); strBuilder.append("(" + rightPageId + ")"); return strBuilder.toString(); }
@Override public void validate(PageValidationInfo pvi) throws HyracksDataException { int tupleCount = getTupleCount(); for (int i = 0; i < tupleCount; i++) { frameTuple.resetByTupleIndex(this, i); if (!pvi.isLowRangeNull) { assert cmp.compare(pvi.lowRangeTuple, frameTuple) < 0; } if (!pvi.isHighRangeNull) { assert cmp.compare(pvi.highRangeTuple, frameTuple) >= 0; } if (i > 0) { previousFt.resetByTupleIndex(this, i - 1); assert cmp.compare(previousFt, frameTuple) < 0; } } }
@Override public ITupleReference getBeforeTuple(ITupleReference tuple, int targetTupleIndex, MultiComparator cmp) throws HyracksDataException { // Examine the tuple index to determine whether it is valid or not. if (targetTupleIndex != slotManager.getGreatestKeyIndicator()) { // We need to check the key to determine whether it's an insert or an update. frameTuple.resetByTupleIndex(this, targetTupleIndex); if (cmp.compare(tuple, frameTuple) == 0) { // The keys match, it's an update. return frameTuple; } } // Either the tuple index is a special indicator, or the keys don't match. // In those cases, we are definitely dealing with an insert. return null; } }
@Override public void validate(PageValidationInfo pvi) throws HyracksDataException { int tupleCount = getTupleCount(); for (int i = 0; i < tupleCount; i++) { frameTuple.resetByTupleIndex(this, i); if (!pvi.isLowRangeNull) { assert cmp.compare(pvi.lowRangeTuple, frameTuple) < 0; } if (!pvi.isHighRangeNull) { assert cmp.compare(pvi.highRangeTuple, frameTuple) >= 0; } if (i > 0) { previousFt.resetByTupleIndex(this, i - 1); assert cmp.compare(previousFt, frameTuple) < 0; } } } }
@Override public ITupleReference getMatchingKeyTuple(ITupleReference searchTuple, int targetTupleIndex) throws HyracksDataException { // Examine the tuple index to determine whether it is valid or not. if (targetTupleIndex != slotManager.getGreatestKeyIndicator()) { // We need to check the key to determine whether it's an insert or // an update/delete frameTuple.resetByTupleIndex(this, targetTupleIndex); if (cmp.compare(searchTuple, frameTuple) == 0) { // The keys match, it's an update/delete return frameTuple; } } // Either the tuple index is a special indicator, or the keys don't // match. // In those cases, we are definitely dealing with an insert. return null; }
@Override public void adjustMBR() { for (int i = 0; i < mbrTuples.length; i++) { mbrTuples[i].setFieldCount(getFieldCount()); mbrTuples[i].resetByTupleIndex(this, 0); } calculateMBRImpl(mbrTuples); }
@Override public FrameOpSpaceStatus hasSpaceUpdate(ITupleReference newTuple, int oldTupleIndex) { frameTuple.resetByTupleIndex(this, oldTupleIndex); int oldTupleBytes = frameTuple.getTupleSize(); int newTupleBytes = tupleWriter.bytesRequired(newTuple); return hasSpaceUpdate(oldTupleBytes, newTupleBytes); }
@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 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; }
protected void calculateMBRImpl(ITreeIndexTupleReference[] tuples) { int maxFieldPos = keyValueProviders.length / 2; for (int i = 1; i < getTupleCount(); i++) { frameTuple.resetByTupleIndex(this, i); for (int j = 0; j < maxFieldPos; j++) { int k = maxFieldPos + j; double valA = keyValueProviders[j].getValue(frameTuple.getFieldData(j), frameTuple.getFieldStart(j)); double valB = keyValueProviders[j].getValue(tuples[j].getFieldData(j), tuples[j].getFieldStart(j)); if (valA < valB) { tuples[j].resetByTupleIndex(this, i); } valA = keyValueProviders[k].getValue(frameTuple.getFieldData(k), frameTuple.getFieldStart(k)); valB = keyValueProviders[k].getValue(tuples[k].getFieldData(k), tuples[k].getFieldStart(k)); if (valA > valB) { tuples[k].resetByTupleIndex(this, i); } } } }
@Override public FrameOpSpaceStatus hasSpaceUpdate(ITupleReference newTuple, int oldTupleIndex) { frameTuple.resetByTupleIndex(this, oldTupleIndex); int oldTupleBytes = frameTuple.getTupleSize(); int newTupleBytes = tupleWriter.bytesRequired(newTuple); FrameOpSpaceStatus status = hasSpaceUpdate(oldTupleBytes, newTupleBytes); if (status == FrameOpSpaceStatus.INSUFFICIENT_SPACE && (getLargeFlag() || getTupleCount() == 1) && isLargeTuple(newTupleBytes)) { return FrameOpSpaceStatus.EXPAND; } return status; }
public void generateDist(ITreeIndexFrame leftRTreeFrame, ITreeIndexTupleReference frameTuple, ITupleReference tuple, TupleEntryArrayList entries, Rectangle rec, int start, int end) { int j = 0; while (entries.get(j).getTupleIndex() == -1) { j++; } frameTuple.resetByTupleIndex(leftRTreeFrame, entries.get(j).getTupleIndex()); rec.set(frameTuple, keyValueProviders); for (int i = start; i < end; ++i) { if (i != j) { if (entries.get(i).getTupleIndex() != -1) { frameTuple.resetByTupleIndex(leftRTreeFrame, entries.get(i).getTupleIndex()); rec.enlarge(frameTuple, keyValueProviders); } else { rec.enlarge(tuple, keyValueProviders); } } } }
@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; }
@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)); }