func()

in banyand/tsdb/seriesdb.go [483:538]


func (s *seriesDB) Search(ctx context.Context, path Path, filter index.Filter, order *OrderBy) (SeriesList, error) {
	if s.invertedIndex == nil || s.lsmIndex == nil {
		return nil, errors.New("search is not supported")
	}
	if path.isFull {
		return s.List(ctx, path)
	}
	if order == nil {
		return s.filterSeries(ctx, path, filter)
	}
	fieldKey := index.FieldKey{
		IndexRuleID: order.Index.GetMetadata().Id,
	}
	var iter index.FieldIterator
	var err error
	switch order.Index.Type {
	case databasev1.IndexRule_TYPE_TREE:
		iter, err = s.lsmIndex.Iterator(fieldKey, rangeOpts, order.Sort)
	case databasev1.IndexRule_TYPE_INVERTED:
		iter, err = s.invertedIndex.Iterator(fieldKey, rangeOpts, order.Sort)
	default:
		return nil, errUnspecifiedIndexType
	}
	if err != nil {
		return nil, err
	}
	defer func() {
		err = multierr.Append(err, iter.Close())
	}()
	var pl posting.List
	if pl, err = s.seriesFilter(ctx, path, filter); err != nil {
		return nil, err
	}
	seriesList := make([]Series, 0)
	for iter.Next() {
		pv := iter.Val().Value
		if err = pv.Intersect(pl); err != nil {
			return nil, err
		}
		if pv.IsEmpty() {
			continue
		}
		pIter := pv.Iterator()
		for pIter.Next() {
			var series Series
			if series, err = s.GetByID(common.SeriesID(pIter.Current())); err != nil {
				return nil, multierr.Append(err, pIter.Close())
			}
			seriesList = append(seriesList, series)
		}
		if err = pIter.Close(); err != nil {
			return nil, err
		}
	}
	return seriesList, err
}