diff --git a/roaring/roaring.go b/roaring/roaring.go index 256fa8804..a34aec163 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -2124,6 +2124,7 @@ func intersectArrayBitmap(a, b *container) *container { output.array = append(output.array, va) } } + output.n = len(output.array) return output } @@ -2680,26 +2681,17 @@ func differenceRunRun(a, b *container) *container { func differenceArrayBitmap(a, b *container) *container { output := &container{container_type: ContainerArray} - itr := newBufBitmapIterator(newBitmapIterator(b.bitmap)) - for i := 0; i < len(a.array); { - va := a.array[i] - vb, eof := itr.next() - if eof { - output.add(va) - i++ - continue - } + for _, va := range a.array { + bmidx := va / 64 + bidx := va % 64 + mask := uint64(1) << bidx + b := b.bitmap[bmidx] - if va < vb { - output.add(va) - i++ - itr.unread() - } else if va > vb { - // nop - } else { - i++ + if mask&^b > 0 { + output.array = append(output.array, va) } } + output.n = len(output.array) return output } diff --git a/roaring/roaring_internal_test.go b/roaring/roaring_internal_test.go index 8af1cc987..aecbb9975 100644 --- a/roaring/roaring_internal_test.go +++ b/roaring/roaring_internal_test.go @@ -2498,7 +2498,6 @@ func TestIntersectArrayBitmap(t *testing.T) { b.container_type = ContainerBitmap ret1 := intersectArrayBitmapOld(a, b).array ret2 := intersectArrayBitmap(a, b).array - fmt.Println("ret1", ret1, "ret2", ret2, "test.exp", test.exp) if len(ret1) == 0 && len(ret2) == 0 && len(test.exp) == 0 { continue }