in banyand/tsdb/seriesdb.go [540:585]
func (s *seriesDB) filterSeries(ctx context.Context, path Path, filter index.Filter) (SeriesList, error) {
var seriesList SeriesList
var err error
if filter == nil {
return s.List(ctx, path)
}
var pl posting.List
if pl, err = filter.Execute(func(ruleType databasev1.IndexRule_Type) (index.Searcher, error) {
switch ruleType {
case databasev1.IndexRule_TYPE_TREE:
return s.lsmIndex, nil
case databasev1.IndexRule_TYPE_INVERTED:
return s.invertedIndex, nil
default:
return nil, errUnspecifiedIndexType
}
}, 0); err != nil {
return nil, err
}
if len(path.seekKey) == 0 {
iter := pl.Iterator()
defer func() {
err = multierr.Append(err, iter.Close())
}()
for iter.Next() {
var series Series
if series, err = s.GetByID(common.SeriesID(iter.Current())); err != nil {
return nil, err
}
seriesList = append(seriesList, series)
}
return seriesList, err
}
if seriesList, err = s.List(ctx, path); err != nil {
return nil, err
}
// Remove a series from seriesList if its ID is not in the pl
for i := 0; i < len(seriesList); i++ {
if !pl.Contains(uint64(seriesList[i].ID())) {
seriesList = append(seriesList[:i], seriesList[i+1:]...)
i--
}
}
return seriesList, nil
}