1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| public void stealFromLeafPage(BTreeLeafPage page, BTreeLeafPage sibling, BTreeInternalPage parent, BTreeEntry entry, boolean isRightSibling) throws DbException { int totalNum = page.getNumTuples() + sibling.getNumTuples(); int cnt = totalNum / 2 - page.getNumTuples(); if (isRightSibling) { Iterator<Tuple> iterator = sibling.iterator(); Tuple next = null; for (int i = 0; i < cnt; i++) { next = iterator.next(); sibling.deleteTuple(next); page.insertTuple(next); } parent.deleteKeyAndRightChild(entry); BTreeEntry newEntry = new BTreeEntry(next.getField(keyField), page.getId(), sibling.getId()); parent.insertEntry(newEntry); } else { Iterator<Tuple> tupleIterator = sibling.reverseIterator(); Tuple tuple = null; for (int i = 0; i < cnt; i++) { tuple = tupleIterator.next(); sibling.deleteTuple(tuple); page.insertTuple(tuple); }
parent.deleteKeyAndRightChild(entry); BTreeEntry newEntry = new BTreeEntry(tuple.getField(keyField), sibling.getId(), page.getId()); parent.insertEntry(newEntry); } } public void stealFromLeftInternalPage(TransactionId tid, Map<PageId, Page> dirtypages, BTreeInternalPage page, BTreeInternalPage leftSibling, BTreeInternalPage parent, BTreeEntry parentEntry) throws DbException, TransactionAbortedException { int totalNum = page.getNumEntries() + leftSibling.getNumEntries(); Iterator<BTreeEntry> iterator = leftSibling.reverseIterator();
int cnt = totalNum / 2 - page.getNumEntries();
for (int i = 0; i < cnt; i++) { BTreeEntry next = iterator.next(); leftSibling.deleteKeyAndRightChild(next); page.insertEntry(new BTreeEntry(parentEntry.getKey(), next.getRightChild(), page.iterator().next().getLeftChild()));
parentEntry.setKey(next.getKey()); parent.updateEntry(parentEntry);
} dirtypages.put(parent.getId(), parent); dirtypages.put(leftSibling.getId(), leftSibling); dirtypages.put(page.getId(), page); updateParentPointers(tid, dirtypages, parent); updateParentPointers(tid, dirtypages, leftSibling); updateParentPointers(tid, dirtypages, page);
} public void stealFromRightInternalPage(TransactionId tid, Map<PageId, Page> dirtypages, BTreeInternalPage page, BTreeInternalPage rightSibling, BTreeInternalPage parent, BTreeEntry parentEntry) throws DbException, TransactionAbortedException { int totalNum = page.getNumEntries() + rightSibling.getNumEntries(); int cnt = totalNum / 2 - page.getNumEntries(); Iterator<BTreeEntry> iterator = rightSibling.iterator(); for (int i = 0; i < cnt; i++) { BTreeEntry next = iterator.next(); rightSibling.deleteKeyAndLeftChild(next); page.insertEntry(new BTreeEntry(parentEntry.getKey(), page.reverseIterator().next().getRightChild(), next.getLeftChild())); parentEntry.setKey(next.getKey()); parent.updateEntry(parentEntry); } dirtypages.put(parent.getId(), parent); dirtypages.put(rightSibling.getId(), rightSibling); dirtypages.put(page.getId(), page); updateParentPointers(tid, dirtypages, parent); updateParentPointers(tid, dirtypages, rightSibling); updateParentPointers(tid, dirtypages, page); } public void mergeLeafPages(TransactionId tid, Map<PageId, Page> dirtypages, BTreeLeafPage leftPage, BTreeLeafPage rightPage, BTreeInternalPage parent, BTreeEntry parentEntry) throws DbException, IOException, TransactionAbortedException {
Iterator<Tuple> iterator = rightPage.iterator(); while (iterator.hasNext()) { Tuple next = iterator.next(); rightPage.deleteTuple(next); leftPage.insertTuple(next); } BTreePageId rightSiblingId = rightPage.getRightSiblingId(); if (rightSiblingId == null) { leftPage.setRightSiblingId(null); } else { leftPage.setRightSiblingId(rightSiblingId); BTreeLeafPage page = (BTreeLeafPage) getPage(tid, dirtypages, rightSiblingId, Permissions.READ_WRITE); page.setLeftSiblingId(leftPage.getId()); }
deleteParentEntry(tid, dirtypages, leftPage, parent, parentEntry); setEmptyPage(tid, dirtypages, rightPage.getId().getPageNumber()); dirtypages.put(parent.getId(), parent); dirtypages.put(leftPage.getId(), leftPage); } public void mergeInternalPages(TransactionId tid, Map<PageId, Page> dirtypages, BTreeInternalPage leftPage, BTreeInternalPage rightPage, BTreeInternalPage parent, BTreeEntry parentEntry) throws DbException, IOException, TransactionAbortedException {
BTreeEntry mid = new BTreeEntry(parentEntry.getKey(), leftPage.reverseIterator().next().getRightChild(), rightPage.iterator().next().getLeftChild()); leftPage.insertEntry(mid); Iterator<BTreeEntry> iterator = rightPage.iterator(); BTreeEntry prev = null; boolean flag = false; while (iterator.hasNext()) { BTreeEntry next = iterator.next();
rightPage.deleteKeyAndLeftChild(next); leftPage.insertEntry(next); }
dirtypages.put(parent.getId(), parent); dirtypages.put(leftPage.getId(), leftPage); deleteParentEntry(tid, dirtypages, leftPage, parent, parentEntry); setEmptyPage(tid, dirtypages, rightPage.getId().getPageNumber()); updateParentPointers(tid, dirtypages, parent); updateParentPointers(tid, dirtypages, leftPage); }
|