func()

in pkg/index/inverted/inverted.go [186:265]


func (s *store) Iterator(ctx context.Context, fieldKey index.FieldKey, termRange index.RangeOpts, order modelv1.Sort,
	preLoadSize int,
) (iter index.FieldIterator[*index.DocumentResult], err error) {
	if !termRange.IsEmpty() && !termRange.Valid() {
		return index.DummyFieldIterator, nil
	}
	if !s.closer.AddRunning() {
		return nil, nil
	}

	reader, err := s.writer.Reader()
	if err != nil {
		return nil, err
	}
	fk := fieldKey.Marshal()
	rangeQuery := bluge.NewBooleanQuery()
	rangeNode := newMustNode()

	rangeQuery = rangeQuery.AddMust(bluge.NewTermQuery(string(fieldKey.SeriesID.Marshal())).
		SetField(seriesIDField))
	rangeNode.Append(newTermNode(string(fieldKey.SeriesID.Marshal()), nil))
	if !termRange.IsEmpty() && termRange.Valid() {
		switch lower := termRange.Lower.(type) {
		case *index.BytesTermValue:
			upper := termRange.Upper.(*index.BytesTermValue)
			rangeQuery.AddMust(bluge.NewTermRangeInclusiveQuery(
				string(lower.Value),
				string(upper.Value),
				termRange.IncludesLower,
				termRange.IncludesUpper,
			).
				SetField(fk))
			rangeNode.Append(newTermRangeInclusiveNode(
				string(lower.Value),
				string(upper.Value),
				termRange.IncludesLower,
				termRange.IncludesUpper, nil,
				false,
			))

		case *index.FloatTermValue:
			upper := termRange.Upper.(*index.FloatTermValue)
			rangeQuery.AddMust(bluge.NewNumericRangeInclusiveQuery(
				lower.Value,
				upper.Value,
				termRange.IncludesLower,
				termRange.IncludesUpper,
			).
				SetField(fk))
			rangeNode.Append(newTermRangeInclusiveNode(
				strconv.FormatFloat(lower.Value, 'f', -1, 64),
				strconv.FormatFloat(upper.Value, 'f', -1, 64),
				termRange.IncludesLower,
				termRange.IncludesUpper,
				nil,
				false,
			))
		default:
			logger.Panicf("unexpected field type: %T", lower)
		}
	}
	if n := appendTimeRangeToQuery(rangeQuery, fieldKey); n != nil {
		rangeNode.Append(n)
	}

	sortedKey := fk
	if order == modelv1.Sort_SORT_DESC {
		sortedKey = "-" + sortedKey
	}
	result := &sortIterator{
		query:       &queryNode{rangeQuery, rangeNode},
		reader:      reader,
		sortedKey:   sortedKey,
		size:        preLoadSize,
		closer:      s.closer,
		ctx:         ctx,
		newIterator: newBlugeMatchIterator,
	}
	return result, nil
}