Stage 12
BPlusSearch
BPlusTree::bPlusSearch(int relId, attrName, attrVal, op) {
AttrCacheTable::getSearchIndex(relId, attrName, &searchIndex);
int block = -1, slot = -1;
if(index == {-1,-1}) {
block = relCatEntry.firstBlk;
slot = 0;
if(block == -1) {
return RecId{-1,-1};
}
} else {
slot = index + 1;
if(index >= leafHead.numEntries) {
block = leafHead.rblock;
index = 0;
if(block == -1) {
return RecId{-1,-1};
}
}
}
while(StaticBuffer::getStaticBlockType(block) == IND_INTERNAL) {
if(op == NE || op == LT || op == LE) {
block = intEntry.lChild;
} else {
int entryIndex = 0;
while(entryIndex < numEntries) {
int cmpVal = compareAttrs(intEntry.attrVal, attrVal, attrCatEntry.attrType);
if(op == EQ || op == GE || op == GT) {
break;
}
entryIndex++;
}
if(entryIndex == numEntries) {
block = intEntry.lChild;
} else {
block = intEntry.rChild;
}
}
}
while(block != -1) {
IndLeaf leafBlk(block);
HeadInfo leafHead;
leafBlk.getHeader(&leafHeader);
while(index < leafHead.numEntries) {
int cmpVal;
if(matching) {
searchIndex.block = block;
searchIndex.slot = index;
AttrCacheTable::setSearchIndex(relId, attrName, &searchIndex);
return RecId{leafEntry.block, leafEntry.slot};
} else if(cmpVal > 0)
}
if(op != NE) break;
block = leafHead.rblock;
slot = 0;
};
return RecId{-1,-1};
}
int BPlusTree::createNewRoot(int relId, char attrName, attrVal, int lChild, int rChild) {
// initialize new root
/*
set lchild and rchild
set pblock
set the rootblock in the attrcache
*/
IndInteranal newRootBlock;
int newRootBlockNum = newRootBlock.getBlockNum();
blockHeader;
blockHeader.numEntries = 1;
setHeader(&blockHeader);
InternalEntry internalEntry;
internalEntry.lChild = lChild;
internalEntry.rChild = rChild;
internalEntry.attrVal = attrVal;
leftChildBlock.pblock = newRootBlockNum;
rightchildBlock.pblock = newRootBlockNum;
setHeader;
}
splitLeaf(int leafBlockNum, Index indices[]) {
IndLeaf rightBlock;
IndLeaf leafBlock(leaftBlockNum);
rightBlockNum.numEntries = 32;
rightBlockNum.pblock = leftBlockNum.pblock;
rightBlockNum.rblock = leftBlockNum.right;
rightBlockNum.lblock = leftBlockNum;
leftBlockHeader.numEntries = 32;
leftBlockHeader.rblock = rightBlockNum;
// set the values from the indices
}
insertIntoLeaf(int relId, char attrName, int leafBlockNum, Index indexEntry) {
IndLeaf leafBlock(leafBlockNum);
leafBlock.getHeader(&blockHeader);
Index indices[blockHeader.numEntries + 1];
// insert into indices
if(blockHeader.numEntries < MAX_KEYS_LEAF) {
blockHeader.numEntries++;
for(int i = 0; i < numEntries; i++) {
leafBlock.setEntry(&indices[i], i);
}
}
int rightBlock = splitLeaf(leafBlock, indices);
if(blockHeader.pblock != -1) {
InternalEntry middleVal;
return insertIntoInternal(relId, attrName, blockHeader.pblock, middleEntry);
} else {
createNewRoot(relId, attrName, indices[MIDDLE])
}
}
In bPlusInsert, if E_DISKFULL, rootblock is set to -1
splitInternal has reassigning of parents from MIDDLE_INDEX_INTENAL+1.lchild to the rightblock