1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 14:07:02 +09:00

Add IterateSkip

This commit is contained in:
mcrakhman 2024-09-02 15:58:27 +02:00
parent 2ba5555b6e
commit fa1ea8d417
No known key found for this signature in database
GPG key ID: DED12CFEF5B8396B
5 changed files with 41 additions and 12 deletions

View file

@ -600,7 +600,7 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate
return
}
if convert == nil {
ot.tree.Iterate(id, iterate)
ot.tree.IterateSkip(id, iterate)
return
}
decrypt := func(c *Change) (decrypted []byte, err error) {
@ -619,7 +619,7 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate
return
}
ot.tree.Iterate(id, func(c *Change) (isContinue bool) {
ot.tree.IterateSkip(id, func(c *Change) (isContinue bool) {
var model any
// if already saved as a model
if c.Model != nil {

View file

@ -63,7 +63,7 @@ func newTreeValidator(validateKeys bool, filterChanges bool) ObjectTreeValidator
}
func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list.AclList) (err error) {
tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) {
tree.IterateSkip(tree.RootId(), func(c *Change) (isContinue bool) {
err = v.validateChange(tree, aclList, c)
return err == nil
})

View file

@ -408,8 +408,14 @@ func (t *Tree) iterate(start *Change, f func(c *Change) (isContinue bool)) {
it.iterate(start, f)
}
func (t *Tree) Iterate(startId string, f func(c *Change) (isContinue bool)) {
t.iterate(t.attached[startId], f)
func (t *Tree) iterateSkip(start *Change, f func(c *Change) (isContinue bool)) {
it := newIterator()
defer freeIterator(it)
it.iterateSkip(t.root, start, true, f)
}
func (t *Tree) IterateSkip(startId string, f func(c *Change) (isContinue bool)) {
t.iterateSkip(t.attached[startId], f)
}
func (t *Tree) IterateBranching(startId string, f func(c *Change, branchLevel int) (isContinue bool)) {
@ -464,7 +470,7 @@ func (t *Tree) HeadsChanges() []*Change {
func (t *Tree) String() string {
var buf = bytes.NewBuffer(nil)
t.Iterate(t.RootId(), func(c *Change) (isContinue bool) {
t.IterateSkip(t.RootId(), func(c *Change) (isContinue bool) {
buf.WriteString(c.Id)
if len(c.Next) > 1 {
buf.WriteString("-<")

View file

@ -193,7 +193,7 @@ func TestTree_CheckRootReduce(t *testing.T) {
tr.reduceTree()
assert.Equal(t, "10", tr.RootId())
var res []string
tr.Iterate(tr.RootId(), func(c *Change) (isContinue bool) {
tr.IterateSkip(tr.RootId(), func(c *Change) (isContinue bool) {
res = append(res, c.Id)
return true
})
@ -228,7 +228,7 @@ func TestTree_CheckRootReduce(t *testing.T) {
tr.reduceTree()
assert.Equal(t, "10", tr.RootId())
var res []string
tr.Iterate(tr.RootId(), func(c *Change) (isContinue bool) {
tr.IterateSkip(tr.RootId(), func(c *Change) (isContinue bool) {
res = append(res, c.Id)
return true
})
@ -279,17 +279,40 @@ func TestTree_Iterate(t *testing.T) {
newChange("last", "0", "10"),
)
var res []string
tr.Iterate("0", func(c *Change) (isContinue bool) {
tr.IterateSkip("0", func(c *Change) (isContinue bool) {
res = append(res, c.Id)
return true
})
res = res[:0]
tr.Iterate("0", func(c *Change) (isContinue bool) {
tr.IterateSkip("0", func(c *Change) (isContinue bool) {
res = append(res, c.Id)
return true
})
assert.Equal(t, []string{"0", "1", "1.1", "1.2", "1.4", "1.3", "1.3.1", "1.2+3", "1.2+3.1", "10", "last"}, res)
})
t.Run("complex tree with diverging branches", func(t *testing.T) {
tr := new(Tree)
tr.Add(
newSnapshot("0", ""),
newChange("1", "0", "0"),
newChange("2", "0", "0"),
newChange("2.1", "0", "2"),
newChange("2.2", "0", "2"),
newChange("2.4", "0", "2.2"),
newChange("2.3", "0", "2"),
newChange("2.3.1", "0", "2.3"),
newChange("2.2+3", "0", "2.4", "2.3.1"),
newChange("2.2+3.1", "0", "2.2+3"),
newChange("10", "0", "2.2+3.1", "2.1"),
newChange("last", "0", "10"),
)
var res []string
tr.IterateSkip("1", func(c *Change) (isContinue bool) {
res = append(res, c.Id)
return true
})
assert.Equal(t, []string{"1", "2", "2.1", "2.2", "2.4", "2.3", "2.3.1", "2.2+3", "2.2+3.1", "10", "last"}, res)
})
}
func BenchmarkTree_Add(b *testing.B) {
@ -336,7 +359,7 @@ func BenchmarkTree_IterateLinear(b *testing.B) {
}
b.Run("add linear", func(b *testing.B) {
for i := 0; i < b.N; i++ {
tr.Iterate("0", func(c *Change) (isContinue bool) {
tr.IterateSkip("0", func(c *Change) (isContinue bool) {
return true
})
}

View file

@ -21,7 +21,7 @@ import (
func (t *Tree) Graph(parser DescriptionParser) (data string, err error) {
var order = make(map[string]string)
var seq = 0
t.Iterate(t.RootId(), func(c *Change) (isContinue bool) {
t.IterateSkip(t.RootId(), func(c *Change) (isContinue bool) {
v := order[c.Id]
if v == "" {
order[c.Id] = fmt.Sprint(seq)