in banyand/tsdb/seriesdb.go [414:481]
func (s *seriesDB) List(ctx context.Context, path Path) (SeriesList, error) {
prefix := prepend(path.prefix, entityPrefix)
l := logger.FetchOrDefault(ctx, "series_database", s.l)
if path.isFull {
data, err := s.seriesMetadata.Get(prefix)
if err != nil && errors.Is(err, kv.ErrKeyNotFound) {
if e := l.Debug(); e.Enabled() {
e.Hex("path", path.prefix).Msg("doesn't get any series")
}
return dummySeriesList, nil
}
if err != nil {
return nil, err
}
seriesID, entityValue, err := decode(data)
if err != nil {
return nil, err
}
var series string
if e := l.Debug(); e.Enabled() {
series = entityValue.String()
e.Int("prefix_len", path.offset/8).
Str("series", series).
Uint64("series_id", uint64(seriesID)).
Msg("got a series with a full path")
}
// nolint: contextcheck
return []Series{newSeries(s.context(), seriesID, series, s)}, nil
}
result := make([]Series, 0)
var err error
errScan := s.seriesMetadata.Scan(prefix, prepend(path.seekKey, entityPrefix), kv.DefaultScanOpts, func(key []byte, getVal func() ([]byte, error)) error {
key = key[entityPrefixLen:]
comparableKey := make([]byte, len(key))
// avoid slice out of bound
if len(key) > len(path.mask) {
return nil
}
for i, b := range key {
comparableKey[i] = path.mask[i] & b
}
if bytes.Equal(path.template, comparableKey) {
data, errGetVal := getVal()
if errGetVal != nil {
err = multierr.Append(err, errGetVal)
return nil
}
seriesID, entityValue, errDecode := decode(data)
if errDecode != nil {
err = multierr.Append(err, errDecode)
return nil
}
series := entityValue.String()
if e := l.Debug(); e.Enabled() {
e.Int("prefix_len", path.offset/8).
Str("series", series).
Uint64("series_id", uint64(seriesID)).
Msg("match a series")
}
result = append(result, newSeries(s.context(), seriesID, series, s))
}
return nil
})
if errScan != nil {
return nil, errScan
}
return result, err
}