func combineResults()

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
		}
	}
}