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.

138 lines
3.0 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. type loc_iterator func() (i int, leaf *BpNode, li loc_iterator)
  11. func NewBpTree(node_size int) *BpTree {
  12. return &BpTree{
  13. root: NewLeaf(node_size),
  14. }
  15. }
  16. func (self *BpTree) Has(key Hashable) bool {
  17. if len(self.getRoot().keys) == 0 {
  18. return false
  19. }
  20. j, l := self.getRoot().get_start(key)
  21. return l.keys[j].Equals(key)
  22. }
  23. func (self *BpTree) Add(key Hashable, value interface{}) (err error) {
  24. new_root, err := self.getRoot().put(key, value)
  25. if err != nil {
  26. return err
  27. }
  28. self.setRoot(new_root)
  29. return nil
  30. }
  31. func (self *BpTree) Replace(key Hashable, where WhereFunc, value interface{}) (err error) {
  32. li := self.getRoot().forward(key, key)
  33. for i, leaf, next := li(); next != nil; i, leaf, next = next() {
  34. if where(leaf.values[i]) {
  35. leaf.values[i] = value
  36. }
  37. }
  38. return nil
  39. }
  40. func (self *BpTree) Find(key Hashable) (kvi KVIterator) {
  41. return self.Range(key, key)
  42. }
  43. func (self *BpTree) Range(from, to Hashable) (kvi KVIterator) {
  44. var li loc_iterator
  45. if !to.Less(from) {
  46. li = self.getRoot().forward(from, to)
  47. } else {
  48. li = self.getRoot().backward(from, to)
  49. }
  50. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  51. var i int
  52. var leaf *BpNode
  53. i, leaf, li = li()
  54. if li == nil {
  55. return nil, nil, nil
  56. }
  57. return leaf.keys[i], leaf.values[i], kvi
  58. }
  59. return kvi
  60. }
  61. func (self *BpTree) RemoveWhere(key Hashable, where WhereFunc) (err error) {
  62. ns := self.getRoot().NodeSize()
  63. new_root, err := self.getRoot().remove(key, where)
  64. if err != nil {
  65. return err
  66. }
  67. if new_root == nil {
  68. self.setRoot(NewLeaf(ns))
  69. } else {
  70. self.setRoot(new_root)
  71. }
  72. return nil
  73. }
  74. func (self *BpTree) Keys() (ki KIterator) {
  75. li := self.getRoot().all()
  76. var prev Equatable
  77. ki = func() (key Hashable, next KIterator) {
  78. var i int
  79. var leaf *BpNode
  80. i, leaf, li = li()
  81. if li == nil {
  82. return nil, nil
  83. }
  84. if leaf.keys[i].Equals(prev) {
  85. return ki()
  86. }
  87. prev = leaf.keys[i]
  88. return leaf.keys[i], ki
  89. }
  90. return ki
  91. }
  92. func (self *BpTree) Values() (vi Iterator) {
  93. return MakeValuesIterator(self)
  94. }
  95. func (self *BpTree) Items() (vi KIterator) {
  96. return MakeItemsIterator(self)
  97. }
  98. func (self *BpTree) Iterate() (kvi KVIterator) {
  99. li := self.getRoot().all()
  100. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  101. var i int
  102. var leaf *BpNode
  103. i, leaf, li = li()
  104. if li == nil {
  105. return nil, nil, nil
  106. }
  107. return leaf.keys[i], leaf.values[i], kvi
  108. }
  109. return kvi
  110. }
  111. func (self *BpTree) Backward() (kvi KVIterator) {
  112. li := self.getRoot().all_backward()
  113. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  114. var i int
  115. var leaf *BpNode
  116. i, leaf, li = li()
  117. if li == nil {
  118. return nil, nil, nil
  119. }
  120. return leaf.keys[i], leaf.values[i], kvi
  121. }
  122. return kvi
  123. }