Skip to content

Commit d3bf873

Browse files
committed
improvement
1 parent bbd3c63 commit d3bf873

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

bitmapcontainer.go

+22-2
Original file line numberDiff line numberDiff line change
@@ -893,8 +893,28 @@ func (bc *bitmapContainer) iandNotArray(ac *arrayContainer) container {
893893
}
894894

895895
func (bc *bitmapContainer) iandNotRun16(rc *runContainer16) container {
896-
rcb := rc.toBitmapContainer()
897-
return bc.iandNotBitmapSurely(rcb)
896+
if rc.isEmpty() || bc.isEmpty() {
897+
// Nothing to do.
898+
return bc
899+
}
900+
901+
wordRangeStart := rc.iv[0].start / 64
902+
wordRangeEnd := (rc.iv[len(rc.iv)-1].last()) / 64 // inclusive
903+
904+
cardinalityChange := popcntSlice(bc.bitmap[wordRangeStart : wordRangeEnd+1]) // before cardinality - after cardinality (for word range)
905+
906+
for _, iv := range rc.iv {
907+
resetBitmapRange(bc.bitmap, int(iv.start), int(iv.last()+1))
908+
}
909+
910+
cardinalityChange -= popcntSlice(bc.bitmap[wordRangeStart : wordRangeEnd+1])
911+
912+
bc.cardinality -= int(cardinalityChange)
913+
914+
if bc.getCardinality() <= arrayDefaultMaxSize {
915+
return bc.toArrayContainer()
916+
}
917+
return bc
898918
}
899919

900920
func (bc *bitmapContainer) andNotArray(value2 *arrayContainer) container {

0 commit comments

Comments
 (0)