more cardinality and conversions

This commit is contained in:
Matt Jaffee 2017-05-30 22:08:21 -05:00
parent 487a369c6d
commit 32c3b2ad52
2 changed files with 18 additions and 9 deletions

View file

@ -1715,7 +1715,7 @@ func intersectRunRun(a, b *container) *container {
i++
}
}
if output.n < 4096 && len(output.runs) > output.n/2 {
if output.n < ArrayMaxSize && len(output.runs) > output.n/2 {
output.runToArray()
} else if len(output.runs) > RunMaxSize {
output.runToBitmap()
@ -1724,10 +1724,10 @@ func intersectRunRun(a, b *container) *container {
}
// intersectBitmapRun returns an array container if the run container's
// cardinality is < 4096. Otherwise it returns a bitmap container.
// cardinality is < ArrayMaxSize. Otherwise it returns a bitmap container.
func intersectBitmapRun(a, b *container) *container {
var output *container
if b.n < 4096 {
if b.n < ArrayMaxSize {
// output is array container
output = &container{}
for _, iv := range b.runs {
@ -1776,7 +1776,7 @@ func intersectBitmapRun(a, b *container) *container {
valast = vastart + 63
}
}
if output.n < 4096 {
if output.n < ArrayMaxSize {
output.bitmapToArray()
}
}
@ -1906,13 +1906,18 @@ func unionArrayRun(a, b *container) *container {
vb = b.runs[j]
}
if i < na && (j >= nb || va < vb.start) {
output.runAppendInterval(interval32{start: va, last: va})
output.n += output.runAppendInterval(interval32{start: va, last: va})
i++
} else {
output.runAppendInterval(vb)
output.n += output.runAppendInterval(vb)
j++
}
}
if output.n < ArrayMaxSize {
output.runToArray()
} else if len(output.runs) > RunMaxSize {
output.runToBitmap()
}
return output
}
@ -1953,17 +1958,21 @@ func unionRunRun(a, b *container) *container {
vb = b.runs[j]
}
if i < na && (j >= nb || va.start < vb.start) {
output.runAppendInterval(va)
output.n += output.runAppendInterval(va)
i++
} else {
output.runAppendInterval(vb)
output.n += output.runAppendInterval(vb)
j++
}
}
if len(output.runs) > RunMaxSize {
output.runToBitmap()
}
return output
}
func unionBitmapRun(a, b *container) *container {
// TODO
return nil
}

View file

@ -44,7 +44,7 @@ func TestRunAppendInterval(t *testing.T) {
{
base: []interval32{{start: 20, last: 23}},
app: interval32{start: 19, last: 25},
exp: 3,
exp: 2, // runAppendInterval explicitly does not support intervals whose start is < c.runs[-1].start
},
}