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.

59 lines
2.0 KiB

  1. This adapts one b+ tree implementation
  2. https://sourcegraph.com/github.com/timtadh/data-structures@master/-/tree/tree/bptree
  3. to persist changes to on disk.
  4. # When a node needs to persist itself?
  5. * A node changed its key or value
  6. * When an item is added.
  7. * When an item is updated.
  8. * When an item is deleted.
  9. * When a node is split.
  10. * 2 new nodes are created (they shoud persist themselves).
  11. * Parent node need to point to the new nodes.
  12. * When a node is merged.
  13. * delete one node
  14. * persist the merged node
  15. In general, if one node is returned from a function, the node should have already been persisted.
  16. The parent node may need to delete the old node.
  17. BpTree
  18. Add(key ItemKey, value ItemValue)
  19. new_root = self.getRoot().put(key,value)
  20. a, b, err := self.insert(key, value)
  21. self.internal_insert(key, value)
  22. self.internal_split(q.keys[0], q)
  23. persist(a,b)
  24. self.persist() // child add q node
  25. self.maybePersist(child == p)
  26. self.leaf_insert(key, value)
  27. self.persist() // if dedup
  28. self.leaf_split(key, value)
  29. self.pure_leaf_split(key, value)
  30. persist(a,b)
  31. a.persist()
  32. persist(a,b)
  33. self.put_kv(key, value)
  34. new_root.persist()
  35. self.setRoot(new_root)
  36. oldroot.destroy()
  37. // maybe persist BpTree new root
  38. Replace(key ItemKey, where WhereFunc, value ItemValue)
  39. leaf.persist()
  40. RemoveWhere(key ItemKey, where WhereFunc)
  41. self.getRoot().remove(key, where)
  42. self.internal_remove(key, nil, where)
  43. child.leaf_remove(key, nil, where)
  44. child.leaf_remove(key, sibling.keys[0], where)
  45. l.destroy() // when the node is empty
  46. a.maybePersist(hasChange)
  47. self.destroy() // when no keys left
  48. self.persist() // when some keys are left
  49. self.leaf_remove(key, self.keys[len(self.keys)-1], where)
  50. new_root.persist() // when new root is added
  51. // maybe persist BpTree new root