in internal/search/search.go [197:242]
func combineResults(ctx context.Context, ch <-chan ZoektResponse, s *SearchRequest, cancel context.CancelFunc) *SearchResult {
combinedResult := &SearchResult{}
var totalFileCount int
var totalLineCount int
for {
select {
case resp, ok := <-ch:
if !ok {
return combinedResult
}
if resp.Error != nil {
combinedResult.Failures = append(combinedResult.Failures, SearchFailure{
Error: resp.Error.Error(),
Endpoint: resp.Endpoint,
})
continue
}
result := resp.Result
combinedResult.Result.FileCount += uint32(result.FileCount) // #nosec G115
combinedResult.Result.MatchCount += uint32(result.MatchCount) // #nosec G115
combinedResult.Result.NgramMatches += uint32(result.NgramMatches) // #nosec G115
for _, f := range result.Files {
lineCount := len(f.LineMatches)
totalLineCount += lineCount
totalFileCount++
combinedResult.Result.Files = append(combinedResult.Result.Files, f)
if (s.Options.MaxFileMatchWindow > 0 && totalFileCount >= int(s.Options.MaxFileMatchWindow)) ||
(s.Options.MaxLineMatchWindow > 0 && totalLineCount >= int(s.Options.MaxLineMatchWindow)) {
cancel()
return combinedResult
}
}
case <-ctx.Done():
combinedResult.TimedOut = true
return combinedResult
}
}
}