@Override protected Record internalMaxRecord(AccessPath path) { BPTreePage page = get(count) ; trackPath(path, this, count, page) ; Record r = page.internalMaxRecord(path) ; page.release() ; return r ; }
/** Promote a single page. Assumes the path to this page has been handled in some way elsewhere */ static boolean promote1(BPTreePage page, BPTreeNode node, int idx) { //System.out.println("promote1: "+page.getBlockMgr().getLabel()+" "+page.getBackingBlock().getId()) ; boolean changed = page.promote() ; node.ptrs.set(idx, page.getId()) ; return changed ; }
BPTreePage page = left.merge(right, splitKey) ; left.write() ; left.release() ; right.free() ; if ( left.getCount() + 1 != left.getMaxSize() && left.getCount() != left.getMaxSize() ) BPT.error("Inconsistent data node size: %d/%d", left.getCount(), left.getMaxSize()) ; } else if ( !left.isFull() ) { BPT.error("Inconsistent node size: %d/%d", left.getCount(), left.getMaxSize()) ;
private void split(AccessPath path, int idx, BPTreePage y) { log(log, "split >> y=%s this=%s idx=%d", y.getRefStr(), this.getRefStr(), idx) ; log(log, "split -- %s", y) ; if ( !y.isFull() ) BPT.error("Node is not full") ; if ( this.ptrs.get(idx) != y.getId() ) { int a = this.ptrs.get(idx) ; int b = y.getId() ; BPT.error("Node to be split isn't in right place [%d/%d]", a, b) ; Record splitKey = y.getSplitKey() ; splitKey = keyRecord(splitKey) ; BPTreePage z = y.split() ; if ( logging(log) ) { log(log, "Split: %s", y) ; ptrs.add(idx + 1, z.getId()) ; count++ ; y.write() ; z.write() ; z.release() ; if ( Record.keyNE(splitKey, y.maxRecord()) ) BPT.error("Split key %d but max subtree %s", splitKey, y.maxRecord()) ; internalCheckNodeDeep() ;
trackPath(path, this, y, page) ; if ( page.isMinSize() ) { page.release(); // TODO But rebalance may have freed this? if ( BPT.CheckingNode ) { internalCheckNode() ; page.checkNode() ; page.write() ; Record r2 = page.internalDelete(path, rec) ; if ( x >= 0 ) { Record mx = page.maxRecord() ; records.set(x, keyRecord(mx)) ; this.write() ; log(log, "<< internalDelete(%s) : %s", rec, this) ; page.release() ; return r2 ;
Record keySubTree = n.getHighRecord() ; // high key in immediate BPT.error("Node: %d: Can't get high record from %d", id, n.getId()) ; BPT.error("Node: %d: Can't get high record is missing it's key from %d", id, n.getId()) ; BPT.error("Node: %d: Child key %s is greater than this key %s", id, keySubTree, keyHere) ; Record keyMax = n.maxRecord() ; // max key in subTree Record keyMin = n.internalMinRecord(null) ; n.checkNodeDeep() ; n.release() ; continue ; n.release() ;
private BPTreePage rebalance(AccessPath path, BPTreePage node, int idx) { if ( logging(log) ) { log(log, "rebalance(id=%d, idx=%d)", node.getId(), idx) ; log(log, ">> this: %s", this) ; log(log, ">> node: %s", node) ; if ( left != null && !left.isMinSize() ) { if ( logging(log) ) log(log, "rebalance/shiftRight") ; log(log, "<< rebalance: %s", this) ; if ( BPT.CheckingNode ) { left.checkNode() ; node.checkNode() ; this.internalCheckNode() ; left.release() ; return node ; if ( right != null && !right.isMinSize() ) { if ( logging(log) ) log(log, "rebalance/shiftLeft") ; log(log, "<< rebalance: %s", this) ; if ( BPT.CheckingNode ) { right.checkNode() ; node.checkNode() ; this.internalCheckNode() ; left.release() ;
Logger pageLog = page.getLogger() ; boolean loggingCall = logging(pageLog) ; if ( loggingCall ) Optional<AccessStep> z2 = path.getPath().stream().filter(e -> e.node.ptrs.get(e.idx) != e.page.getId()).findFirst() ; if ( z2.isPresent() ) error("promote: path error: %s in %s", z2.get(), path) ; log(pageLog, " page>> %s", page.label()) ; boolean changed = page.promote(); if ( loggingCall ) { if ( changed ) log(pageLog, " page<< %s", page.label()) ; else log(pageLog, " .. no change") ; page.write() ; // Being careful. int newPtr = page.getId() ; BPTreePage newPage = null ; boolean previousChanged = changed ;
@Test public void bpt_records_2() { BPTreeRecords bpr = make() ; fill(bpr) ; int s = bpr.getCount() ; assertTrue(bpr.isFull()) ; BPTreePage z = bpr.split() ; assertTrue(z instanceof BPTreeRecords) ; assertEquals(s, z.getCount() + bpr.getCount()) ; check(bpr) ; check((BPTreeRecords)z) ; bpr.release() ; z.release() ; }
log(log, "internalInsert: next: %s", page) ; if ( page.isFull() ) { page.release() ; Record r = page.internalInsert(path, record) ; page.release() ; return r ;
@Override final Record internalSearch(AccessPath path, Record rec) { if ( BPT.CheckingNode ) internalCheckNode() ; BPTreePage page = findHere(path, rec) ; Record r = page.internalSearch(path, rec) ; page.release() ; return r ; }
@Override protected Record internalMinRecord(AccessPath path) { BPTreePage page = get(0) ; trackPath(path, this, 0, page) ; Record r = page.internalMinRecord(path) ; page.release() ; return r ; }
/** Return true if there are no keys here or below this node */ @Override final boolean hasAnyKeys() { if ( this.count > 0 ) return true ; if ( !isRoot() ) return false ; // The root can be zero size and point to a single data block. BPTreePage page = get(0) ; boolean b = page.hasAnyKeys() ; page.release() ; return b ; }
BPT.error("Zero size leaf root but not pointing to a records block") ; trackPath(path, root, 0, page) ; Record r = page.internalDelete(path, rec) ; page.release() ; if ( r != null ) root.write() ;
@Override public String toString() { return "("+node.label()+", "+idx+")->"+page.getId() ; } }
BPTreePage page = left.merge(right, splitKey) ; left.write() ; left.release() ; right.free() ; if ( left.getCount() + 1 != left.getMaxSize() && left.getCount() != left.getMaxSize() ) BPT.error("Inconsistent data node size: %d/%d", left.getCount(), left.getMaxSize()) ; } else if ( !left.isFull() ) { BPT.error("Inconsistent node size: %d/%d", left.getCount(), left.getMaxSize()) ;
private void split(AccessPath path, int idx, BPTreePage y) { log(log, "split >> y=%s this=%s idx=%d", y.getRefStr(), this.getRefStr(), idx) ; log(log, "split -- %s", y) ; if ( !y.isFull() ) BPT.error("Node is not full") ; if ( this.ptrs.get(idx) != y.getId() ) { int a = this.ptrs.get(idx) ; int b = y.getId() ; BPT.error("Node to be split isn't in right place [%d/%d]", a, b) ; Record splitKey = y.getSplitKey() ; splitKey = keyRecord(splitKey) ; BPTreePage z = y.split() ; if ( logging(log) ) { log(log, "Split: %s", y) ; ptrs.add(idx + 1, z.getId()) ; count++ ; y.write() ; z.write() ; z.release() ; if ( Record.keyNE(splitKey, y.maxRecord()) ) BPT.error("Split key %d but max subtree %s", splitKey, y.maxRecord()) ; internalCheckNodeDeep() ;
trackPath(path, this, y, page) ; if ( page.isMinSize() ) { page.release(); // TODO But rebalance may have freed this? if ( BPT.CheckingNode ) { internalCheckNode() ; page.checkNode() ; page.write() ; Record r2 = page.internalDelete(path, rec) ; if ( x >= 0 ) { Record mx = page.maxRecord() ; records.set(x, keyRecord(mx)) ; this.write() ; log(log, "<< internalDelete(%s) : %s", rec, this) ; page.release() ; return r2 ;