func()

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
}