unionRunRun working - messy

This commit is contained in:
Matt Jaffee 2017-05-30 13:19:02 -05:00
parent 24c03f07f6
commit 4848a99aca
2 changed files with 100 additions and 1 deletions

View file

@ -1865,7 +1865,71 @@ func unionArrayRun(a, b *container) *container {
}
func unionRunRun(a, b *container) *container {
return nil
na, nb := len(a.runs), len(b.runs)
if na == 0 {
return b.clone()
} else if nb == 0 {
return a.clone()
}
output := &container{
runs: make([]interval32, 0, na+nb),
}
i, j := 0, 0
if a.runs[0].start < b.runs[0].start {
output.runs = append(output.runs, a.runs[0])
i = 1
} else {
output.runs = append(output.runs, b.runs[0])
j = 1
}
for i < na && j < nb {
va, vb := a.runs[i], b.runs[j]
lastrun := output.runs[len(output.runs)-1]
if va.start < vb.start {
if va.start <= lastrun.last+1 {
if lastrun.last < va.last {
lastrun.last = va.last
output.runs[len(output.runs)-1] = lastrun
}
} else {
output.runs = append(output.runs, va)
}
i++
} else {
if vb.start <= lastrun.last+1 {
if lastrun.last < vb.last {
lastrun.last = vb.last
output.runs[len(output.runs)-1] = lastrun
}
} else {
output.runs = append(output.runs, vb)
}
j++
}
}
var k int
var rest []interval32
if i < na {
k = i
rest = a.runs
} else {
k = j
rest = b.runs
}
for k < len(rest) {
vk := rest[k]
lastrun := output.runs[len(output.runs)-1]
if vk.start <= lastrun.last+1 {
if lastrun.last < vk.last {
lastrun.last = vk.last
output.runs[len(output.runs)-1] = lastrun
}
} else {
output.runs = append(output.runs, vk)
}
k++
}
return output
}
func unionBitmapRun(a, b *container) *container {

View file

@ -525,3 +525,38 @@ func TestIntersectBitmapRunArray(t *testing.T) {
}
}
func TestUnionRunRun(t *testing.T) {
a := &container{}
b := &container{}
tests := []struct {
aruns []interval32
bruns []interval32
exp []interval32
}{
{
aruns: []interval32{},
bruns: []interval32{{start: 5, last: 10}},
exp: []interval32{{start: 5, last: 10}},
},
{
aruns: []interval32{{start: 5, last: 12}},
bruns: []interval32{{start: 5, last: 10}},
exp: []interval32{{start: 5, last: 12}},
},
{
aruns: []interval32{{start: 1, last: 3}, {start: 5, last: 5}, {start: 7, last: 8}, {start: 9, last: 12}},
bruns: []interval32{{start: 5, last: 10}},
exp: []interval32{{start: 1, last: 3}, {start: 5, last: 12}},
},
}
for i, test := range tests {
a.runs = test.aruns
b.runs = test.bruns
ret := unionRunRun(a, b)
if !reflect.DeepEqual(ret.runs, test.exp) {
t.Fatalf("test #%v expected %v, but got %v", i, test.exp, ret.runs)
}
}
}