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:
parent
2ba5555b6e
commit
fa1ea8d417
5 changed files with 41 additions and 12 deletions
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
|
@ -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("-<")
|
||||
|
|
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue