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.

145 lines
3.2 KiB

4 years ago
  1. package bptree
  2. // started by copying from https://sourcegraph.com/github.com/timtadh/data-structures@master/-/tree/tree/bptree
  3. /* A BpTree is a B+Tree with support for duplicate keys. This makes it behave as
  4. * a MultiMap. Additionally you can use the Range operator to select k/v in a
  5. * range. If from > to it will iterate backwards.
  6. */
  7. type BpTree struct {
  8. root *BpNode
  9. }
  10. func (self *BpTree) getRoot() *BpNode {
  11. return self.root
  12. }
  13. func (self *BpTree) setRoot(root *BpNode) {
  14. self.root = root
  15. }
  16. type loc_iterator func() (i int, leaf *BpNode, li loc_iterator)
  17. func NewBpTree(node_size int) *BpTree {
  18. return &BpTree{
  19. root: NewLeaf(node_size),
  20. }
  21. }
  22. func (self *BpTree) Has(key Hashable) bool {
  23. if len(self.getRoot().keys) == 0 {
  24. return false
  25. }
  26. j, l := self.getRoot().get_start(key)
  27. return l.keys[j].Equals(key)
  28. }
  29. func (self *BpTree) Add(key Hashable, value interface{}) (err error) {
  30. new_root, err := self.getRoot().put(key, value)
  31. if err != nil {
  32. return err
  33. }
  34. self.setRoot(new_root)
  35. return nil
  36. }
  37. func (self *BpTree) Replace(key Hashable, where WhereFunc, value interface{}) (err error) {
  38. li := self.getRoot().forward(key, key)
  39. for i, leaf, next := li(); next != nil; i, leaf, next = next() {
  40. if where(leaf.values[i]) {
  41. leaf.values[i] = value
  42. }
  43. }
  44. return nil
  45. }
  46. func (self *BpTree) Find(key Hashable) (kvi KVIterator) {
  47. return self.Range(key, key)
  48. }
  49. func (self *BpTree) Range(from, to Hashable) (kvi KVIterator) {
  50. var li loc_iterator
  51. if !to.Less(from) {
  52. li = self.getRoot().forward(from, to)
  53. } else {
  54. li = self.getRoot().backward(from, to)
  55. }
  56. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  57. var i int
  58. var leaf *BpNode
  59. i, leaf, li = li()
  60. if li == nil {
  61. return nil, nil, nil
  62. }
  63. return leaf.keys[i], leaf.values[i], kvi
  64. }
  65. return kvi
  66. }
  67. func (self *BpTree) RemoveWhere(key Hashable, where WhereFunc) (err error) {
  68. ns := self.getRoot().NodeSize()
  69. new_root, err := self.getRoot().remove(key, where)
  70. if err != nil {
  71. return err
  72. }
  73. if new_root == nil {
  74. self.setRoot(NewLeaf(ns))
  75. } else {
  76. self.setRoot(new_root)
  77. }
  78. return nil
  79. }
  80. func (self *BpTree) Keys() (ki KIterator) {
  81. li := self.getRoot().all()
  82. var prev Equatable
  83. ki = func() (key Hashable, next KIterator) {
  84. var i int
  85. var leaf *BpNode
  86. i, leaf, li = li()
  87. if li == nil {
  88. return nil, nil
  89. }
  90. if leaf.keys[i].Equals(prev) {
  91. return ki()
  92. }
  93. prev = leaf.keys[i]
  94. return leaf.keys[i], ki
  95. }
  96. return ki
  97. }
  98. func (self *BpTree) Values() (vi Iterator) {
  99. return MakeValuesIterator(self)
  100. }
  101. func (self *BpTree) Items() (vi KIterator) {
  102. return MakeItemsIterator(self)
  103. }
  104. func (self *BpTree) Iterate() (kvi KVIterator) {
  105. li := self.getRoot().all()
  106. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  107. var i int
  108. var leaf *BpNode
  109. i, leaf, li = li()
  110. if li == nil {
  111. return nil, nil, nil
  112. }
  113. return leaf.keys[i], leaf.values[i], kvi
  114. }
  115. return kvi
  116. }
  117. func (self *BpTree) Backward() (kvi KVIterator) {
  118. li := self.getRoot().all_backward()
  119. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  120. var i int
  121. var leaf *BpNode
  122. i, leaf, li = li()
  123. if li == nil {
  124. return nil, nil, nil
  125. }
  126. return leaf.keys[i], leaf.values[i], kvi
  127. }
  128. return kvi
  129. }