mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-07 00:55:55 +00:00
Merge pull request #1704 from molecula/bitmapRun281
improve bitmap testing (backport)
This commit is contained in:
commit
02f14f42ac
2 changed files with 100 additions and 12 deletions
|
|
@ -4520,7 +4520,7 @@ func intersectionCallbackArrayRun(a, b *Container, fn func(uint16)) {
|
|||
}
|
||||
|
||||
func intersectionCallbackRunRun(a, b *Container, fn func(uint16)) {
|
||||
statsHit("intersectionCount/RunRun")
|
||||
statsHit("intersectionCallback/RunRun")
|
||||
ra, rb := a.runs(), b.runs()
|
||||
na, nb := len(ra), len(rb)
|
||||
for i, j := 0, 0; i < na && j < nb; {
|
||||
|
|
@ -4560,14 +4560,14 @@ func intersectionCallbackRunRun(a, b *Container, fn func(uint16)) {
|
|||
}
|
||||
|
||||
func intersectionCallbackBitmapRun(a, b *Container, fn func(uint16)) {
|
||||
statsHit("intersectionCount/BitmapRun")
|
||||
statsHit("intersectionCallback/BitmapRun")
|
||||
for _, iv := range b.runs() {
|
||||
bitmapCallbackRange(a.bitmap(), int32(iv.Start), int32(iv.Last)+1, fn)
|
||||
}
|
||||
}
|
||||
|
||||
func intersectionCallbackArrayBitmap(a, b *Container, fn func(uint16)) {
|
||||
statsHit("intersectionCount/ArrayBitmap")
|
||||
statsHit("intersectionCallback/ArrayBitmap")
|
||||
bitmap := b.bitmap()
|
||||
ln := len(bitmap)
|
||||
for _, val := range a.array() {
|
||||
|
|
@ -4583,7 +4583,7 @@ func intersectionCallbackArrayBitmap(a, b *Container, fn func(uint16)) {
|
|||
}
|
||||
|
||||
func intersectionCallbackBitmapBitmap(a, b *Container, fn func(uint16)) {
|
||||
statsHit("intersectionCount/BitmapBitmap")
|
||||
statsHit("intersectionCallback/BitmapBitmap")
|
||||
ab, bb := a.bitmap(), b.bitmap()
|
||||
for i := range ab {
|
||||
w := ab[i] & bb[i]
|
||||
|
|
|
|||
|
|
@ -4637,14 +4637,102 @@ func TestContainer_unionInPlace_ArrayUnionRun(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestIntersectionCallback(t *testing.T) {
|
||||
var hits []uint16
|
||||
cb := func(u uint16) {
|
||||
hits = append(hits, u)
|
||||
func TestContainerCallback(t *testing.T) {
|
||||
containers, err := InitContainerArchetypes()
|
||||
if err != nil {
|
||||
t.Fatalf("creating containers: %v", err)
|
||||
}
|
||||
bm := []uint64{0, 5, 0}
|
||||
bitmapCallbackRange(bm, 64, 69, cb)
|
||||
if len(hits) != 2 || hits[0] != 64 || hits[1] != 66 {
|
||||
t.Fatalf("expected 64, 66, got %d", hits)
|
||||
got := make([]uint16, 65536)
|
||||
hit := func(u uint16) {
|
||||
got = append(got, u)
|
||||
}
|
||||
var expected []uint16
|
||||
// complain() wraps up some pretty-printing logic for this,
|
||||
// but note also the closure trapping expected/got so we can
|
||||
// just refer to them without passing them in.
|
||||
complain := func(t *testing.T, msg string, args ...interface{}) {
|
||||
l1 := len(expected)
|
||||
l2 := len(got)
|
||||
dotdot1 := ""
|
||||
dotdot2 := ""
|
||||
if l1 > 8 {
|
||||
expected = expected[:8]
|
||||
dotdot1 = "..."
|
||||
}
|
||||
if l2 > 8 {
|
||||
got = got[:8]
|
||||
dotdot2 = "..."
|
||||
}
|
||||
t.Fatalf("%s: expected %d%s, got %d%s", fmt.Sprintf(msg, args...), expected, dotdot1, got, dotdot2)
|
||||
}
|
||||
for t1, ci := range containers {
|
||||
t.Run(ContainerArchetypeNames[t1], func(t *testing.T) {
|
||||
for _, c1 := range ci {
|
||||
got = got[:0]
|
||||
expected = c1.Slice()
|
||||
containerCallback(c1, hit)
|
||||
if len(got) != len(expected) {
|
||||
complain(t, "wrong length (%d vs %d)", len(expected), len(got))
|
||||
}
|
||||
for i := range got {
|
||||
if got[i] != expected[i] {
|
||||
complain(t, "element %d differs: expected %d, got %d", i, expected[i], got[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntersectionCallback(t *testing.T) {
|
||||
containers, err := InitContainerArchetypes()
|
||||
if err != nil {
|
||||
t.Fatalf("creating containers: %v", err)
|
||||
}
|
||||
got := make([]uint16, 65536)
|
||||
hit := func(u uint16) {
|
||||
got = append(got, u)
|
||||
}
|
||||
var expected []uint16
|
||||
// complain() wraps up some pretty-printing logic for this,
|
||||
// but note also the closure trapping expected/got so we can
|
||||
// just refer to them without passing them in.
|
||||
complain := func(t *testing.T, msg string, args ...interface{}) {
|
||||
l1 := len(expected)
|
||||
l2 := len(got)
|
||||
dotdot1 := ""
|
||||
dotdot2 := ""
|
||||
if l1 > 8 {
|
||||
expected = expected[:8]
|
||||
dotdot1 = "..."
|
||||
}
|
||||
if l2 > 8 {
|
||||
got = got[:8]
|
||||
dotdot2 = "..."
|
||||
}
|
||||
t.Fatalf("%s: expected %d%s, got %d%s", fmt.Sprintf(msg, args...), expected, dotdot1, got, dotdot2)
|
||||
}
|
||||
for t1, ci := range containers {
|
||||
for t2, cj := range containers {
|
||||
t.Run(fmt.Sprintf("%s-%s", ContainerArchetypeNames[t1], ContainerArchetypeNames[t2]), func(t *testing.T) {
|
||||
for _, c1 := range ci {
|
||||
for _, c2 := range cj {
|
||||
got = got[:0]
|
||||
expectedContainer := intersect(c1, c2)
|
||||
expected = expectedContainer.Slice()
|
||||
intersectionCallback(c1, c2, hit)
|
||||
if len(got) != len(expected) {
|
||||
complain(t, "wrong length (%d vs %d)", len(expected), len(got))
|
||||
}
|
||||
for i := range got {
|
||||
if got[i] != expected[i] {
|
||||
complain(t, "element %d differs: expected %d, got %d", i, expected[i], got[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue