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.

767 lines
19 KiB

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