Commit 21bd85f5 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 9b023909
...@@ -377,6 +377,12 @@ func (S *RangedKeySet) Clear() { ...@@ -377,6 +377,12 @@ func (S *RangedKeySet) Clear() {
S.rangev = nil S.rangev = nil
} }
// AllRanges returns slice of all key ranges in the set.
// XXX -> iter?
func (S *RangedKeySet) AllRanges() /*readonly*/[]KeyRange {
return S.rangev
}
func (S RangedKeySet) String() string { func (S RangedKeySet) String() string {
s := "{" s := "{"
for i, r := range S.rangev { for i, r := range S.rangev {
......
...@@ -129,18 +129,18 @@ func TestRangedKeySet(t *testing.T) { ...@@ -129,18 +129,18 @@ func TestRangedKeySet(t *testing.T) {
t.Errorf("Difference:\n A: %s\n B: %s\n ->d: %s\n okD: %s\n", tt.A, tt.B, D, tt.Difference) t.Errorf("Difference:\n A: %s\n B: %s\n ->d: %s\n okD: %s\n", tt.A, tt.B, D, tt.Difference)
} }
// HasRange XXX use AllRanges instead of direct .rangev access // HasRange
assertHasRange(t, A.rangev, A, true) assertHasRange(t, A.AllRanges(), A, true)
assertHasRange(t, B.rangev, B, true) assertHasRange(t, B.AllRanges(), B, true)
assertHasRange(t, A.rangev, U, true) assertHasRange(t, A.AllRanges(), U, true)
assertHasRange(t, B.rangev, U, true) assertHasRange(t, B.AllRanges(), U, true)
Dab := D Dab := D
Dba := B.Difference(A) Dba := B.Difference(A)
assertHasRange(t, Dab.rangev, A, true) assertHasRange(t, Dab.AllRanges(), A, true)
assertHasRange(t, Dab.rangev, B, false) assertHasRange(t, Dab.AllRanges(), B, false)
assertHasRange(t, Dba.rangev, B, true) assertHasRange(t, Dba.AllRanges(), B, true)
assertHasRange(t, Dba.rangev, A, false) assertHasRange(t, Dba.AllRanges(), A, false)
} }
} }
......
...@@ -714,33 +714,44 @@ func diffT(ctx context.Context, A, B *Tree, δZTC SetOid, trackSet PPTreeSubSet) ...@@ -714,33 +714,44 @@ func diffT(ctx context.Context, A, B *Tree, δZTC SetOid, trackSet PPTreeSubSet)
break break
} }
for k := range Bkqueue { // for k := range Bkqueue {
b, err := Bv.GetToLeaf(ctx, k); /*X*/if err != nil { return nil,nil, err } for _, r := range Bkqueue.AllRanges() {
tracef(" B k%d -> %s\n", k, b) lo := r.lo
// +bucket if that bucket is reached for the first time for {
if !b.done { b, err := Bv.GetToLeaf(ctx, lo); /*X*/if err != nil { return nil,nil, err }
var δB map[Key]ΔValue tracef(" B k%d -> %s\n", lo, b)
bbucket, ok := b.node.(*Bucket) // +bucket if that bucket is reached for the first time
if ok { // !ok means ø tree if !b.done {
δB, err = diffB(ctx, nil, bbucket); /*X*/if err != nil { return nil,nil, err } var δB map[Key]ΔValue
} bbucket, ok := b.node.(*Bucket)
if ok { // !ok means ø tree
δB, err = diffB(ctx, nil, bbucket); /*X*/if err != nil { return nil,nil, err }
}
// δ <- δB
err = δMerge(δ, δB); /*X*/if err != nil { return nil,nil, err }
δtrack.Add.AddPath(b.Path())
// Akqueue <- δB
br := KeyRange{b.lo, b.hi_}
Bkdone.AddRange(br)
Aktodo(br)
/*
for k_ := range δB {
Bkdone.Add(k_)
Aktodo(k_)
}
*/
// δ <- δB b.done = true
err = δMerge(δ, δB); /*X*/if err != nil { return nil,nil, err }
δtrack.Add.AddPath(b.Path())
// Akqueue <- δB
br := KeyRange{b.lo, b.hi_}
Bkdone.AddRange(br)
Aktodo(br)
/*
for k_ := range δB {
Bkdone.Add(k_)
Aktodo(k_)
} }
*/
b.done = true // stop if r coverage is complete
if r.hi_ <= b.hi_ {
break
}
// continue with next right bucket
lo = b.hi_ + 1
} }
// XXX k is not there -> hole XXX test XXX <- kill? // XXX k is not there -> hole XXX test XXX <- kill?
...@@ -749,38 +760,49 @@ func diffT(ctx context.Context, A, B *Tree, δZTC SetOid, trackSet PPTreeSubSet) ...@@ -749,38 +760,49 @@ func diffT(ctx context.Context, A, B *Tree, δZTC SetOid, trackSet PPTreeSubSet)
tracef("\n") tracef("\n")
tracef(" Akq: %s\n", Akqueue) tracef(" Akq: %s\n", Akqueue)
for k := range Akqueue { // for k := range Akqueue {
a, err := Av.GetToLeaf(ctx, k); /*X*/if err != nil { return nil,nil, err } for _, r := range Akqueue.AllRanges() {
tracef(" A k%d -> %s\n", k, a) lo := r.lo
// -bucket if that bucket is reached for the first time for {
if !a.done { a, err := Av.GetToLeaf(ctx, lo); /*X*/if err != nil { return nil,nil, err }
var δA map[Key]ΔValue tracef(" A k%d -> %s\n", lo, a)
abucket, ok := a.node.(*Bucket) // -bucket if that bucket is reached for the first time
if ok { // !ok means ø tree if !a.done {
δA, err = diffB(ctx, abucket, nil); /*X*/if err != nil { return nil,nil, err } var δA map[Key]ΔValue
} abucket, ok := a.node.(*Bucket)
if ok { // !ok means ø tree
δA, err = diffB(ctx, abucket, nil); /*X*/if err != nil { return nil,nil, err }
}
// δ <- δA // δ <- δA
err = δMerge(δ, δA); /*X*/if err != nil { return nil,nil, err } err = δMerge(δ, δA); /*X*/if err != nil { return nil,nil, err }
δtrack.Del.AddPath(a.Path()) δtrack.Del.AddPath(a.Path())
// Bkqueue <- a.range
ar := KeyRange{a.lo, a.hi_}
Akdone.AddRange(ar)
Bktodo(ar)
/* XXX kill
// Bkqueue <- δA
for k_ := range δA {
Akdone.Add(k_)
Bktodo(k_)
}
// Bkqueue <- holes(a.range)
for k_ := range holeIdx.GetInRange(a.lo, a.hi_) {
Bktodo(k_)
}
*/
// Bkqueue <- a.range a.done = true
ar := KeyRange{a.lo, a.hi_}
Akdone.AddRange(ar)
Bktodo(ar)
/* XXX kill
// Bkqueue <- δA
for k_ := range δA {
Akdone.Add(k_)
Bktodo(k_)
} }
// Bkqueue <- holes(a.range)
for k_ := range holeIdx.GetInRange(a.lo, a.hi_) {
Bktodo(k_)
}
*/
a.done = true // stop if r coverage is complete
if r.hi_ <= a.hi_ {
break
}
// continue with next right bucket
lo = a.hi_ + 1
} }
} }
Akqueue.Clear() Akqueue.Clear()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment