WIP TopN accuracy

This commit is contained in:
Todd Gruben 2017-02-27 18:25:45 -06:00
parent fd800e130c
commit 3b309d0d51
2 changed files with 24 additions and 14 deletions

View file

@ -168,6 +168,7 @@ func (e *Executor) executeBitmapCallSlice(ctx context.Context, db string, c *pql
// requeries to retrieve the full counts for each of the top results.
func (e *Executor) executeTopN(ctx context.Context, db string, c *pql.Call, slices []uint64, opt *ExecOptions) ([]Pair, error) {
bitmapIDs, _ := c.Args["ids"].([]uint64)
n := c.Args["n"].(uint64)
// Execute original query.
pairs, err := e.executeTopNSlices(ctx, db, c, slices, opt)
@ -180,16 +181,21 @@ func (e *Executor) executeTopN(ctx context.Context, db string, c *pql.Call, slic
if len(pairs) == 0 || len(bitmapIDs) > 0 || opt.Remote {
return pairs, nil
}
// Only the original caller should refetch the full counts.
other := c.Clone()
other.Args["n"] = 0
//other.Args["n"] = 0
other.Args["n"] = len(bitmapIDs) * 2
ids := Pairs(pairs).Keys()
sort.Sort(uint64Slice(ids))
other.Args["ids"] = ids
return e.executeTopNSlices(ctx, db, other, slices, opt)
trimedlist, x := e.executeTopNSlices(ctx, db, other, slices, opt)
if x != nil {
return nil, x
}
trimedlist = trimedlist[0:n]
return trimedlist, nil
}
func (e *Executor) executeTopNSlices(ctx context.Context, db string, c *pql.Call, slices []uint64, opt *ExecOptions) ([]Pair, error) {
@ -896,6 +902,7 @@ func (e *Executor) mapper(ctx context.Context, ch chan mapResponse, nodes []*Nod
if n.Host == e.Host {
resp.result, resp.err = e.mapperLocal(ctx, nodeSlices, mapFn, reduceFn)
} else if !opt.Remote {
results, err := e.exec(ctx, n, db, &pql.Query{Calls: []*pql.Call{c}}, nodeSlices, opt)
if len(results) > 0 {
resp.result = results[0]

View file

@ -553,9 +553,9 @@ func (f *Fragment) Top(opt TopOptions) ([]Pair, error) {
//threshold := results[len(results)-1].Count
threshold := results.Pairs[0].Count
if threshold < MinThreshold {
break
}
//if threshold < MinThreshold {
//break
//}
// If the bitmap doesn't have enough bits set before the intersection
// then we can assume that any remaing bitmaps also have a count too low.
@ -593,21 +593,24 @@ func (f *Fragment) topBitmapPairs(bitmapIDs []uint64) []BitmapPair {
}
// Otherwise retrieve specific bitmaps.
pairs := make([]BitmapPair, len(bitmapIDs))
for i, bitmapID := range bitmapIDs {
pairs := make([]BitmapPair, 0, len(bitmapIDs))
for _, bitmapID := range bitmapIDs {
// Look up cache first, if available.
if n := f.cache.Get(bitmapID); n > 0 {
pairs[i] = BitmapPair{
pairs = append(pairs, BitmapPair{
ID: bitmapID,
Count: n,
}
})
continue
}
// Otherwise load from storage.
pairs[i] = BitmapPair{
ID: bitmapID,
Count: f.Bitmap(bitmapID).Count(),
bm := f.Bitmap(bitmapID)
if bm.Count() > 0 {
// Otherwise load from storage.
pairs = append(pairs, BitmapPair{
ID: bitmapID,
Count: bm.Count(),
})
}
}
sort.Sort(BitmapPairs(pairs))