Documentation
¶
Overview ¶
Package art implements an Adapative Radix Tree(ART) in pure Go. Note that this implementation is not thread-safe but it could be really easy to implement.
The design of ART is based on "The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases" [1].
Usage
package main import ( "fmt" "github.com/plar/go-adaptive-radix-tree" ) func main() { tree := art.New() tree.Insert(art.Key("Hi, I'm Key"), "Nice to meet you, I'm Value") value, found := tree.Search(art.Key("Hi, I'm Key")) if found { fmt.Printf("Search value=%v\n", value) } tree.ForEach(func(node art.Node) bool { fmt.Printf("Callback value=%v\n", node.Value()) return true } for it := tree.Iterator(); it.HasNext(); { value, _ := it.Next() fmt.Printf("Iterator value=%v\n", value.Value()) } } // Output: // Search value=Nice to meet you, I'm Value // Callback value=Nice to meet you, I'm Value // Iterator value=Nice to meet you, I'm Value
Also the current implementation was inspired by [2] and [3]
[1] http://db.in.tum.de/~leis/papers/ART.pdf (Specification)
[2] https://github.com/armon/libart (C99 implementation)
[3] https://github.com/kellydunn/go-art (other Go implementation)
Index ¶
- Constants
- Variables
- func DumpNode(root *nodeRef) string
- func RefAddrFormatter(a *dumpNodeRef) string
- func RefFullFormatter(a *dumpNodeRef) string
- func RefShortFormatter(a *dumpNodeRef) string
- func TreeStringer(t Tree, opts ...treeStringerOption) string
- func WithRefFormatter(formatter refFormatter) treeStringerOption
- func WithStorageSize(size int) treeStringerOption
- type Callback
- type Iterator
- type Key
- type Kind
- type Node
- type Tree
- type Value
Constants ¶
const ( // Iterate only over leaf nodes. TraverseLeaf = 1 // Iterate only over non-leaf nodes. TraverseNode = 2 // Iterate over all nodes in the tree. TraverseAll = TraverseLeaf | TraverseNode )
Traverse Options.
Variables ¶
var ( ErrConcurrentModification = errors.New("concurrent modification has been detected") ErrNoMoreNodes = errors.New("there are no more nodes in the tree") )
These errors can be returned when iteration over the tree.
Functions ¶
func DumpNode ¶
func DumpNode(root *nodeRef) string
DumpNode returns Tree in the human readable format:
--8<-- // main.go
package main import ( "fmt" art "github.com/plar/go-adaptive-radix-tree" ) func main() { tree := art.New() terms := []string{"A", "a", "aa"} for _, term := range terms { tree.Insert(art.Key(term), term) } fmt.Println(tree) }
--8<--
$ go run main.go ─── Node4 (0xc00011c2d0) prefix(0): [··········] [0 0 0 0 0 0 0 0 0 0] keys: [Aa··] [65 97 · ·] children(2): [0xc00011c2a0 0xc00011c300 - -] <-> ├── Leaf (0xc00011c2a0) │ key(1): [A] [65] │ val: A │ ├── Node4 (0xc00011c300) │ prefix(0): [··········] [0 0 0 0 0 0 0 0 0 0] │ keys: [a···] [97 · · ·] │ children(1): [0xc00011c2f0 - - -] <0xc00011c2c0> │ ├── Leaf (0xc00011c2f0) │ │ key(2): [aa] [97 97] │ │ val: aa │ │ │ ├── nil │ ├── nil │ ├── nil │ └── Leaf (0xc00011c2c0) │ key(1): [a] [97] │ val: a │ │ ├── nil ├── nil └── nil
func RefAddrFormatter ¶ added in v1.0.6
func RefAddrFormatter(a *dumpNodeRef) string
RefAddrFormatter returns only the pointer address of the node (legacy).
func RefFullFormatter ¶ added in v1.0.6
func RefFullFormatter(a *dumpNodeRef) string
RefFullFormatter returns the full address of the node, including the ID and the pointer.
func RefShortFormatter ¶ added in v1.0.6
func RefShortFormatter(a *dumpNodeRef) string
RefShortFormatter returns only the ID of the node.
func TreeStringer ¶ added in v1.0.6
TreeStringer returns the string representation of the tree. The tree must be of type *art.tree.
func WithRefFormatter ¶ added in v1.0.6
func WithRefFormatter(formatter refFormatter) treeStringerOption
WithRefFormatter sets the formatter for node references.
func WithStorageSize ¶ added in v1.0.6
func WithStorageSize(size int) treeStringerOption
WithStorageSize sets the size of the storage for depth information.
Types ¶
type Callback ¶
Callback defines the function type used during tree traversal. It is invoked for each node visited in the traversal. If the callback function returns false, the iteration is terminated early.
type Iterator ¶
type Iterator interface { // HasNext returns true if there are more nodes to visit during the iteration. // Use this method to check for remaining nodes before calling Next. HasNext() bool // Next returns the next node in the iteration and advances the iterator's position. // If the iteration has no more nodes, it returns ErrNoMoreNodes error. // Ensure you call HasNext before invoking Next to avoid errors. // If the tree has been structurally modified since the iterator was created, // it returns an ErrConcurrentModification error. Next() (Node, error) }
Iterator provides a mechanism to traverse nodes in key order within the tree.
type Key ¶
type Key []byte
Key represents the type used for keys in the Adaptive Radix Tree. It can consist of any byte sequence, including Unicode characters and null bytes.
type Node ¶
type Node interface { // Kind returns the type of the node, distinguishing between leaf and internal nodes. Kind() Kind // Key returns the key associated with a leaf node. // This method should only be called on leaf nodes. // Calling this on a non-leaf node will return nil. Key() Key // Value returns the value stored in a leaf node. // This method should only be called on leaf nodes. // Calling this on a non-leaf node will return nil. Value() Value }
Node represents a node within the Adaptive Radix Tree.
type Tree ¶
type Tree interface { // Insert adds a new key-value pair into the tree. // If the key already exists in the tree, it updates its value and returns the old value along with true. // If the key is new, it returns nil and false. Insert(key Key, value Value) (oldValue Value, updated bool) // Delete removes the specified key and its associated value from the tree. // If the key is found and deleted, it returns the removed value and true. // If the key does not exist, it returns nil and false. Delete(key Key) (value Value, deleted bool) // Search retrieves the value associated with the specified key in the tree. // If the key exists, it returns the value and true. // If the key does not exist, it returns nil and false. Search(key Key) (value Value, found bool) // ForEach iterates over all the nodes in the tree, invoking a provided callback function for each node. // By default, it processes leaf nodes in ascending order. // The iteration can be customized using options: // - Pass TraverseLeaf to iterate only over leaf nodes. // - Pass TraverseNode to iterate only over non-leaf nodes. // - Pass TraverseAll to iterate over all nodes in the tree. // The iteration stops if the callback function returns false, allowing for early termination. ForEach(callback Callback, options ...int) // ForEachPrefix iterates over all leaf nodes whose keys start with the specified keyPrefix, // invoking a provided callback function for each matching node. // By default, the iteration processes nodes in ascending order. // Iteration stops if the callback function returns false, allowing for early termination. ForEachPrefix(keyPrefix Key, callback Callback) // Iterator returns an iterator for traversing leaf nodes in the tree. // By default, the iteration occurs in ascending order. Iterator(options ...int) Iterator // Minimum retrieves the leaf node with the smallest key in the tree. // If such a leaf is found, it returns its value and true. // If the tree is empty, it returns nil and false. Minimum() (Value, bool) // Maximum retrieves the leaf node with the largest key in the tree. // If such a leaf is found, it returns its value and true. // If the tree is empty, it returns nil and false. Maximum() (Value, bool) // Size returns the number of key-value pairs stored in the tree. Size() int }
Tree is an Adaptive Radix Tree interface.