| 27 | } |
| 28 | |
| 29 | func (c *conditional) eval(vecs ...vector.Any) vector.Any { |
| 30 | predVec, thisVec := vecs[0], vecs[1] |
| 31 | switch predVec.Kind() { |
| 32 | case vector.KindBool: |
| 33 | case vector.KindNull: |
| 34 | return c.elseExpr.Eval(thisVec) |
| 35 | case vector.KindError: |
| 36 | return predVec |
| 37 | default: |
| 38 | return vector.NewWrappedError(c.sctx, "?-operator: bool predicate required", predVec) |
| 39 | } |
| 40 | var elseIndex []uint32 |
| 41 | switch predVec := vector.Under(predVec).(type) { |
| 42 | case *vector.Const: |
| 43 | if vector.BoolValue(predVec, 0) { |
| 44 | return c.thenExpr.Eval(thisVec) |
| 45 | } |
| 46 | return c.elseExpr.Eval(thisVec) |
| 47 | case *vector.Bool: |
| 48 | if predVec.IsZero() { |
| 49 | return c.elseExpr.Eval(thisVec) |
| 50 | } |
| 51 | for i := range predVec.Len() { |
| 52 | if !predVec.IsSet(i) { |
| 53 | elseIndex = append(elseIndex, i) |
| 54 | } |
| 55 | } |
| 56 | default: |
| 57 | for i := range predVec.Len() { |
| 58 | if !vector.BoolValue(predVec, i) { |
| 59 | elseIndex = append(elseIndex, i) |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | if len(elseIndex) == 0 { |
| 64 | return c.thenExpr.Eval(thisVec) |
| 65 | } |
| 66 | elseVec := c.elseExpr.Eval(thisVec) |
| 67 | if len(elseIndex) == int(elseVec.Len()) { |
| 68 | return elseVec |
| 69 | } |
| 70 | thenVec := c.thenExpr.Eval(thisVec) |
| 71 | return combine(thenVec, elseVec, elseIndex) |
| 72 | } |
| 73 | |
| 74 | func BoolMask(mask vector.Any) (*roaring.Bitmap, *roaring.Bitmap) { |
| 75 | bools := roaring.New() |