Пример #1
0
// 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())
		// }
	}
}
Пример #2
0
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
}