mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-10-07 11:27:50 +00:00
commit
644262810f
2 changed files with 78 additions and 34 deletions
|
|
@ -3156,8 +3156,9 @@ func xorArrayRun(a, b *container) *container {
|
|||
} else if va > vb.start {
|
||||
if va < vb.last {
|
||||
output.n += output.runAppendInterval(interval16{start: vb.start, last: va - 1})
|
||||
vb.start = va + 1
|
||||
i++
|
||||
vb.start = va + 1
|
||||
|
||||
if vb.start > vb.last {
|
||||
j++
|
||||
}
|
||||
|
|
@ -3166,15 +3167,22 @@ func xorArrayRun(a, b *container) *container {
|
|||
j++
|
||||
} else { // va == vb.last
|
||||
vb.last--
|
||||
if vb.start < vb.last {
|
||||
if vb.start <= vb.last {
|
||||
output.n += output.runAppendInterval(vb)
|
||||
}
|
||||
j++
|
||||
i++
|
||||
}
|
||||
|
||||
} else {
|
||||
vb.start++
|
||||
} else { // we know va == vb.start
|
||||
if vb.start == maxContainerVal { // protect overflow
|
||||
j++
|
||||
} else {
|
||||
vb.start++
|
||||
if vb.start > vb.last {
|
||||
j++
|
||||
}
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
|
@ -3222,9 +3230,15 @@ func xorCompare(x *xorstm) (r1 interval16, has_data bool) {
|
|||
r1 = interval16{start: x.va.start, last: x.vb.start - 1}
|
||||
has_data = true
|
||||
}
|
||||
x.va.start = x.vb.last + 1
|
||||
if x.va.start > x.va.last {
|
||||
|
||||
if x.vb.last == maxContainerVal { // Check for overflow
|
||||
x.va_valid = false
|
||||
|
||||
} else {
|
||||
x.va.start = x.vb.last + 1
|
||||
if x.va.start > x.va.last {
|
||||
x.va_valid = false
|
||||
}
|
||||
}
|
||||
|
||||
} else if x.vb.start <= x.va.start && x.vb.last >= x.va.last { //va inside
|
||||
|
|
@ -3234,26 +3248,39 @@ func xorCompare(x *xorstm) (r1 interval16, has_data bool) {
|
|||
has_data = true
|
||||
}
|
||||
|
||||
x.vb.start = x.va.last + 1
|
||||
if x.vb.start > x.vb.last {
|
||||
if x.va.last == maxContainerVal { //check for overflow
|
||||
x.vb_valid = false
|
||||
} else {
|
||||
x.vb.start = x.va.last + 1
|
||||
if x.vb.start > x.vb.last {
|
||||
x.vb_valid = false
|
||||
}
|
||||
}
|
||||
|
||||
} else if x.va.start < x.vb.start && x.va.last <= x.vb.last { //va first overlap
|
||||
x.va_valid = false
|
||||
r1 = interval16{start: x.va.start, last: x.vb.start - 1}
|
||||
has_data = true
|
||||
x.vb.start = x.va.last + 1
|
||||
if x.vb.start > x.vb.last {
|
||||
if x.va.last == maxContainerVal { // check for overflow
|
||||
x.vb_valid = false
|
||||
} else {
|
||||
x.vb.start = x.va.last + 1
|
||||
if x.vb.start > x.vb.last {
|
||||
x.vb_valid = false
|
||||
}
|
||||
}
|
||||
} else if x.vb.start < x.va.start && x.vb.last <= x.va.last { //vb first overlap
|
||||
x.vb_valid = false
|
||||
r1 = interval16{start: x.vb.start, last: x.va.start - 1}
|
||||
has_data = true
|
||||
x.va.start = x.vb.last + 1
|
||||
if x.va.start > x.va.last {
|
||||
|
||||
if x.vb.last == maxContainerVal { // check for overflow
|
||||
x.va_valid = false
|
||||
} else {
|
||||
x.va.start = x.vb.last + 1
|
||||
if x.va.start > x.va.last {
|
||||
x.va_valid = false
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
|
|
|
|||
|
|
@ -1711,31 +1711,43 @@ func TestWriteReadRun(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestXorArrayRun(t *testing.T) {
|
||||
a := &container{array: []uint16{1, 5, 10, 11, 12}, container_type: ContainerArray}
|
||||
b := &container{runs: []interval16{{start: 2, last: 10}, {start: 12, last: 13}, {start: 15, last: 16}}, container_type: ContainerRun}
|
||||
exp := []uint16{1, 2, 3, 4, 6, 7, 8, 9, 11, 13, 15, 16}
|
||||
|
||||
//ret := xorArrayRun(a, b)
|
||||
ret := xor(a, b)
|
||||
if !reflect.DeepEqual(ret.array, exp) {
|
||||
t.Fatalf("test #1 expected %v, but got %v", exp, ret.array)
|
||||
tests := []struct {
|
||||
a *container
|
||||
b *container
|
||||
exp *container
|
||||
}{
|
||||
{
|
||||
a: &container{array: []uint16{1, 5, 10, 11, 12}, container_type: ContainerArray},
|
||||
b: &container{runs: []interval16{{start: 2, last: 10}, {start: 12, last: 13}, {start: 15, last: 16}}, container_type: ContainerRun},
|
||||
exp: &container{array: []uint16{1, 2, 3, 4, 6, 7, 8, 9, 11, 13, 15, 16}, container_type: ContainerArray, n: 12},
|
||||
}, {
|
||||
a: &container{array: []uint16{1, 5, 10, 11, 12, 13, 14}, container_type: ContainerArray},
|
||||
b: &container{runs: []interval16{{start: 2, last: 10}, {start: 12, last: 13}, {start: 15, last: 16}}, container_type: ContainerRun},
|
||||
exp: &container{array: []uint16{1, 2, 3, 4, 6, 7, 8, 9, 11, 14, 15, 16}, container_type: ContainerArray, n: 12},
|
||||
}, {
|
||||
a: &container{array: []uint16{65535}, container_type: ContainerArray},
|
||||
b: &container{runs: []interval16{{start: 65534, last: 65535}}, container_type: ContainerRun},
|
||||
exp: &container{array: []uint16{65534}, container_type: ContainerArray, n: 1},
|
||||
}, {
|
||||
a: &container{array: []uint16{65535}, container_type: ContainerArray},
|
||||
b: &container{runs: []interval16{{start: 65535, last: 65535}}, container_type: ContainerRun},
|
||||
exp: &container{array: []uint16{}, container_type: ContainerArray, n: 0},
|
||||
},
|
||||
}
|
||||
|
||||
ret = xor(b, a)
|
||||
if !reflect.DeepEqual(ret.array, exp) {
|
||||
t.Fatalf("test #2 expected %v, but got %v", exp, ret.array)
|
||||
}
|
||||
c := &container{array: []uint16{1, 5, 10, 11, 12, 13, 14}, container_type: ContainerArray}
|
||||
// exp = []int16{1, 2, 3, 4, 6, 7, 8, 9, 11, 14, 15, 16}
|
||||
expr := []interval16{{start: 1, last: 4}, {start: 6, last: 9}, {start: 11, last: 11}, {start: 14, last: 16}}
|
||||
ret = xor(b, c)
|
||||
if !reflect.DeepEqual(ret.runs, expr) {
|
||||
t.Fatalf("test #3 expected %v, but got %v", exp, ret.runs)
|
||||
}
|
||||
ret = xor(c, b)
|
||||
if !reflect.DeepEqual(ret.runs, expr) {
|
||||
t.Fatalf("test #4 expected %v, but got %v", exp, ret.array)
|
||||
for i, test := range tests {
|
||||
test.a.n = test.a.count()
|
||||
test.b.n = test.b.count()
|
||||
ret := xor(test.a, test.b)
|
||||
if !reflect.DeepEqual(ret, test.exp) {
|
||||
t.Fatalf("test #%v expected %v, but got %v", i, test.exp, ret)
|
||||
}
|
||||
ret = xor(test.b, test.a)
|
||||
if !reflect.DeepEqual(ret, test.exp) {
|
||||
t.Fatalf("test #%v.1 expected %v, but got %v", i, test.exp, ret)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//special case that didn't fit the xorrunrun table testing below.
|
||||
|
|
@ -1832,6 +1844,11 @@ func TestXorRunRun(t *testing.T) {
|
|||
bruns: []interval16{{start: 2, last: 8}, {start: 16, last: 27}, {start: 33, last: 34}},
|
||||
exp: []interval16{{start: 1, last: 1}, {start: 4, last: 4}, {start: 6, last: 6}, {start: 9, last: 9}, {start: 12, last: 15}, {start: 23, last: 27}, {start: 33, last: 34}},
|
||||
},
|
||||
{
|
||||
aruns: []interval16{{start: 65530, last: 65535}},
|
||||
bruns: []interval16{{start: 65532, last: 65535}},
|
||||
exp: []interval16{{start: 65530, last: 65531}},
|
||||
},
|
||||
}
|
||||
for i, test := range tests {
|
||||
a.runs = test.aruns
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue