// func benchmarkLogOp(b *testing.B, bs adapters.Bitset, bsc adapters.Bitset, data []uint32) { // for i := 0; i < b.N; i++ { // bsc.Add(data[i]) // } // b.ResetTimer() // for i := 0; i < b.N; i++ { // bs.Add(data[i]) // bsc.Or(bs) // if !bs.Contains(data[i]) { // b.Error(errors.New("test error")) // } // bs.And(bsc) // if !bs.Contains(data[i]) { // b.Error(errors.New("test error")) // } // if bs.Error() != nil { // b.Error(bs.Error()) // } // } // } func benchmarkAddContainsRemove(b *testing.B, bs adapters.Bitset, data []uint32) { b.ResetTimer() for i := 0; i < b.N; i++ { bs.Add(data[i]) if !bs.Contains(data[i]) { b.Error(errors.New("test error")) } // bs.Remove(data[i]) // if bs.Contains(data[i]) { // b.Error(errors.New("test error")) // } // if bs.Error() != nil { // b.Error(bs.Error()) // } } }
func (p Predicate) evaluate(bi *bitmapIndex, bs adapters.Bitset) (bool, error) { // fmt.Println("eval:", p.op, p.terms) switch p.op { case opEQUALS, opIN: tagnum := make([]uint32, 0, 256) var ( i int ie bool ) for _, t := range p.terms { if ie, i = bi.searchTag(t); !ie { return false, errors.New("non existing Tag") } tagnum = append(tagnum, uint32(i)) } for _, i := range tagnum { if p.op == opEQUALS && !bs.Contains(i) { return false, nil } if p.op == opIN && bs.Contains(i) { return true, nil } } return (p.op == opEQUALS), nil case opOR: if p.a == nil || p.b == nil { return false, errPredicate } ia, err := p.a.evaluate(bi, bs) if err != nil { return false, err } ib, err := p.b.evaluate(bi, bs) if err != nil { return false, err } return ia || ib, nil case opAND: if p.a == nil || p.b == nil { return false, errPredicate } ia, err := p.a.evaluate(bi, bs) if err != nil { return false, err } if !ia { return ia, nil } ib, err := p.b.evaluate(bi, bs) if err != nil { return false, err } return ib, nil case opNOT: if p.b == nil { return false, errPredicate } ib, err := p.b.evaluate(bi, bs) if err != nil { return false, err } return !ib, nil } return false, nil }