Fix deletion
(self, node, parent = -1)
| 286 | node1.values[idx1], node2.values[idx2] = node2.values[idx2], node1.values[idx1] |
| 287 | |
| 288 | def __fixNodeRemove(self, node, parent = -1): |
| 289 | |
| 290 | """ Fix deletion """ |
| 291 | |
| 292 | if node.isEmptyNode(): |
| 293 | |
| 294 | if node is not self.root: |
| 295 | |
| 296 | if parent == -1: |
| 297 | parent = node.parent |
| 298 | |
| 299 | if node.isEmptyNode() or not node.isConsistent(): |
| 300 | |
| 301 | lS, lCnt, rS, rCnt = self.__getSiblings(node) |
| 302 | rSS, lSS = self.__getRightSibling(rS), self.__getLeftSibling(lS) |
| 303 | |
| 304 | redistribute = True |
| 305 | |
| 306 | if (rS or lS) is not None: |
| 307 | if rCnt == 2 or (rCnt == 1 and rSS != None and rSS.valcnt == 2): |
| 308 | sib = rS |
| 309 | elif lCnt == 2 or (lCnt == 1 and lSS != None and lSS.valcnt == 2): |
| 310 | sib = lS |
| 311 | elif lCnt == 1: |
| 312 | sib, redistribute = lS, False |
| 313 | elif rCnt == 1: |
| 314 | sib, redistribute = rS, False |
| 315 | |
| 316 | if redistribute: |
| 317 | # case 1: redistribute |
| 318 | # left and right case |
| 319 | if parent.valcnt == 1: |
| 320 | if node == parent.getLink(0): |
| 321 | parent_val, sib_val = parent.values[0], sib.values[0] |
| 322 | child = sib.chooseChild(sib_val - 1) |
| 323 | elif node == parent.getLink(1): |
| 324 | parent_val, sib_val = parent.values[parent.valcnt - 1], sib.values[sib.valcnt - 1] |
| 325 | child = sib.chooseChild(sib_val + 1) |
| 326 | else: |
| 327 | if sib == parent.getLink(1): |
| 328 | # left |
| 329 | if node == parent.getLink(0): |
| 330 | parent_val, sib_val = parent.values[0], sib.values[0] |
| 331 | child = sib.chooseChild(sib_val - 1) |
| 332 | # right |
| 333 | elif node == parent.getLink(2): |
| 334 | parent_val, sib_val = parent.values[parent.valcnt - 1], sib.values[sib.valcnt - 1] |
| 335 | child = sib.chooseChild(sib_val + 1) |
| 336 | # middle |
| 337 | elif sib == parent.getLink(2): |
| 338 | parent_val, sib_val = parent.values[parent.valcnt - 1], sib.values[0] |
| 339 | child = sib.chooseChild(sib_val - 1) |
| 340 | elif sib == parent.getLink(0): |
| 341 | parent_val, sib_val = parent.values[0], sib.values[sib.valcnt - 1] |
| 342 | child = sib.chooseChild(sib_val + 1) |
| 343 | |
| 344 | node.insertValue(parent_val) |
| 345 | parent.removeValue(parent_val) |
no test coverage detected