-
Notifications
You must be signed in to change notification settings - Fork 2
/
reqexclbulkscorer.go
70 lines (59 loc) · 1.42 KB
/
reqexclbulkscorer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package search
import (
"github.com/geange/lucene-go/core/types"
"github.com/geange/lucene-go/core/util"
"math"
)
var _ BulkScorer = &ReqExclBulkScorer{}
type ReqExclBulkScorer struct {
req BulkScorer
excl types.DocIdSetIterator
}
func newReqExclBulkScorer(req BulkScorer, excl types.DocIdSetIterator) *ReqExclBulkScorer {
return &ReqExclBulkScorer{
req: req,
excl: excl,
}
}
func (r *ReqExclBulkScorer) Score(collector LeafCollector, acceptDocs util.Bits) error {
if _, err := r.ScoreRange(collector, acceptDocs, 0, math.MaxInt32); err != nil {
return err
}
return nil
}
func (r *ReqExclBulkScorer) ScoreRange(collector LeafCollector, acceptDocs util.Bits, minDoc, maxDoc int) (int, error) {
upTo := minDoc
exclDoc := r.excl.DocID()
var err error
for upTo < maxDoc {
if exclDoc < upTo {
exclDoc, err = r.excl.Advance(upTo)
if err != nil {
return 0, err
}
}
if exclDoc == upTo {
// upTo is excluded so we can consider that we scored up to upTo+1
upTo += 1
exclDoc, err = r.excl.NextDoc()
if err != nil {
return 0, err
}
} else {
upTo, err = r.req.ScoreRange(collector, acceptDocs, upTo, min(exclDoc, maxDoc))
if err != nil {
return 0, err
}
}
}
if upTo == maxDoc {
upTo, err = r.req.ScoreRange(collector, acceptDocs, upTo, upTo)
if err != nil {
return 0, err
}
}
return upTo, nil
}
func (r *ReqExclBulkScorer) Cost() int64 {
return r.req.Cost()
}