analysis/app: parse prefix separately

Change-Id: I185b853a2580ee16741cbf1581ba465400a5b28b
Reviewed-on: https://go-review.googlesource.com/35947
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/analysis/app/compare.go b/analysis/app/compare.go
index 9127879..21a89ea 100644
--- a/analysis/app/compare.go
+++ b/analysis/app/compare.go
@@ -167,7 +167,7 @@
 
 func (a *App) compareQuery(q string) *compareData {
 	// Parse query
-	queries := parseQueryString(q)
+	prefix, queries := parseQueryString(q)
 
 	// Send requests
 	// TODO(quentin): Issue requests in parallel?
@@ -175,6 +175,9 @@
 	var found int
 	for _, qPart := range queries {
 		group := &resultGroup{}
+		if prefix != "" {
+			qPart = prefix + " " + qPart
+		}
 		res := a.StorageClient.Query(qPart)
 		for res.Next() {
 			group.add(res.Result())
diff --git a/analysis/app/parse.go b/analysis/app/parse.go
index dab586c..0286a8f 100644
--- a/analysis/app/parse.go
+++ b/analysis/app/parse.go
@@ -8,11 +8,11 @@
 
 // parseQueryString splits a user-entered query into one or more storage server queries.
 // The supported query formats are:
-//     prefix | one vs two  - parsed as {"prefix one", "prefix two"}
-//     prefix one vs two    - parsed as {"prefix one", "two"}
-//     anything else        - parsed as {"anything else"}
+//     prefix | one vs two  - parsed as "prefix", {"one", "two"}
+//     prefix one vs two    - parsed as "", {"prefix one", "two"}
+//     anything else        - parsed as "", {"anything else"}
 // The vs and | separators must not be quoted.
-func parseQueryString(q string) []string {
+func parseQueryString(q string) (string, []string) {
 	var queries []string
 	var parts []string
 	var prefix string
@@ -33,10 +33,10 @@
 		case c == ' ', c == '\t':
 			switch part := q[:r]; {
 			case part == "|" && prefix == "":
-				prefix = strings.Join(parts, " ") + " "
+				prefix = strings.Join(parts, " ")
 				parts = nil
 			case part == "vs":
-				queries = append(queries, prefix+strings.Join(parts, " "))
+				queries = append(queries, strings.Join(parts, " "))
 				parts = nil
 			default:
 				parts = append(parts, part)
@@ -54,7 +54,7 @@
 		parts = append(parts, q)
 	}
 	if len(parts) > 0 {
-		queries = append(queries, prefix+strings.Join(parts, " "))
+		queries = append(queries, strings.Join(parts, " "))
 	}
-	return queries
+	return prefix, queries
 }
diff --git a/analysis/app/parse_test.go b/analysis/app/parse_test.go
index 3a892a8..0a4793a 100644
--- a/analysis/app/parse_test.go
+++ b/analysis/app/parse_test.go
@@ -11,20 +11,24 @@
 
 func TestParseQueryString(t *testing.T) {
 	tests := []struct {
-		q    string
-		want []string
+		q          string
+		wantPrefix string
+		wantParts  []string
 	}{
-		{"prefix | one vs two", []string{"prefix one", "prefix two"}},
-		{"prefix one vs two", []string{"prefix one", "two"}},
-		{"anything else", []string{"anything else"}},
-		{`one vs "two vs three"`, []string{"one", `"two vs three"`}},
-		{"mixed\ttabs \"and\tspaces\"", []string{"mixed tabs \"and\tspaces\""}},
+		{"prefix | one vs two", "prefix", []string{"one", "two"}},
+		{"prefix one vs two", "", []string{"prefix one", "two"}},
+		{"anything else", "", []string{"anything else"}},
+		{`one vs "two vs three"`, "", []string{"one", `"two vs three"`}},
+		{"mixed\ttabs \"and\tspaces\"", "", []string{"mixed tabs \"and\tspaces\""}},
 	}
 	for _, test := range tests {
 		t.Run(test.q, func(t *testing.T) {
-			have := parseQueryString(test.q)
-			if !reflect.DeepEqual(have, test.want) {
-				t.Fatalf("parseQueryString = %#v, want %#v", have, test.want)
+			havePrefix, haveParts := parseQueryString(test.q)
+			if havePrefix != test.wantPrefix {
+				t.Errorf("parseQueryString returned prefix %q, want %q", havePrefix, test.wantPrefix)
+			}
+			if !reflect.DeepEqual(haveParts, test.wantParts) {
+				t.Errorf("parseQueryString returned parts %#v, want %#v", haveParts, test.wantParts)
 			}
 		})
 	}