You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

766 lines
18 KiB

  1. package bptree
  2. type ItemKey Hashable
  3. type ItemValue Equatable
  4. type PersistFunc func(node *BpNode) error
  5. type DestroyFunc func(node *BpNode) error
  6. var (
  7. PersistFn PersistFunc
  8. DestroyFn DestroyFunc
  9. )
  10. type BpNode struct {
  11. keys []ItemKey
  12. values []ItemValue
  13. pointers []*BpNode
  14. next *BpNode
  15. prev *BpNode
  16. protoNodeId int64
  17. protoNode *ProtoNode
  18. }
  19. func NewInternal(size int) *BpNode {
  20. if size < 0 {
  21. panic(NegativeSize())
  22. }
  23. return &BpNode{
  24. keys: make([]ItemKey, 0, size),
  25. pointers: make([]*BpNode, 0, size),
  26. protoNodeId: GetProtoNodeId(),
  27. }
  28. }
  29. func NewLeaf(size int) *BpNode {
  30. if size < 0 {
  31. panic(NegativeSize())
  32. }
  33. return &BpNode{
  34. keys: make([]ItemKey, 0, size),
  35. values: make([]ItemValue, 0, size),
  36. protoNodeId: GetProtoNodeId(),
  37. }
  38. }
  39. func (self *BpNode) Full() bool {
  40. return len(self.keys) == cap(self.keys)
  41. }
  42. func (self *BpNode) Pure() bool {
  43. if len(self.keys) == 0 {
  44. return true
  45. }
  46. k0 := self.keys[0]
  47. for _, k := range self.keys {
  48. if !k0.Equals(k) {
  49. return false
  50. }
  51. }
  52. return true
  53. }
  54. func (self *BpNode) Internal() bool {
  55. return cap(self.pointers) > 0
  56. }
  57. func (self *BpNode) Len() int {
  58. return len(self.keys)
  59. }
  60. func (self *BpNode) Capacity() int {
  61. return cap(self.keys)
  62. }
  63. func (self *BpNode) Height() int {
  64. if !self.Internal() {
  65. return 1
  66. } else if len(self.pointers) == 0 {
  67. panic(BpTreeError("Internal node has no pointers but asked for height"))
  68. }
  69. return self.pointers[0].Height() + 1
  70. }
  71. func (self *BpNode) has(key ItemKey) bool {
  72. _, has := self.find(key)
  73. return has
  74. }
  75. func (self *BpNode) left_most_leaf() *BpNode {
  76. if self.Internal() {
  77. return self.pointers[0].left_most_leaf()
  78. }
  79. return self
  80. }
  81. func (self *BpNode) right_most_leaf() *BpNode {
  82. if self.Internal() {
  83. return self.pointers[len(self.pointers)-1].right_most_leaf()
  84. }
  85. return self
  86. }
  87. /* returns the index and leaf-block of the first key greater than or equal to
  88. * the search key. (unless the search key is greater than all the keys in the
  89. * tree, in that case it will be the last key in the tree)
  90. */
  91. func (self *BpNode) get_start(key ItemKey) (i int, leaf *BpNode) {
  92. if self.Internal() {
  93. return self.internal_get_start(key)
  94. } else {
  95. return self.leaf_get_start(key)
  96. }
  97. }
  98. func next_location(i int, leaf *BpNode) (int, *BpNode, bool) {
  99. j := i + 1
  100. for j >= len(leaf.keys) && leaf.getNext() != nil {
  101. j = 0
  102. leaf = leaf.getNext()
  103. }
  104. if j >= len(leaf.keys) {
  105. return -1, nil, true
  106. }
  107. return j, leaf, false
  108. }
  109. func prev_location(i int, leaf *BpNode) (int, *BpNode, bool) {
  110. j := i - 1
  111. for j < 0 && leaf.getPrev() != nil {
  112. leaf = leaf.getPrev()
  113. j = len(leaf.keys) - 1
  114. }
  115. if j < 0 {
  116. return -1, nil, true
  117. }
  118. return j, leaf, false
  119. }
  120. /* returns the index and leaf-block of the last key equal to the search key or
  121. * the first key greater than the search key. (unless the search key is greater
  122. * than all the keys in the tree, in that case it will be the last key in the
  123. * tree)
  124. */
  125. func (self *BpNode) get_end(key ItemKey) (i int, leaf *BpNode) {
  126. end := false
  127. i, leaf = self.get_start(key)
  128. pi, pleaf := i, leaf
  129. for !end && leaf.keys[i].Equals(key) {
  130. pi, pleaf = i, leaf
  131. i, leaf, end = next_location(i, leaf)
  132. }
  133. return pi, pleaf
  134. }
  135. func (self *BpNode) internal_get_start(key ItemKey) (i int, leaf *BpNode) {
  136. if !self.Internal() {
  137. panic(BpTreeError("Expected a internal node"))
  138. }
  139. i, has := self.find(key)
  140. if !has && i > 0 {
  141. // if it doesn't have it and the index > 0 then we have the next block
  142. // so we have to subtract one from the index.
  143. i--
  144. }
  145. child := self.pointers[i]
  146. return child.get_start(key)
  147. }
  148. func (self *BpNode) leaf_get_start(key ItemKey) (i int, leaf *BpNode) {
  149. i, has := self.find(key)
  150. if i >= len(self.keys) && i > 0 {
  151. i = len(self.keys) - 1
  152. }
  153. if !has && (len(self.keys) == 0 || self.keys[i].Less(key)) && self.getNext() != nil {
  154. return self.getNext().leaf_get_start(key)
  155. }
  156. return i, self
  157. }
  158. /* This puts the k/v pair into the B+Tree rooted at this node and returns the
  159. * (possibly) new root of the tree.
  160. */
  161. func (self *BpNode) put(key ItemKey, value ItemValue) (root *BpNode, err error) {
  162. a, b, err := self.insert(key, value)
  163. if err != nil {
  164. return nil, err
  165. } else if b == nil {
  166. return a, nil
  167. }
  168. // else we have root split
  169. root = NewInternal(self.Capacity())
  170. root.put_kp(a.keys[0], a)
  171. root.put_kp(b.keys[0], b)
  172. return root, root.persist()
  173. }
  174. // right is only set on split
  175. // left is always set. When split is false left is the pointer to block
  176. // When split is true left is the pointer to the new left
  177. // block
  178. func (self *BpNode) insert(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  179. if self.Internal() {
  180. return self.internal_insert(key, value)
  181. } else { // leaf node
  182. return self.leaf_insert(key, value)
  183. }
  184. }
  185. /* - first find the child to insert into
  186. * - do the child insert
  187. * - if there was a split:
  188. * - if the block is full, split this block
  189. * - else insert the new key/pointer into this block
  190. */
  191. func (self *BpNode) internal_insert(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  192. if !self.Internal() {
  193. return nil, nil, BpTreeError("Expected a internal node")
  194. }
  195. i, has := self.find(key)
  196. if !has && i > 0 {
  197. // if it doesn't have it and the index > 0 then we have the next block
  198. // so we have to subtract one from the index.
  199. i--
  200. }
  201. child := self.pointers[i]
  202. p, q, err := child.insert(key, value)
  203. if err != nil {
  204. return nil, nil, err
  205. }
  206. self.keys[i] = p.keys[0]
  207. self.pointers[i] = p
  208. if q != nil {
  209. // we had a split
  210. if self.Full() {
  211. return self.internal_split(q.keys[0], q)
  212. } else {
  213. if err := self.put_kp(q.keys[0], q); err != nil {
  214. return nil, nil, err
  215. }
  216. return self, nil, self.persist()
  217. }
  218. }
  219. return self, nil, self.maybePersist(child != p)
  220. }
  221. /* On split
  222. * - first assert that the key to be inserted is not already in the block.
  223. * - Make a new block
  224. * - balance the two blocks.
  225. * - insert the new key/pointer combo into the correct block
  226. */
  227. func (self *BpNode) internal_split(key ItemKey, ptr *BpNode) (a, b *BpNode, err error) {
  228. if !self.Internal() {
  229. return nil, nil, BpTreeError("Expected a internal node")
  230. }
  231. if self.has(key) {
  232. return nil, nil, BpTreeError("Tried to split an internal block on duplicate key")
  233. }
  234. a = self
  235. b = NewInternal(self.Capacity())
  236. balance_nodes(a, b, key)
  237. if b.Len() > 0 && key.Less(b.keys[0]) {
  238. if err := a.put_kp(key, ptr); err != nil {
  239. return nil, nil, err
  240. }
  241. } else {
  242. if err := b.put_kp(key, ptr); err != nil {
  243. return nil, nil, err
  244. }
  245. }
  246. return a, b, persist(a, b)
  247. }
  248. /* if the leaf is full then it will defer to a leaf_split
  249. * (but in one case that will not actually split in the case of a insert into
  250. * a pure block with a matching key)
  251. * else this leaf will get a new entry.
  252. */
  253. func (self *BpNode) leaf_insert(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  254. if self.Internal() {
  255. return nil, nil, BpTreeError("Expected a leaf node")
  256. }
  257. if true { // no_dup = true
  258. i, has := self.find(key)
  259. if has {
  260. self.values[i] = value
  261. return self, nil, self.persist()
  262. }
  263. }
  264. if self.Full() {
  265. return self.leaf_split(key, value)
  266. } else {
  267. if err := self.put_kv(key, value); err != nil {
  268. return nil, nil, err
  269. }
  270. return self, nil, self.persist()
  271. }
  272. }
  273. /* on leaf split if the block is pure then it will defer to pure_leaf_split
  274. * else
  275. * - a new block will be made and inserted after this one
  276. * - the two blocks will be balanced with balanced_nodes
  277. * - if the key is less than b.keys[0] it will go in a else b
  278. */
  279. func (self *BpNode) leaf_split(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  280. if self.Internal() {
  281. return nil, nil, BpTreeError("Expected a leaf node")
  282. }
  283. if self.Pure() {
  284. return self.pure_leaf_split(key, value)
  285. }
  286. a = self
  287. b = NewLeaf(self.Capacity())
  288. insert_linked_list_node(b, a, a.getNext())
  289. balance_nodes(a, b, key)
  290. if b.Len() > 0 && key.Less(b.keys[0]) {
  291. if err := a.put_kv(key, value); err != nil {
  292. return nil, nil, err
  293. }
  294. } else {
  295. if err := b.put_kv(key, value); err != nil {
  296. return nil, nil, err
  297. }
  298. }
  299. return a, b, persist(a, b)
  300. }
  301. /* a pure leaf split has two cases:
  302. * 1) the inserted key is less than the current pure block.
  303. * - a new block should be created before the current block
  304. * - the key should be put in it
  305. * 2) the inserted key is greater than or equal to the pure block.
  306. * - the end of run of pure blocks should be found
  307. * - if the key is equal to pure block and the last block is not full insert
  308. * the new kv
  309. * - else split by making a new block after the last block in the run
  310. * and putting the new key there.
  311. * - always return the current block as "a" and the new block as "b"
  312. */
  313. func (self *BpNode) pure_leaf_split(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  314. if self.Internal() || !self.Pure() {
  315. return nil, nil, BpTreeError("Expected a pure leaf node")
  316. }
  317. if key.Less(self.keys[0]) {
  318. a = NewLeaf(self.Capacity())
  319. b = self
  320. if err := a.put_kv(key, value); err != nil {
  321. return nil, nil, err
  322. }
  323. insert_linked_list_node(a, b.getPrev(), b)
  324. return a, b, persist(a, b)
  325. } else {
  326. a = self
  327. e := self.find_end_of_pure_run()
  328. if e.keys[0].Equals(key) && !e.Full() {
  329. if err := e.put_kv(key, value); err != nil {
  330. return nil, nil, err
  331. }
  332. return a, nil, a.persist()
  333. } else {
  334. b = NewLeaf(self.Capacity())
  335. if err := b.put_kv(key, value); err != nil {
  336. return nil, nil, err
  337. }
  338. insert_linked_list_node(b, e, e.getNext())
  339. if e.keys[0].Equals(key) {
  340. return a, nil, nil
  341. }
  342. return a, b, persist(a, b)
  343. }
  344. }
  345. }
  346. func (self *BpNode) put_kp(key ItemKey, ptr *BpNode) error {
  347. if self.Full() {
  348. return BpTreeError("Block is full.")
  349. }
  350. if !self.Internal() {
  351. return BpTreeError("Expected a internal node")
  352. }
  353. i, has := self.find(key)
  354. if has {
  355. return BpTreeError("Tried to insert a duplicate key into an internal node")
  356. } else if i < 0 {
  357. panic(BpTreeError("find returned a negative int"))
  358. } else if i >= cap(self.keys) {
  359. panic(BpTreeError("find returned a int > than cap(keys)"))
  360. }
  361. if err := self.put_key_at(i, key); err != nil {
  362. return err
  363. }
  364. if err := self.put_pointer_at(i, ptr); err != nil {
  365. return err
  366. }
  367. return nil
  368. }
  369. func (self *BpNode) put_kv(key ItemKey, value ItemValue) error {
  370. if self.Full() {
  371. return BpTreeError("Block is full.")
  372. }
  373. if self.Internal() {
  374. return BpTreeError("Expected a leaf node")
  375. }
  376. i, _ := self.find(key)
  377. if i < 0 {
  378. panic(BpTreeError("find returned a negative int"))
  379. } else if i >= cap(self.keys) {
  380. panic(BpTreeError("find returned a int > than cap(keys)"))
  381. }
  382. if err := self.put_key_at(i, key); err != nil {
  383. return err
  384. }
  385. if err := self.put_value_at(i, value); err != nil {
  386. return err
  387. }
  388. return nil
  389. }
  390. func (self *BpNode) put_key_at(i int, key ItemKey) error {
  391. if self.Full() {
  392. return BpTreeError("Block is full.")
  393. }
  394. self.keys = self.keys[:len(self.keys)+1]
  395. for j := len(self.keys) - 1; j > i; j-- {
  396. self.keys[j] = self.keys[j-1]
  397. }
  398. self.keys[i] = key
  399. return nil
  400. }
  401. func (self *BpNode) put_value_at(i int, value ItemValue) error {
  402. if len(self.values) == cap(self.values) {
  403. return BpTreeError("Block is full.")
  404. }
  405. if self.Internal() {
  406. return BpTreeError("Expected a leaf node")
  407. }
  408. self.values = self.values[:len(self.values)+1]
  409. for j := len(self.values) - 1; j > i; j-- {
  410. self.values[j] = self.values[j-1]
  411. }
  412. self.values[i] = value
  413. return nil
  414. }
  415. func (self *BpNode) put_pointer_at(i int, pointer *BpNode) error {
  416. if len(self.pointers) == cap(self.pointers) {
  417. return BpTreeError("Block is full.")
  418. }
  419. if !self.Internal() {
  420. return BpTreeError("Expected a internal node")
  421. }
  422. self.pointers = self.pointers[:len(self.pointers)+1]
  423. for j := len(self.pointers) - 1; j > i; j-- {
  424. self.pointers[j] = self.pointers[j-1]
  425. }
  426. self.pointers[i] = pointer
  427. return nil
  428. }
  429. func (self *BpNode) remove(key ItemKey, where WhereFunc) (a *BpNode, err error) {
  430. if self.Internal() {
  431. return self.internal_remove(key, nil, where)
  432. } else {
  433. return self.leaf_remove(key, self.keys[len(self.keys)-1], where)
  434. }
  435. }
  436. func (self *BpNode) internal_remove(key ItemKey, sibling *BpNode, where WhereFunc) (a *BpNode, err error) {
  437. if !self.Internal() {
  438. panic(BpTreeError("Expected a internal node"))
  439. }
  440. i, has := self.find(key)
  441. if !has && i > 0 {
  442. // if it doesn't have it and the index > 0 then we have the next block
  443. // so we have to subtract one from the index.
  444. i--
  445. }
  446. if i+1 < len(self.keys) {
  447. sibling = self.pointers[i+1]
  448. } else if sibling != nil {
  449. sibling = sibling.left_most_leaf()
  450. }
  451. child := self.pointers[i]
  452. oldChild := child
  453. if child.Internal() {
  454. child, err = child.internal_remove(key, sibling, where)
  455. } else {
  456. if sibling == nil {
  457. child, err = child.leaf_remove(key, nil, where)
  458. } else {
  459. child, err = child.leaf_remove(key, sibling.keys[0], where)
  460. }
  461. }
  462. if err != nil {
  463. return nil, err
  464. }
  465. if child == nil {
  466. if err := self.remove_key_at(i); err != nil {
  467. return nil, err
  468. }
  469. if err := self.remove_ptr_at(i); err != nil {
  470. return nil, err
  471. }
  472. } else {
  473. self.keys[i] = child.keys[0]
  474. self.pointers[i] = child
  475. }
  476. if len(self.keys) == 0 {
  477. return nil, self.destroy()
  478. }
  479. return self, self.maybePersist(oldChild != child)
  480. }
  481. func (self *BpNode) leaf_remove(key, stop ItemKey, where WhereFunc) (a *BpNode, err error) {
  482. if self.Internal() {
  483. return nil, BpTreeError("Expected a leaf node")
  484. }
  485. a = self
  486. hasChange := false
  487. for j, l, next := self.forward(key, key)(); next != nil; j, l, next = next() {
  488. if where(l.values[j]) {
  489. hasChange = true
  490. if err := l.remove_key_at(j); err != nil {
  491. return nil, err
  492. }
  493. if err := l.remove_value_at(j); err != nil {
  494. return nil, err
  495. }
  496. }
  497. if len(l.keys) == 0 {
  498. remove_linked_list_node(l)
  499. if l.getNext() == nil {
  500. a = nil
  501. } else if stop == nil {
  502. a = nil
  503. } else if !l.getNext().keys[0].Equals(stop) {
  504. a = l.getNext()
  505. } else {
  506. a = nil
  507. }
  508. if err := l.destroy(); err != nil {
  509. return nil, err
  510. }
  511. }
  512. }
  513. if a != nil {
  514. return a, a.maybePersist(hasChange)
  515. }
  516. return a, nil
  517. }
  518. func (self *BpNode) remove_key_at(i int) error {
  519. if i >= len(self.keys) || i < 0 {
  520. return BpTreeError("i, %v, is out of bounds, %v, %v %v.", i, len(self.keys), len(self.values), self)
  521. }
  522. for j := i; j < len(self.keys)-1; j++ {
  523. self.keys[j] = self.keys[j+1]
  524. }
  525. self.keys = self.keys[:len(self.keys)-1]
  526. return nil
  527. }
  528. func (self *BpNode) remove_value_at(i int) error {
  529. if i >= len(self.values) || i < 0 {
  530. return BpTreeError("i, %v, is out of bounds, %v.", i, len(self.values))
  531. }
  532. for j := i; j < len(self.values)-1; j++ {
  533. self.values[j] = self.values[j+1]
  534. }
  535. self.values = self.values[:len(self.values)-1]
  536. return nil
  537. }
  538. func (self *BpNode) remove_ptr_at(i int) error {
  539. if i >= len(self.pointers) || i < 0 {
  540. return BpTreeError("i, %v, is out of bounds, %v.", i, len(self.pointers))
  541. }
  542. for j := i; j < len(self.pointers)-1; j++ {
  543. self.pointers[j] = self.pointers[j+1]
  544. }
  545. self.pointers = self.pointers[:len(self.pointers)-1]
  546. return nil
  547. }
  548. func (self *BpNode) find(key ItemKey) (int, bool) {
  549. var l = 0
  550. var r = len(self.keys) - 1
  551. var m int
  552. for l <= r {
  553. m = ((r - l) >> 1) + l
  554. if key.Less(self.keys[m]) {
  555. r = m - 1
  556. } else if key.Equals(self.keys[m]) {
  557. return m, true
  558. } else {
  559. l = m + 1
  560. }
  561. }
  562. return l, false
  563. }
  564. func (self *BpNode) find_end_of_pure_run() *BpNode {
  565. k := self.keys[0]
  566. p := self
  567. n := self.getNext()
  568. for n != nil && n.Pure() && k.Equals(n.keys[0]) {
  569. p = n
  570. n = n.getNext()
  571. }
  572. return p
  573. }
  574. func (self *BpNode) all() (li loc_iterator) {
  575. j := -1
  576. l := self.left_most_leaf()
  577. end := false
  578. j, l, end = next_location(j, l)
  579. li = func() (i int, leaf *BpNode, next loc_iterator) {
  580. if end {
  581. return -1, nil, nil
  582. }
  583. i = j
  584. leaf = l
  585. j, l, end = next_location(j, l)
  586. return i, leaf, li
  587. }
  588. return li
  589. }
  590. func (self *BpNode) all_backward() (li loc_iterator) {
  591. l := self.right_most_leaf()
  592. j := len(l.keys)
  593. end := false
  594. j, l, end = prev_location(j, l)
  595. li = func() (i int, leaf *BpNode, next loc_iterator) {
  596. if end {
  597. return -1, nil, nil
  598. }
  599. i = j
  600. leaf = l
  601. j, l, end = prev_location(j, l)
  602. return i, leaf, li
  603. }
  604. return li
  605. }
  606. func (self *BpNode) forward(from, to ItemKey) (li loc_iterator) {
  607. j, l := self.get_start(from)
  608. end := false
  609. j--
  610. li = func() (i int, leaf *BpNode, next loc_iterator) {
  611. j, l, end = next_location(j, l)
  612. if end || to.Less(l.keys[j]) {
  613. return -1, nil, nil
  614. }
  615. return j, l, li
  616. }
  617. return li
  618. }
  619. func (self *BpNode) backward(from, to ItemKey) (li loc_iterator) {
  620. j, l := self.get_end(from)
  621. end := false
  622. li = func() (i int, leaf *BpNode, next loc_iterator) {
  623. if end || l.keys[j].Less(to) {
  624. return -1, nil, nil
  625. }
  626. i = j
  627. leaf = l
  628. j, l, end = prev_location(i, l)
  629. return i, leaf, li
  630. }
  631. return li
  632. }
  633. func insert_linked_list_node(n, prev, next *BpNode) {
  634. if (prev != nil && prev.getNext() != next) || (next != nil && next.getPrev() != prev) {
  635. panic(BpTreeError("prev and next not hooked up"))
  636. }
  637. n.setPrev(prev)
  638. n.setNext(next)
  639. if prev != nil {
  640. prev.setNext(n)
  641. }
  642. if next != nil {
  643. next.setPrev(n)
  644. }
  645. }
  646. func remove_linked_list_node(n *BpNode) {
  647. if n.getPrev() != nil {
  648. n.getPrev().setNext(n.getNext())
  649. }
  650. if n.getNext() != nil {
  651. n.getNext().setPrev(n.getPrev())
  652. }
  653. }
  654. /**
  655. * a must be full and b must be empty else there will be a panic
  656. *
  657. * Different from common btree implementation, this splits the nodes by the inserted key.
  658. * Items less than the splitKey stays in a, or moved to b if otherwise.
  659. * This should help for monotonically increasing inserts.
  660. *
  661. */
  662. func balance_nodes(a, b *BpNode, splitKey ItemKey) {
  663. if len(b.keys) != 0 {
  664. panic(BpTreeError("b was not empty"))
  665. }
  666. if !a.Full() {
  667. panic(BpTreeError("a was not full", a))
  668. }
  669. if cap(a.keys) != cap(b.keys) {
  670. panic(BpTreeError("cap(a.keys) != cap(b.keys)"))
  671. }
  672. if cap(a.values) != cap(b.values) {
  673. panic(BpTreeError("cap(a.values) != cap(b.values)"))
  674. }
  675. if cap(a.pointers) != cap(b.pointers) {
  676. panic(BpTreeError("cap(a.pointers) != cap(b.pointers)"))
  677. }
  678. m := find_split_index(a, b, splitKey)
  679. var lim = len(a.keys) - m
  680. b.keys = b.keys[:lim]
  681. if cap(a.values) > 0 {
  682. if cap(a.values) != cap(a.keys) {
  683. panic(BpTreeError("cap(a.values) != cap(a.keys)"))
  684. }
  685. b.values = b.values[:lim]
  686. }
  687. if cap(a.pointers) > 0 {
  688. if cap(a.pointers) != cap(a.keys) {
  689. panic(BpTreeError("cap(a.pointers) != cap(a.keys)"))
  690. }
  691. b.pointers = b.pointers[:lim]
  692. }
  693. for i := 0; i < lim; i++ {
  694. j := m + i
  695. b.keys[i] = a.keys[j]
  696. if cap(a.values) > 0 {
  697. b.values[i] = a.values[j]
  698. }
  699. if cap(a.pointers) > 0 {
  700. b.pointers[i] = a.pointers[j]
  701. }
  702. }
  703. a.keys = a.keys[:m]
  704. if cap(a.values) > 0 {
  705. a.values = a.values[:m]
  706. }
  707. if cap(a.pointers) > 0 {
  708. a.pointers = a.pointers[:m]
  709. }
  710. }
  711. func find_split_index(a, b *BpNode, splitKey ItemKey) int {
  712. m := len(a.keys)
  713. for m > 0 && !a.keys[m-1].Less(splitKey) {
  714. m--
  715. }
  716. return m
  717. }