in analysis/app/compare.go [251:299]
func (a *App) fetchCompareResults(ctx context.Context, q string) ([]*resultGroup, error) {
// Parse query
prefix, queries := parseQueryString(q)
// Send requests
// TODO(quentin): Issue requests in parallel?
var groups []*resultGroup
var found int
for _, qPart := range queries {
keys := queryKeys(qPart)
group := &resultGroup{Q: qPart}
if prefix != "" {
qPart = prefix + " " + qPart
}
res := a.StorageClient.Query(ctx, qPart)
for res.Next() {
result := res.Result()
result.Content = elideKeyValues(result.Content, keys)
group.add(result)
found++
}
err := res.Err()
res.Close()
if err != nil {
// TODO: If the query is invalid, surface that to the user.
return nil, err
}
groups = append(groups, group)
}
if found == 0 {
return nil, errors.New("no results matched the query string")
}
// Attempt to automatically split results.
if len(groups) == 1 {
group := groups[0]
// Matching a single CL -> split by filename
switch {
case len(group.LabelValues["cl"]) == 1 && len(group.LabelValues["ps"]) == 1 && len(group.LabelValues["upload-file"]) > 1:
groups = group.splitOn("upload-file")
// Matching a single upload with multiple files -> split by file
case len(group.LabelValues["upload"]) == 1 && len(group.LabelValues["upload-part"]) > 1:
groups = group.splitOn("upload-part")
}
}
return groups, nil
}