in pkg/index/inverted/inverted_series.go [214:271]
func parseResult(dmi search.DocumentMatchIterator, loadedFields []index.FieldKey, limit int) ([]index.SeriesDocument, error) {
result := make([]index.SeriesDocument, 0, 10)
next, err := dmi.Next()
if err != nil {
return nil, errors.WithMessage(err, "iterate document match iterator")
}
fields := make([]string, 0, len(loadedFields))
for i := range loadedFields {
fields = append(fields, loadedFields[i].Marshal())
}
var hitNumber int
for err == nil && next != nil {
hitNumber = next.HitNumber
var doc index.SeriesDocument
if len(loadedFields) > 0 {
doc.Fields = make(map[string][]byte)
for i := range loadedFields {
doc.Fields[fields[i]] = nil
}
}
var errTime error
err = next.VisitStoredFields(func(field string, value []byte) bool {
switch field {
case docIDField:
doc.Key.EntityValues = value
case timestampField:
var ts time.Time
ts, errTime = bluge.DecodeDateTime(value)
if errTime != nil {
err = errTime
return false
}
doc.Timestamp = ts.UnixNano()
case versionField:
doc.Version = convert.BytesToInt64(value)
default:
if _, ok := doc.Fields[field]; ok {
doc.Fields[field] = bytes.Clone(value)
}
}
return true
})
if err = multierr.Combine(err, errTime); err != nil {
return nil, errors.WithMessagef(err, "visit stored fields, hit: %d", hitNumber)
}
if len(doc.Key.EntityValues) > 0 {
result = append(result, doc)
}
if limit > 0 && len(result) >= limit {
break
}
next, err = dmi.Next()
}
if err != nil {
return nil, errors.WithMessagef(err, "iterate document match iterator, hit: %d", hitNumber)
}
return result, nil
}