Golang realisation of MPTT (or modified preorder tree traversal) in materialized path way.
It provides interfaces which yor database object should implement.
Your database object should store:
path
property as slice of uint64 IDs of materialized path to this object in traversal tree;position
property as integer for determine the order of leafs in tree
Implementation example and tests are in test file.
package main
import (
"fmt"
"github.com/spacetab-io/mpath"
)
type TestItems []*TestItem
type TestItem struct {
ID uint64
Path []uint64
Position int
Siblings TestItems
Name string
}
// Leaf interface implementation for TestItem
// ...
// Leafs interface implementation for TestItems
// ...
func main() {
flatItemsSlice := getTestItems()
var parent = TestItem{}
if err := mpath.InitTree(&parent, flatItemsSlice); err != nil {
panic("error tree init")
}
fmt.Print(parent)
}
func getTestItems() *TestItems {
return &TestItems{
{ID: 1, Position: 0, Name: "item 1", Path: []uint64{1}},
{ID: 2, Position: 0, Name: "item 2", Path: []uint64{1, 2}},
{ID: 3, Position: 1, Name: "item 3", Path: []uint64{1, 3}},
{ID: 4, Position: 0, Name: "item 4", Path: []uint64{1, 2, 4}},
{ID: 5, Position: 1, Name: "item 5", Path: []uint64{1, 2, 5}},
{ID: 6, Position: 0, Name: "item 6", Path: []uint64{1, 3, 6}},
}
}
go test ./... -v -race