node.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. package iradix
  2. import (
  3. "bytes"
  4. "sort"
  5. )
  6. // WalkFn is used when walking the tree. Takes a
  7. // key and value, returning if iteration should
  8. // be terminated.
  9. type WalkFn func(k []byte, v interface{}) bool
  10. // leafNode is used to represent a value
  11. type leafNode struct {
  12. key []byte
  13. val interface{}
  14. }
  15. // edge is used to represent an edge node
  16. type edge struct {
  17. label byte
  18. node *Node
  19. }
  20. // Node is an immutable node in the radix tree
  21. type Node struct {
  22. // leaf is used to store possible leaf
  23. leaf *leafNode
  24. // prefix is the common prefix we ignore
  25. prefix []byte
  26. // Edges should be stored in-order for iteration.
  27. // We avoid a fully materialized slice to save memory,
  28. // since in most cases we expect to be sparse
  29. edges edges
  30. }
  31. func (n *Node) isLeaf() bool {
  32. return n.leaf != nil
  33. }
  34. func (n *Node) addEdge(e edge) {
  35. num := len(n.edges)
  36. idx := sort.Search(num, func(i int) bool {
  37. return n.edges[i].label >= e.label
  38. })
  39. n.edges = append(n.edges, e)
  40. if idx != num {
  41. copy(n.edges[idx+1:], n.edges[idx:num])
  42. n.edges[idx] = e
  43. }
  44. }
  45. func (n *Node) replaceEdge(e edge) {
  46. num := len(n.edges)
  47. idx := sort.Search(num, func(i int) bool {
  48. return n.edges[i].label >= e.label
  49. })
  50. if idx < num && n.edges[idx].label == e.label {
  51. n.edges[idx].node = e.node
  52. return
  53. }
  54. panic("replacing missing edge")
  55. }
  56. func (n *Node) getEdge(label byte) (int, *Node) {
  57. num := len(n.edges)
  58. idx := sort.Search(num, func(i int) bool {
  59. return n.edges[i].label >= label
  60. })
  61. if idx < num && n.edges[idx].label == label {
  62. return idx, n.edges[idx].node
  63. }
  64. return -1, nil
  65. }
  66. func (n *Node) delEdge(label byte) {
  67. num := len(n.edges)
  68. idx := sort.Search(num, func(i int) bool {
  69. return n.edges[i].label >= label
  70. })
  71. if idx < num && n.edges[idx].label == label {
  72. copy(n.edges[idx:], n.edges[idx+1:])
  73. n.edges[len(n.edges)-1] = edge{}
  74. n.edges = n.edges[:len(n.edges)-1]
  75. }
  76. }
  77. func (n *Node) mergeChild() {
  78. e := n.edges[0]
  79. child := e.node
  80. n.prefix = concat(n.prefix, child.prefix)
  81. if child.leaf != nil {
  82. n.leaf = new(leafNode)
  83. *n.leaf = *child.leaf
  84. } else {
  85. n.leaf = nil
  86. }
  87. if len(child.edges) != 0 {
  88. n.edges = make([]edge, len(child.edges))
  89. copy(n.edges, child.edges)
  90. } else {
  91. n.edges = nil
  92. }
  93. }
  94. func (n *Node) Get(k []byte) (interface{}, bool) {
  95. search := k
  96. for {
  97. // Check for key exhaution
  98. if len(search) == 0 {
  99. if n.isLeaf() {
  100. return n.leaf.val, true
  101. }
  102. break
  103. }
  104. // Look for an edge
  105. _, n = n.getEdge(search[0])
  106. if n == nil {
  107. break
  108. }
  109. // Consume the search prefix
  110. if bytes.HasPrefix(search, n.prefix) {
  111. search = search[len(n.prefix):]
  112. } else {
  113. break
  114. }
  115. }
  116. return nil, false
  117. }
  118. // LongestPrefix is like Get, but instead of an
  119. // exact match, it will return the longest prefix match.
  120. func (n *Node) LongestPrefix(k []byte) ([]byte, interface{}, bool) {
  121. var last *leafNode
  122. search := k
  123. for {
  124. // Look for a leaf node
  125. if n.isLeaf() {
  126. last = n.leaf
  127. }
  128. // Check for key exhaution
  129. if len(search) == 0 {
  130. break
  131. }
  132. // Look for an edge
  133. _, n = n.getEdge(search[0])
  134. if n == nil {
  135. break
  136. }
  137. // Consume the search prefix
  138. if bytes.HasPrefix(search, n.prefix) {
  139. search = search[len(n.prefix):]
  140. } else {
  141. break
  142. }
  143. }
  144. if last != nil {
  145. return last.key, last.val, true
  146. }
  147. return nil, nil, false
  148. }
  149. // Minimum is used to return the minimum value in the tree
  150. func (n *Node) Minimum() ([]byte, interface{}, bool) {
  151. for {
  152. if n.isLeaf() {
  153. return n.leaf.key, n.leaf.val, true
  154. }
  155. if len(n.edges) > 0 {
  156. n = n.edges[0].node
  157. } else {
  158. break
  159. }
  160. }
  161. return nil, nil, false
  162. }
  163. // Maximum is used to return the maximum value in the tree
  164. func (n *Node) Maximum() ([]byte, interface{}, bool) {
  165. for {
  166. if num := len(n.edges); num > 0 {
  167. n = n.edges[num-1].node
  168. continue
  169. }
  170. if n.isLeaf() {
  171. return n.leaf.key, n.leaf.val, true
  172. } else {
  173. break
  174. }
  175. }
  176. return nil, nil, false
  177. }
  178. // Iterator is used to return an iterator at
  179. // the given node to walk the tree
  180. func (n *Node) Iterator() *Iterator {
  181. return &Iterator{node: n}
  182. }
  183. // Walk is used to walk the tree
  184. func (n *Node) Walk(fn WalkFn) {
  185. recursiveWalk(n, fn)
  186. }
  187. // WalkPrefix is used to walk the tree under a prefix
  188. func (n *Node) WalkPrefix(prefix []byte, fn WalkFn) {
  189. search := prefix
  190. for {
  191. // Check for key exhaution
  192. if len(search) == 0 {
  193. recursiveWalk(n, fn)
  194. return
  195. }
  196. // Look for an edge
  197. _, n = n.getEdge(search[0])
  198. if n == nil {
  199. break
  200. }
  201. // Consume the search prefix
  202. if bytes.HasPrefix(search, n.prefix) {
  203. search = search[len(n.prefix):]
  204. } else if bytes.HasPrefix(n.prefix, search) {
  205. // Child may be under our search prefix
  206. recursiveWalk(n, fn)
  207. return
  208. } else {
  209. break
  210. }
  211. }
  212. }
  213. // WalkPath is used to walk the tree, but only visiting nodes
  214. // from the root down to a given leaf. Where WalkPrefix walks
  215. // all the entries *under* the given prefix, this walks the
  216. // entries *above* the given prefix.
  217. func (n *Node) WalkPath(path []byte, fn WalkFn) {
  218. search := path
  219. for {
  220. // Visit the leaf values if any
  221. if n.leaf != nil && fn(n.leaf.key, n.leaf.val) {
  222. return
  223. }
  224. // Check for key exhaution
  225. if len(search) == 0 {
  226. return
  227. }
  228. // Look for an edge
  229. _, n = n.getEdge(search[0])
  230. if n == nil {
  231. return
  232. }
  233. // Consume the search prefix
  234. if bytes.HasPrefix(search, n.prefix) {
  235. search = search[len(n.prefix):]
  236. } else {
  237. break
  238. }
  239. }
  240. }
  241. // recursiveWalk is used to do a pre-order walk of a node
  242. // recursively. Returns true if the walk should be aborted
  243. func recursiveWalk(n *Node, fn WalkFn) bool {
  244. // Visit the leaf values if any
  245. if n.leaf != nil && fn(n.leaf.key, n.leaf.val) {
  246. return true
  247. }
  248. // Recurse on the children
  249. for _, e := range n.edges {
  250. if recursiveWalk(e.node, fn) {
  251. return true
  252. }
  253. }
  254. return false
  255. }