add Length, GetRandomNode; fix FixType
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
Arnas Udovic 2025-03-16 02:18:12 +02:00
parent d14b45abdf
commit ddc31e4ca5
3 changed files with 116 additions and 0 deletions

View file

@ -1,3 +1,10 @@
v1.0.5, released 2025-03-16
* bugfixes
- FixType - run recursevily into child nodes to get correct value
* features
- Length - get length of list
- GetRandomNode - get random node from list
v1.0.4, released 2025-01-07
* abcex to v4

View file

@ -2,6 +2,7 @@ package zordfsdb
import (
"fmt"
"math/rand"
"os"
"path"
"strings"
@ -111,6 +112,8 @@ func (node *Node) FixType() {
node.List = false
node.Object = false
for _, child := range node.Nodes {
child.FixType()
if child.Object {
node.List = true
break
@ -313,3 +316,36 @@ func (db *DB) AddObject(vpath string) (string, error) {
return abcex.Encode(maxId, abcex.BASE62), nil
}
func (db *DB) Length(vpath string) (int64, error) {
node, found := db.GetNode(vpath)
if !found {
return 0, fmt.Errorf("Node not found")
}
if !node.List {
return 0, fmt.Errorf("Node is not a list")
}
return int64(len(node.Nodes)), nil
}
func (db *DB) getRandomNode(vpath string) (Node, error) {
node, found := db.GetNode(vpath)
if !found {
return Node{}, fmt.Errorf("Node not found")
}
if !node.List {
return Node{}, fmt.Errorf("Not a list")
}
if len(node.Nodes) == 0 {
return Node{}, fmt.Errorf("List is empty")
}
keys := db.Keys(vpath)
randomKey := keys[rand.Intn(len(keys))]
return node.Nodes[randomKey], nil
}

View file

@ -199,3 +199,76 @@ func TestCreateList(t *testing.T) {
t.Fatal("object.list2.0.newKey4 value wrong")
}
}
func TestListLength(t *testing.T) {
copy(t)
db, err := InitDB("./testdata2")
if err != nil {
t.Fatal(err)
}
success := db.CreateNode("object.list3")
if !success {
t.Fatal("object.list3 node was not created")
}
id, _ := db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
id, _ = db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
id, _ = db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
id, _ = db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
node, _ := db.GetNode("object.list3")
node.FixType()
fmt.Println(db.GetNode("object.list3"))
length, err := db.Length("object.list3")
if err != nil {
t.Fatal(err)
}
if length != 4 {
t.Fatal("object.list3 length wrong")
}
length, err = db.Length("object")
if err == nil {
t.Fatal("Error expected")
}
}
func TestListRandomNode(t *testing.T) {
copy(t)
db, err := InitDB("./testdata2")
if err != nil {
t.Fatal(err)
}
success := db.CreateNode("object.list3")
if !success {
t.Fatal("object.list3 node was not created")
}
id, _ := db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
id, _ = db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
id, _ = db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
id, _ = db.AddObject("object.list3")
db.Save("object.list3."+id+".key", "value")
node, _ := db.GetNode("object.list3")
node.FixType()
node, _ = db.getRandomNode("object.list3")
if node.Nodes["key"].Value != "value" {
fmt.Println(node)
t.Fatal("Random node value wrong")
}
}