@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; }
protected int pointerCmp(ITupleReference tupleA, ITupleReference tupleB, MultiComparator cmp) throws HyracksDataException { return childPtrCmp.compare(tupleA.getFieldData(cmp.getKeyFieldCount() - 1), getChildPointerOff(tupleA), childPtrSize, tupleB.getFieldData(cmp.getKeyFieldCount() - 1), getChildPointerOff(tupleB), childPtrSize); }
private void searchNextToken() throws HyracksDataException { if (tokenQueue.isEmpty()) { return; } if (!keyQueue.isEmpty()) { throw new IllegalStateException("Illegal call of initializing key queue"); } outputTokenElement = tokenQueue.poll(); initPushIntoKeyQueue(outputTokenElement); ITupleReference tokenTuple = getTokenTuple(outputTokenElement); outputTuple.setTokenTuple(tokenTuple); // pop all same tokens while (!tokenQueue.isEmpty()) { PriorityQueueElement tokenElement = tokenQueue.peek(); if (TupleUtils.equalTuples(tokenTuple, getTokenTuple(tokenElement), tokenCmp.getKeyFieldCount())) { initPushIntoKeyQueue(tokenElement); tokenQueue.poll(); } else { break; } } }
@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()); }
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; }
public boolean isPointPredicate(MultiComparator originalKeyComparator) throws HyracksDataException { if (getLowKey() == null) { return false; } if (getHighKey() == null) { return false; } if (!isLowKeyInclusive()) { return false; } if (!isHighKeyInclusive()) { return false; } if (getLowKeyComparator().getKeyFieldCount() != getHighKeyComparator().getKeyFieldCount()) { return false; } if (getLowKeyComparator().getKeyFieldCount() != originalKeyComparator.getKeyFieldCount()) { return false; } return originalKeyComparator.compare(getLowKey(), getHighKey()) == 0; } }
@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 PageValidationInfo() { this.numKeyFields = getCmp().getKeyFieldCount(); this.lowRangeBuilder = new ArrayTupleBuilder(numKeyFields); this.highRangeBuilder = new ArrayTupleBuilder(numKeyFields); this.lowRangeTuple = new ArrayTupleReference(); this.highRangeTuple = new ArrayTupleReference(); this.isLowRangeNull = true; this.isHighRangeNull = true; }
private void update(ITupleReference tuple, BTreeOpContext ctx) throws HyracksDataException { // This call only allows updating of non-key fields. // Updating a tuple's key necessitates deleting the old entry, and inserting the new entry. // The user of the BTree is responsible for dealing with non-key updates (i.e., doing a delete + insert). if (fieldCount == ctx.getCmp().getKeyFieldCount()) { HyracksDataException.create(ErrorCode.INDEX_NOT_UPDATABLE); } ctx.getModificationCallback().before(tuple); insertUpdateOrDelete(tuple, ctx); }
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 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; }
public static double area(ITupleReference tuple, MultiComparator cmp, IPrimitiveValueProvider[] keyValueProviders) { double area = 1.0; int maxFieldPos = cmp.getKeyFieldCount() / 2; for (int i = 0; i < maxFieldPos; i++) { int j = maxFieldPos + i; area *= keyValueProviders[j].getValue(tuple.getFieldData(j), tuple.getFieldStart(j)) - keyValueProviders[i].getValue(tuple.getFieldData(i), tuple.getFieldStart(i)); } return area; }
@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)); }
@Override public void enlarge(ITupleReference tuple, MultiComparator cmp) throws HyracksDataException { int maxFieldPos = cmp.getKeyFieldCount() / 2; for (int i = 0; i < maxFieldPos; i++) { int j = maxFieldPos + i; int c = cmp.getComparators()[i].compare(frameTuple.getFieldData(i), frameTuple.getFieldStart(i), frameTuple.getFieldLength(i), tuple.getFieldData(i), tuple.getFieldStart(i), tuple.getFieldLength(i)); if (c > 0) { System.arraycopy(tuple.getFieldData(i), tuple.getFieldStart(i), frameTuple.getFieldData(i), frameTuple.getFieldStart(i), tuple.getFieldLength(i)); } c = cmp.getComparators()[j].compare(frameTuple.getFieldData(j), frameTuple.getFieldStart(j), frameTuple.getFieldLength(j), tuple.getFieldData(j), tuple.getFieldStart(j), tuple.getFieldLength(j)); if (c < 0) { System.arraycopy(tuple.getFieldData(j), tuple.getFieldStart(j), frameTuple.getFieldData(j), frameTuple.getFieldStart(j), tuple.getFieldLength(j)); } } }
public static boolean containsRegion(ITupleReference tuple1, ITupleReference tuple2, MultiComparator cmp, IPrimitiveValueProvider[] keyValueProviders) throws HyracksDataException { int maxFieldPos = cmp.getKeyFieldCount() / 2; for (int i = 0; i < maxFieldPos; i++) { int j = maxFieldPos + i; int c = cmp.getComparators()[i].compare(tuple1.getFieldData(i), tuple1.getFieldStart(i), tuple1.getFieldLength(i), tuple2.getFieldData(i), tuple2.getFieldStart(i), tuple2.getFieldLength(i)); if (c > 0) { return false; } c = cmp.getComparators()[j].compare(tuple1.getFieldData(j), tuple1.getFieldStart(j), tuple1.getFieldLength(j), tuple2.getFieldData(j), tuple2.getFieldStart(j), tuple2.getFieldLength(j)); if (c < 0) { return false; } } return true; } }
@Override public boolean intersect(ITupleReference tuple, int tupleIndex, MultiComparator cmp) throws HyracksDataException { 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 false; } 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 false; } } return true; }