in arrow/compute/internal/kernels/vector_selection.go [267:395]
func primitiveFilterImpl(wr writeFiltered, values *exec.ArraySpan, filter *exec.ArraySpan, nullSelection NullSelectionBehavior, out *exec.ExecResult) {
var (
valuesIsValid = values.Buffers[0].Buf
filterIsValid = filter.Buffers[0].Buf
filterData = filter.Buffers[1].Buf
outIsValid = out.Buffers[0].Buf
)
if filter.Nulls == 0 && values.Nulls == 0 {
// fast filter path when values and filters have no nulls
bitutils.VisitSetBitRuns(filterData, filter.Offset, values.Len,
func(pos, length int64) error {
wr.WriteValueSegment(pos, length)
return nil
})
return
}
var (
dropNulls = newDropNullCounter(filterIsValid, filterData, filter.Offset, values.Len)
dataCounter = bitutils.NewOptionalBitBlockCounter(valuesIsValid, values.Offset, values.Len)
filterValidCounter = bitutils.NewOptionalBitBlockCounter(filterIsValid, filter.Offset, values.Len)
writeNotNull = func(idx int64) {
bitutil.SetBit(outIsValid, int(out.Offset)+wr.OutPos())
wr.WriteValue(idx)
}
writeMaybeNull = func(idx int64) {
bitutil.SetBitTo(outIsValid, int(out.Offset)+wr.OutPos(),
bitutil.BitIsSet(valuesIsValid, int(values.Offset+idx)))
wr.WriteValue(idx)
}
inPos int64
)
for inPos < values.Len {
filterBlock := dropNulls.NextBlock()
filterValidBlock := filterValidCounter.NextWord()
dataBlock := dataCounter.NextWord()
switch {
case filterBlock.AllSet() && dataBlock.AllSet():
// faster path: all values in block are included and not null
bitutil.SetBitsTo(outIsValid, out.Offset+int64(wr.OutPos()), int64(filterBlock.Len), true)
wr.WriteValueSegment(inPos, int64(filterBlock.Len))
inPos += int64(filterBlock.Len)
case filterBlock.AllSet():
// faster: all values are selected, but some are null
// batch copy bits from values validity bitmap to output validity bitmap
bitutil.CopyBitmap(valuesIsValid, int(values.Offset+inPos), int(filterBlock.Len),
outIsValid, int(out.Offset)+wr.OutPos())
wr.WriteValueSegment(inPos, int64(filterBlock.Len))
inPos += int64(filterBlock.Len)
case filterBlock.NoneSet() && nullSelection == DropNulls:
// for this exceedingly common case in low-selectivity filters
// we can skip further analysis of the data and move onto the next block
inPos += int64(filterBlock.Len)
default:
// some filter values are false or null
if dataBlock.AllSet() {
// no values are null
if filterValidBlock.AllSet() {
// filter is non-null but some values are false
for i := 0; i < int(filterBlock.Len); i++ {
if bitutil.BitIsSet(filterData, int(filter.Offset+inPos)) {
writeNotNull(inPos)
}
inPos++
}
} else if nullSelection == DropNulls {
// if any values are selected, they ARE NOT null
for i := 0; i < int(filterBlock.Len); i++ {
if bitutil.BitIsSet(filterIsValid, int(filter.Offset+inPos)) &&
bitutil.BitIsSet(filterData, int(filter.Offset+inPos)) {
writeNotNull(inPos)
}
inPos++
}
} else { // nullselect == EmitNulls
// data values in this block are not null
for i := 0; i < int(filterBlock.Len); i++ {
isValid := bitutil.BitIsSet(filterIsValid, int(filter.Offset+inPos))
if isValid && bitutil.BitIsSet(filterData, int(filter.Offset+inPos)) {
// filter slot is non-null and set
writeNotNull(inPos)
} else if !isValid {
// filter slot is null, so we have a null in the output
bitutil.ClearBit(outIsValid, int(out.Offset)+wr.OutPos())
wr.WriteNull()
}
inPos++
}
}
} else { // !dataBlock.AllSet()
// some values are null
if filterValidBlock.AllSet() {
// filter is non-null but some values are false
for i := 0; i < int(filterBlock.Len); i++ {
if bitutil.BitIsSet(filterData, int(filter.Offset+inPos)) {
writeMaybeNull(inPos)
}
inPos++
}
} else if nullSelection == DropNulls {
// if any values are selected they ARE NOT null
for i := 0; i < int(filterBlock.Len); i++ {
if bitutil.BitIsSet(filterIsValid, int(filter.Offset+inPos)) && bitutil.BitIsSet(filterData, int(filter.Offset+inPos)) {
writeMaybeNull(inPos)
}
inPos++
}
} else { // nullselect == emitnulls
// Data values in this block are not null
for i := 0; i < int(filterBlock.Len); i++ {
isValid := bitutil.BitIsSet(filterIsValid, int(filter.Offset+inPos))
if isValid && bitutil.BitIsSet(filterData, int(filter.Offset+inPos)) {
// filter slot is non-null and set
writeMaybeNull(inPos)
} else if !isValid {
// filter slot is null, so we have a null in the output
bitutil.ClearBit(outIsValid, int(out.Offset)+wr.OutPos())
wr.WriteNull()
}
inPos++
}
}
}
}
}
}