@Override public IndexIterator getIndexIterator() throws JasDBStorageException { openIndex(); return new FullIndexIterator(rootBlock, lockManager, persister); }
private void handleBorrowLeft(TreeBlock parentBlock, TreeBlock leftSibbling) throws JasDBStorageException { //we can borrow from left TreeNode node = leftSibbling.getNodes().last(); //this block needs relinking IndexBlock danglingBlock = persister.loadBlock(node.getRight()); danglingBlock.setParentPointer(getPosition()); Key newKey = leftSibbling.getMax(); leftSibbling.removeNodeInternal(node); TreeNode newNode = new TreeNode(newKey, danglingBlock.getPosition(), treeNodes.first().getLeft()); treeNodes.put(newKey, newNode); parentBlock.updateBlockPointer(leftSibbling.getMax(), leftSibbling.getPosition(), getPosition()); }
protected void removeBlockPointer(Key minBlockValue, IndexBlock removedBlock) throws JasDBStorageException { TreeNode removeNode = treeNodes.getBefore(minBlockValue); // LOG.info("Closest remove node: {} nodes: {}", removeNode, treeNodes.size()); TreeNode next = treeNodes.next(removeNode.getKey()); if(next != null && removeNode.getLeft() != removedBlock.getPosition()) { //we need to relink the next block next.setLeft(removeNode.getLeft()); } treeNodes.remove(removeNode.getKey()); modified = true; handleBlockUnderflow(); }
protected long getRightSibbling(TreeBlock block) { TreeNode beforeNode = treeNodes.getBefore(block.getLast()); if(beforeNode.getRight() == block.getPosition()) { TreeNode nextNode = treeNodes.next(beforeNode.getKey()); return nextNode != null ? nextNode.getRight() : -1; } else { //this only happens with one node return beforeNode.getRight(); } }
protected long getLeftSibbling(TreeBlock block) { TreeNode beforeNode = treeNodes.getBefore(block.getFirst()); if(beforeNode.getLeft() != block.getPosition()) { return beforeNode.getLeft(); } else { return -1; } }
@Override public LeaveBlockProperties getProperties() { return new LeaveBlockProperties(getDataBlock(), -1, -1, -1); }
@Override public void setParentPointer(long block) { leaveProperties.setParentBlock(block); leaveProperties.setModified(true); }
@Override public boolean requiresWriteLock(BlockPersister persister, IndexBlock block) { if(block instanceof RootBlock) { return ((RootBlock)block).isLeave(); } else { return block instanceof LeaveBlock; } } }
@Override public LeaveBlockImpl createBlock(long parentBlock, DataBlock dataBlock) throws JasDBStorageException { LeaveBlockImpl leaveBlock = new LeaveBlockImpl(persister, dataBlock, parentBlock, true); return leaveBlock; } }
@Override public LeaveBlock findLeaveBlock(LockIntentType intent, Key key) throws JasDBStorageException { if(isLeave) { return this; } else { return super.findLeaveBlock(intent, key); } }
public IndexBlockEntry(BtreePlusBlockPersister persister, IndexBlock indexBlock) { this.persister = persister; this.indexBlock = indexBlock; this.blockPointer = indexBlock.getPosition(); }
@Override public LeaveBlock findFirstLeaveBlock(LockIntentType intentType) throws JasDBStorageException { if(isLeave) { return this; } else { return super.findFirstLeaveBlock(intentType); } }
@Override public long getParentPointer() { return getPosition(); }
@Override public MemoryAware getMemoryManager() throws JasDBStorageException { openIndex(); return persister; }
private void handleBorrowRight(TreeBlock parentBlock, TreeBlock rightSibbling) throws JasDBStorageException { //we can borrow from right TreeNode rightFirstNode = rightSibbling.getNodes().first(); IndexBlock danglingBlock = persister.loadBlock(rightFirstNode.getLeft()); danglingBlock.setParentPointer(getPosition()); Key newKey = getMax(); rightSibbling.removeNodeInternal(rightFirstNode); TreeNode newNode = new TreeNode(newKey, treeNodes.last().getRight(), danglingBlock.getPosition()); treeNodes.put(newKey, newNode); Key parentKey = getMax(); parentBlock.updateBlockPointer(parentKey, getPosition(), rightSibbling.getPosition()); }
@Override public boolean requiresWriteLock(BlockPersister persister, IndexBlock block) { if(block instanceof RootBlock) { return ((RootBlock)block).isLeave(); } else { return block instanceof LeaveBlock; } } }